基于glist自定义自己的链表数据结构

来源:互联网 发布:果园拆分系统源码 编辑:程序博客网 时间:2024/05/17 23:41

项目中经常会需要将service产生的数据结构提供给调用方。

但是数据结构又不想暴露出去,因此要将需要用到的数据结构的处理都封装为API,提供给调用方。

 

=======================================================================/* Define EXPORT_API */#ifndef EXPORT_API#define EXPORT_API __attribute__((visibility("default")))#endifEXPORT_APIint test_record_create(test_record_h *record){IFRET_VM(NULL == record, -1, "record is NULL");test_record *data = calloc(1, sizeof(test_record));IFRET_VM(NULL == data, -1, "calloc() Fail");data->date = NULL;data->key = NULL;data->value = NULL;*record = (test_record_h)data;return 0;}EXPORT_APIint test_record_destroy(test_record_h record){test_record *data = (test_record *)record;IFRET_VM(NULL == data, -1, "data is NULL");g_free(data->key);data->key = NULL;g_free(data->value);data->value = NULL;g_free(data->date);data->date = NULL;g_free(data);return 0;}EXPORT_APIint test_list_create(test_list_h *record_list){test_list *list_s = NULL;IFRET_VM(NULL == record_list, -1, "record_list is NULL");*record_list = NULL;list_s = calloc(1, sizeof(test_list));IFRET_VM(NULL == list_s, -1, "calloc() Fail");*record_list = (test_list_h)list_s;return 0;}EXPORT_APIint test_list_destroy(test_list_h record_list){test_list *s_list = NULL;GList *cursor = NULL;IFRET_VM(NULL == record_list, -1, "record_list is NULL");s_list = (test_list*)record_list;for (cursor = s_list->records; cursor; cursor = cursor->next)test_record_destroy((test_record_h)(cursor->data));g_list_free(s_list->records);g_free(s_list);return 0;}EXPORT_APIint test_record_set_key(test_record_h record, const char *key){test_record *data = (test_record *)record;IFRET_VM(NULL == data, -1, "data is NULL");IFRET_VM(NULL == key, -1, "key is NULL");data->key = g_strdup(key);return 0;}EXPORT_APIint test_record_get_key(test_record_h record, char **key){test_error_e 0 = 0;test_record *data = (test_record *)record;IFRET_VM(NULL == data, -1, "data is NULL");IFRET_VM(NULL == key, -1, "key is NULL");*key = data->key;return 0;}EXPORT_APIint test_list_add(test_list_h record_list, test_record_h record){test_list *s_list = NULL;test_record *s_record = NULL;IFRET_VM(NULL == record_list || NULL == record, -1, "record_list is NULL");s_list = (test_list*)record_list;s_record = (test_record*)record;s_list->records = g_list_append(s_list->records, s_record);if (s_list->count == 0) {s_list->cursor = s_list->records;}s_list->count++;return 0;}EXPORT_APIint test_list_remove(test_list_h record_list, test_record_h record){GList *cursor = NULL;test_list *s_list = NULL;test_record *s_record = NULL;IFRET_VM(NULL == record_list || NULL == record, -1, "record_list is NULL");s_list = (test_list*)record_list;s_record = (test_record*)record;for (cursor = s_list->records; cursor; cursor = cursor->next) {test_record *data = cursor->data;if (data == s_record) {s_list->count--;if (s_list->cursor == cursor) {s_list->cursor = cursor->next;}s_list->records = g_list_remove(s_list->records, s_record);return 0;}}return 0;}EXPORT_APIint test_list_get_record_count(test_list_h record_list, int *count){test_error_e 0 = 0;test_list *list_s = NULL;IFRET_VM(NULL == count, -1, "count  is NULL");*count = 0;IFRET_VM(NULL == record_list, -1, "record_list is NULL");list_s = (test_list*)record_list;*count = list_s->count;return 0;}EXPORT_APIint test_list_get_current_record(test_list_h record_list, test_record_h *record){test_error_e 0 = 0;test_list *list_s = NULL;IFRET_VM(NULL == record, -1, "record is NULL");*record = NULL;IFRET_VM(NULL == record_list || NULL == record, -1, "record_list is NULL");list_s = (test_list*)record_list;if (NULL == list_s->cursor) {*record = NULL;return -2;}*record = list_s->cursor->data;return 0;}EXPORT_APIint test_list_move_to_first(test_list_h record_list){test_error_e 0 = 0;test_list *list_s = NULL;IFRET_VM(NULL == record_list, -1, "record_list is NULL");list_s = (test_list*)record_list;list_s->cursor = list_s->records;if (NULL == list_s->cursor) {return -2;}return 0;}EXPORT_APIint test_list_move_to_last(test_list_h record_list){test_error_e 0 = 0;test_list *list_s;IFRET_VM(NULL == record_list, -1, "record_list is NULL");list_s = (test_list*)record_list;list_s->cursor = g_list_last(list_s->records);if (NULL == list_s->cursor) {return -2;}return 0;}static int __sc_list_move_cursor(test_list_h list, bool next){test_list *list_s;IFRET_VM(NULL == list, -1, "record_list is NULL");list_s = (test_list*)list;if (NULL == list_s->cursor)return -2;list_s->cursor = next ? list_s->cursor->next : list_s->cursor->prev ;if (NULL == list_s->cursor)return -2;return 0;}EXPORT_APIint test_list_move_to_next(test_list_h record_list){return __sc_list_move_cursor(record_list, true);}EXPORT_APIint test_list_move_to_prev(test_list_h record_list){return __sc_list_move_cursor(record_list, false);}


 

0 0
原创粉丝点击