📄 itersample.c
字号:
/* itersample.c --- demonstrate the usage of iterator */#include <stdlib.h>#include <stdio.h>#define STRV_NUMBER 5typedef struct _StringList{ char *str_array[STRV_NUMBER];} StringList;typedef struct _StringListIter StringListIter;typedef char* (*StringListIterGetStrFunc)(StringListIter* iter);typedef void (*StringListIterNextFunc)(StringListIter* iter);typedef int (*StringListIterIsDoneFunc)(StringListIter* iter);typedef struct _StringListIterInterface{ StringListIterGetStrFunc iter_get_str; StringListIterNextFunc iter_next; StringListIterIsDoneFunc iter_is_done;} StringListIterInterface;struct _StringListIter{ StringListIterInterface iface; StringList* str_list; int index;};typedef struct _StringListNormIter{ StringListIter parent;} StringListNormIter;typedef struct _StringListRevIter{ StringListIter parent;} StringListRevIter;static StringList static_string_list ={ .str_array = {"aaa", "bbb", "ccc", "ddd", "eee"}};StringList* string_list_new(void){ return &static_string_list;}static char* string_list_norm_iter_get_str (StringListIter* iter){ StringListNormIter* norm_iter; norm_iter = (StringListNormIter*)iter; return norm_iter->parent.str_list->str_array[iter->index];}static void string_list_norm_iter_next (StringListIter* iter){ StringListNormIter* norm_iter; norm_iter = (StringListNormIter*)iter; norm_iter->parent.index++;}static int string_list_norm_iter_is_done (StringListIter* iter){ StringListNormIter* norm_iter; norm_iter = (StringListNormIter*)iter; return norm_iter->parent.index >= STRV_NUMBER;}static char* string_list_rev_iter_get_str (StringListIter* iter){ StringListRevIter* rev_iter; rev_iter = (StringListRevIter*)iter; return rev_iter->parent.str_list->str_array[iter->index];}static void string_list_rev_iter_next (StringListIter* iter){ StringListRevIter* rev_iter; rev_iter = (StringListRevIter*)iter; rev_iter->parent.index--;}static int string_list_rev_iter_is_done (StringListIter* iter){ StringListRevIter* rev_iter; rev_iter = (StringListRevIter*)iter; return rev_iter->parent.index < 0;}char* string_list_iter_get_str (StringListIter* iter){ return iter->iface.iter_get_str (iter);}void string_list_iter_next (StringListIter* iter){ iter->iface.iter_next (iter);}int string_list_iter_is_done (StringListIter* iter){ return iter->iface.iter_is_done (iter);}StringListNormIter* string_list_get_norm_iter (StringList* list){ StringListNormIter* iter; iter = (StringListNormIter*) malloc (sizeof (StringListNormIter)); iter->parent.str_list = list; iter->parent.index = 0; iter->parent.iface.iter_get_str = string_list_norm_iter_get_str; iter->parent.iface.iter_next = string_list_norm_iter_next; iter->parent.iface.iter_is_done = string_list_norm_iter_is_done; return iter;}StringListRevIter* string_list_get_rev_iter (StringList* list){ StringListRevIter* riter; riter = (StringListRevIter*) malloc (sizeof (StringListRevIter)); riter->parent.str_list = list; riter->parent.index = STRV_NUMBER - 1; riter->parent.iface.iter_get_str = string_list_rev_iter_get_str; riter->parent.iface.iter_next = string_list_rev_iter_next; riter->parent.iface.iter_is_done = string_list_rev_iter_is_done; return riter;}static void list_all_string (StringListIter* iter){ for (; !string_list_iter_is_done (iter); string_list_iter_next (iter)) { printf ("%s\n", string_list_iter_get_str (iter)); }}int main (int argc, char **argv){ StringList* str_list; StringListNormIter* iter; StringListRevIter* riter; str_list = string_list_new (); printf ("Print all string:\n"); iter = string_list_get_norm_iter (str_list); list_all_string ((StringListIter*)iter); printf ("\nReverse print all string:\n"); riter = string_list_get_rev_iter (str_list); list_all_string ((StringListIter*)riter);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -