40 return iter->elem_handle; |
40 return iter->elem_handle; |
41 } |
41 } |
42 |
42 |
43 static void cx_iter_next_fast(void *it) { |
43 static void cx_iter_next_fast(void *it) { |
44 struct cx_iterator_s *iter = it; |
44 struct cx_iterator_s *iter = it; |
45 if (iter->remove) { |
45 if (iter->base.remove) { |
46 iter->remove = false; |
46 iter->base.remove = false; |
47 iter->elem_count--; |
47 iter->elem_count--; |
48 // only move the last element when we are not currently aiming |
48 // only move the last element when we are not currently aiming |
49 // at the last element already |
49 // at the last element already |
50 if (iter->index < iter->elem_count) { |
50 if (iter->index < iter->elem_count) { |
51 void *last = ((char *) iter->src_handle.m) |
51 void *last = ((char *) iter->src_handle.m) |
58 } |
58 } |
59 } |
59 } |
60 |
60 |
61 static void cx_iter_next_slow(void *it) { |
61 static void cx_iter_next_slow(void *it) { |
62 struct cx_iterator_s *iter = it; |
62 struct cx_iterator_s *iter = it; |
63 if (iter->remove) { |
63 if (iter->base.remove) { |
64 iter->remove = false; |
64 iter->base.remove = false; |
65 iter->elem_count--; |
65 iter->elem_count--; |
66 |
66 |
67 // number of elements to move |
67 // number of elements to move |
68 size_t remaining = iter->elem_count - iter->index; |
68 size_t remaining = iter->elem_count - iter->index; |
69 if (remaining > 0) { |
69 if (remaining > 0) { |
90 iter.index = 0; |
90 iter.index = 0; |
91 iter.src_handle.m = array; |
91 iter.src_handle.m = array; |
92 iter.elem_handle = array; |
92 iter.elem_handle = array; |
93 iter.elem_size = elem_size; |
93 iter.elem_size = elem_size; |
94 iter.elem_count = array == NULL ? 0 : elem_count; |
94 iter.elem_count = array == NULL ? 0 : elem_count; |
95 iter.valid = cx_iter_valid; |
95 iter.base.valid = cx_iter_valid; |
96 iter.current = cx_iter_current; |
96 iter.base.current = cx_iter_current; |
97 iter.next = remove_keeps_order ? cx_iter_next_slow : cx_iter_next_fast; |
97 iter.base.next = remove_keeps_order ? cx_iter_next_slow : cx_iter_next_fast; |
98 iter.remove = false; |
98 iter.base.remove = false; |
99 iter.mutating = true; |
99 iter.base.mutating = true; |
100 |
100 |
101 return iter; |
101 return iter; |
102 } |
102 } |
103 |
103 |
104 CxIterator cxIterator( |
104 CxIterator cxIterator( |
105 void const *array, |
105 void const *array, |
106 size_t elem_size, |
106 size_t elem_size, |
107 size_t elem_count |
107 size_t elem_count |
108 ) { |
108 ) { |
109 CxIterator iter = cxMutIterator((void*)array, elem_size, elem_count, false); |
109 CxIterator iter = cxMutIterator((void*)array, elem_size, elem_count, false); |
110 iter.mutating = false; |
110 iter.base.mutating = false; |
111 return iter; |
111 return iter; |
112 } |
112 } |