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 } |