src/iterator.c

changeset 1429
6e0c3a8a914a
parent 1070
0a5a356a4486
equal deleted inserted replaced
1428:0ac4aa1737fd 1429:6e0c3a8a914a
51 iter->base.remove = false; 51 iter->base.remove = false;
52 iter->elem_count--; 52 iter->elem_count--;
53 // only move the last element when we are not currently aiming 53 // only move the last element when we are not currently aiming
54 // at the last element already 54 // at the last element already
55 if (iter->index < iter->elem_count) { 55 if (iter->index < iter->elem_count) {
56 void *last = ((char *) iter->src_handle.m) 56 void *last = ((char *) iter->src_handle)
57 + iter->elem_count * iter->elem_size; 57 + iter->elem_count * iter->elem_size;
58 memcpy(iter->elem_handle, last, iter->elem_size); 58 memcpy(iter->elem_handle, last, iter->elem_size);
59 } 59 }
60 } else { 60 } else {
61 iter->index++; 61 iter->index++;
82 iter->index++; 82 iter->index++;
83 iter->elem_handle = ((char *) iter->elem_handle) + iter->elem_size; 83 iter->elem_handle = ((char *) iter->elem_handle) + iter->elem_size;
84 } 84 }
85 } 85 }
86 86
87 CxIterator cxMutIterator( 87 CxIterator cxIterator(
88 void *array, 88 const void *array,
89 size_t elem_size, 89 size_t elem_size,
90 size_t elem_count, 90 size_t elem_count,
91 bool remove_keeps_order 91 bool remove_keeps_order
92 ) { 92 ) {
93 CxIterator iter; 93 CxIterator iter;
94 94
95 iter.index = 0; 95 iter.index = 0;
96 iter.src_handle.m = array; 96 iter.src_handle = (void*) array;
97 iter.elem_handle = array; 97 iter.elem_handle = (void*) array;
98 iter.elem_size = elem_size; 98 iter.elem_size = elem_size;
99 iter.elem_count = array == NULL ? 0 : elem_count; 99 iter.elem_count = array == NULL ? 0 : elem_count;
100 iter.base.valid = cx_iter_valid; 100 iter.base.valid = cx_iter_valid;
101 iter.base.current = cx_iter_current; 101 iter.base.current = cx_iter_current;
102 iter.base.next = remove_keeps_order ? cx_iter_next_slow : cx_iter_next_fast; 102 iter.base.next = remove_keeps_order ? cx_iter_next_slow : cx_iter_next_fast;
103 iter.base.remove = false; 103 iter.base.remove = false;
104 iter.base.mutating = true; 104 iter.base.allow_remove = true;
105 105
106 return iter;
107 }
108
109 CxIterator cxIterator(
110 const void *array,
111 size_t elem_size,
112 size_t elem_count
113 ) {
114 CxIterator iter = cxMutIterator((void*)array, elem_size, elem_count, false);
115 iter.base.mutating = false;
116 return iter;
117 }
118
119 CxIterator cxMutIteratorPtr(
120 void *array,
121 size_t elem_count,
122 bool remove_keeps_order
123 ) {
124 CxIterator iter = cxMutIterator(array, sizeof(void*), elem_count, remove_keeps_order);
125 iter.base.current = cx_iter_current_ptr;
126 return iter; 106 return iter;
127 } 107 }
128 108
129 CxIterator cxIteratorPtr( 109 CxIterator cxIteratorPtr(
130 const void *array, 110 const void *array,
131 size_t elem_count 111 size_t elem_count,
112 bool remove_keeps_order
132 ) { 113 ) {
133 CxIterator iter = cxMutIteratorPtr((void*) array, elem_count, false); 114 CxIterator iter = cxIterator(array, sizeof(void*), elem_count, remove_keeps_order);
134 iter.base.mutating = false; 115 iter.base.current = cx_iter_current_ptr;
135 return iter; 116 return iter;
136 } 117 }

mercurial