src/iterator.c

changeset 854
fe0d69d72bcd
parent 853
d4baf4dd55c3
equal deleted inserted replaced
853:d4baf4dd55c3 854:fe0d69d72bcd
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 }

mercurial