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