13 #ifndef _PASL_DATA_CHUNKEDSEQEXTRAS_H_
14 #define _PASL_DATA_CHUNKEDSEQEXTRAS_H_
26 template <
class Container,
class size_type>
28 using measured_type =
typename Container::middle_measured_type;
29 using algebra_type =
typename Container::middle_algebra_type;
30 using size_access =
typename Container::size_access;
32 c.check(); other.check();
33 size_type size_orig = c.size();
35 assert(i <= size_orig);
45 measured_type prefix = algebra_type::identity();
46 prefix = c.split_aux(p, prefix, other);
47 c.check(); other.check();
48 size_type size_cur = c.size();
49 size_type size_other = other.size();
50 assert(size_other + size_cur == size_orig);
51 assert(size_cur == i);
52 assert(size_other + i == size_orig);
53 assert(size_access::csize(prefix) == i);
56 template <
class Container,
class iterator>
58 using size_type =
typename Container::size_type;
59 if (position == c.end())
61 size_type n = position.size() - 1;
65 template <
class Container>
67 using size_type =
typename Container::size_type;
69 size_type mid = c.size() / 2;
76 template <
class Container,
class iterator,
class value_type>
78 using self_type = Container;
79 using size_type =
typename Container::size_type;
81 size_type n = position.size() - 1;
83 c.split(position, tmp);
90 template <
class Container,
class iterator>
91 iterator
erase(Container& c, iterator first, iterator last) {
92 using self_type = Container;
93 using size_type =
typename Container::size_type;
96 size_type sz_orig = c.size();
97 self_type items_to_erase;
98 size_type sz_first = first.size();
99 size_type sz_last = last.size();
100 size_type nb_to_erase = sz_last - sz_first;
101 c.split(first, items_to_erase);
103 items_to_erase.split(nb_to_erase, tmp);
104 items_to_erase.swap(tmp);
105 c.concat(items_to_erase);
106 assert(c.size() + nb_to_erase == sz_orig);
107 return c.begin() + sz_first;
113 template <
class Body,
class iterator>
115 using segment_type =
typename iterator::segment_type;
118 segment_type seg_end = end.get_segment();
119 for (iterator i = begin; i != end; ) {
120 segment_type seg = i.get_segment();
121 if (seg.begin == seg_end.begin)
122 seg.end = seg_end.middle;
123 f(seg.middle, seg.end);
124 i += seg.end - seg.middle;
128 template <
class Body,
class iterator>
129 void for_each(iterator beg, iterator end,
const Body& f) {
140 template <
class Container,
class Consumer,
class size_type>
141 void stream_backn(
const Container& c,
const Consumer& cons, size_type nb) {
142 using const_pointer =
typename Container::const_pointer;
143 assert(c.size() >= nb);
144 size_type nb_before_target = c.size() - nb;
145 c.for_each_segment(c.begin() + nb_before_target, c.end(), [&] (const_pointer lo, const_pointer hi) {
146 size_type nb_items_to_copy = size_type(hi - lo);
147 cons(lo, nb_items_to_copy);
151 template <
class Container,
class Consumer,
class size_type>
152 void stream_frontn(
const Container& c,
const Consumer& cons, size_type nb) {
153 using const_pointer =
typename Container::const_pointer;
154 assert(c.size() >= nb);
155 c.for_each_segment(c.begin(), c.begin() + nb, [&] (const_pointer lo, const_pointer hi) {
156 size_type nb = size_type(hi - lo);
161 template <
class Container,
class value_type,
class size_type>
164 using allocator_type =
typename Container::allocator_type;
166 auto cons = [&] (const_pointer lo, size_type nb) {
167 fixedcapacity::base::copy<allocator_type>(p, lo, nb);
170 c.stream_backn(cons, nb);
173 template <
class Container,
class value_type,
class size_type>
176 using allocator_type =
typename Container::allocator_type;
178 auto cons = [&] (const_pointer lo, size_type nb) {
179 fixedcapacity::base::copy<allocator_type>(p, lo, nb);
182 c.stream_frontn(cons, nb);
185 template <
class Container,
class const_po
inter,
class size_type>
186 void pushn_back(Container& c, const_pointer src, size_type nb) {
187 auto prod = [src] (size_type i, size_type nb) {
188 const_pointer lo = src + i;
189 const_pointer hi = lo + nb;
190 return std::make_pair(lo, hi);
192 c.stream_pushn_back(prod, nb);
195 template <
class Container,
class const_po
inter,
class size_type>
197 auto prod = [src] (size_type i, size_type nb) {
198 const_pointer lo = src + i;
199 const_pointer hi = lo + nb;
200 return std::make_pair(lo, hi);
202 c.stream_pushn_front(prod, nb);
205 template <
class Container,
class value_type,
class size_type>
208 using allocator_type =
typename Container::allocator_type;
210 auto cons = [&] (const_pointer lo, const_pointer hi) {
211 size_type d = hi - lo;
213 fixedcapacity::base::copy<allocator_type>(p, lo, d);
215 c.template stream_popn_back<typeof(cons), true>(cons, nb);
218 template <
class Container,
class value_type,
class size_type>
221 using allocator_type =
typename Container::allocator_type;
223 auto cons = [&] (const_pointer lo, const_pointer hi) {
224 size_type d = hi - lo;
225 fixedcapacity::base::copy<allocator_type>(p, lo, d);
228 c.template stream_popn_front<typeof(cons), true>(cons, nb);
234 template <
class Container>
237 using size_type =
typename Container::size_type;
238 size_type sz = seq.size();