4#include "collection_map_association.h"
5#include "collection_sort.h"
13 template <
typename ITERABLE,
typename ITYPE >
14 bool icontains(
const ITERABLE & iterable,
const ITYPE & t, index first = 0, ::collection::count count = -1);
16 template <
typename ITERABLE,
typename ITYPE >
17 bool contains(
const ITERABLE & iterable,
const ITYPE & t,
typename ITERABLE::const_iterator pos,
typename ITERABLE::const_iterator posLast =
nullptr, ::collection::count countMin = 0, ::collection::count countMax = -1);
19 template <
typename ITERABLE,
typename ITYPE >
20 bool contains(ITERABLE & iterable,
const ITYPE & t,
typename ITERABLE::iterator pos,
typename ITERABLE::iterator posLast =
nullptr, ::collection::count countMin = 0, ::collection::count countMax = -1);
22 template <
typename ITERABLE,
typename ITERABLE2 >
23 void copy(ITERABLE & iterable,
const ITERABLE2 & iterable2);
26 template <
typename ITERABLE,
typename ITYPE >
27 ITERABLE & add_lines(ITERABLE & iterable,
const ITYPE & str,
bool bAddEmpty =
true);
29 template <
typename ITERABLE,
typename ITYPE >
30 bool add_unique(ITERABLE & iterable,
const ITYPE & pcsz);
32 template <
typename ITERABLE,
typename ITYPE >
33 bool case_insensitive_add_unique(ITERABLE & iterable,
const ITYPE & pcsz);
35 template <
typename ITERABLE,
typename ITERABLE2,
typename ITYPE >
36 typename ::collection::count add_unique_iter(ITERABLE & iterable,
const ITERABLE & stra);
38 template <
typename ITERABLE,
typename ITERABLE2,
typename ITYPE >
39 typename ::collection::count case_insensitive_add_unique_iter(ITERABLE & iterable,
const ITERABLE & stra);
41 template <
typename ITERABLE,
typename ITERABLE2 >
42 ITERABLE & add(ITERABLE & iterable,
const ITERABLE2 & iterable2);
44 template <
typename ITERABLE,
typename ITERABLE2 >
45 ITERABLE & copy_iter(ITERABLE & iterable,
const ITERABLE2 & iterable2);
47 template <
typename ITERABLE,
typename ITERABLE2 >
48 ITERABLE & insert_iter_at(ITERABLE & iterable,
typename ITERABLE::iterator nStartIndex,
const ITERABLE2 & iterable2);
50 template <
typename ITERABLE >
51 ::collection::count erase_empty(ITERABLE & iterable);
53 template <
typename ITERABLE,
typename ITYPE,
typename ITYPE2 >
54 ITERABLE & replace(ITERABLE & iterable,
const ITYPE & lpszSearch,
const ITYPE2 & lpszReplace);
57 template <
typename ITERABLE,
typename ITYPE,
typename ITERABLE2 >
58 bool case_insensitive_move(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator iIndex);
60 template <
typename ITERABLE >
61 ITERABLE & copy(ITERABLE & iterable, const ::payload payload);
63 template <
typename ITERABLE,
typename ITYPE,
typename ITERABLE2 >
64 ITERABLE & add_shortest_tokens(ITERABLE & iterable,
const ITYPE & pcsz,
const ITERABLE2 & iterableSeparator,
bool bAddEmpty =
true,
bool bWithSeparator =
false);
66 template <
typename ITERABLE,
typename ITERABLE2 >
67 ITERABLE2 & slice(ITERABLE & iterable, ITERABLE2 & iterable2,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last =
nullptr);
69 template <
typename ITERABLE,
typename ITERABLE2 >
70 ITERABLE2 & islice(ITERABLE & iterable, ITERABLE2 & iterable2, index first, ::collection::count count = -1);
72 template <
typename ITERABLE,
typename ITERABLE2 >
73 ITERABLE & add_iter(ITERABLE & iterable,
const ITERABLE2 & iterable2);
75 template <
typename ITERABLE,
typename ITERABLE2 >
76 ITERABLE diff(
const ITERABLE & iterable,
const ITERABLE2 & iterable2);
78 template <
typename ITERABLE,
typename ITERABLE2 >
79 ITERABLE sum(
const ITERABLE & iterable,
const ITERABLE2 & iterable2);
81 template <
typename ITERABLE >
82 void make_lower(ITERABLE & iterable);
84 template <
typename ITERABLE >
85 void make_upper(ITERABLE & iterable);
87 template <
typename ITERABLE >
88 void erase(ITERABLE & iterable,
typename ITERABLE::iterator
typename first =
nullptr,
typename ITERABLE::iterator
typename last =
nullptr);
90 template <
typename ITERABLE,
typename ITYPE,
typename ITYPE2 >
91 void implode(
const ITERABLE & iterable, ITYPE & rwstr,
const ITYPE2 & lpcszSeparator =
"",
typename ITERABLE::const_iterator iStart = 0,
typename ITERABLE::const_iterator iEnd =
nullptr);
93 template <
typename ITERABLE,
typename ITYPE,
typename ITYPE2 >
94 void reverse_implode(
const ITERABLE & iterable, ITYPE & rwstr,
const ITYPE & lpcszSeparator =
"",
typename ITERABLE::const_iterator iStart = 0,
typename ITERABLE::const_iterator iEnd =
nullptr);
96 template <
typename ITERABLE,
typename ITYPE,
typename ITYPE2,
typename ITYPE3 >
97 void implode_ex(
const ITERABLE & iterable, ITYPE & rwstr,
const ITYPE2 & lpcszSeparator =
"",
const ITYPE3 & lpcszLastSeparator =
nullptr,
typename ITERABLE::const_iterator iStart = 0,
typename ITERABLE::const_iterator iEnd =
nullptr);
99 template <
typename ITERABLE,
typename ITYPE >
100 void if_prefix_implode_ex(
const ITERABLE & iterable, ITYPE & rwstr,
const ITYPE & lpcszIfHasElementPrefix =
nullptr,
const ITYPE & lpcszSeparator =
nullptr,
const ITYPE & lpcszLastSeparator =
nullptr,
bool bUseLast =
true,
typename ITERABLE::iterator iStart = 0,
typename ITERABLE::const_iterator iEnd =
nullptr);
102 template <
typename ITERABLE,
typename ITERABLE2,
typename ITYPE >
103 void prefix(ITERABLE & iterable,
const ITERABLE2 & iterable2,
const ITYPE & pszPrefix,
typename ITERABLE2::const_iterator first =
nullptr,
typename ITERABLE2::const_iterator last =
nullptr);
105 template <
typename ITERABLE,
typename ITERABLE2,
typename ITYPE >
106 void suffix(ITERABLE & iterable,
const ITERABLE2 & iterable2,
const ITYPE & pszSuffix,
typename ITERABLE2::const_iterator first =
nullptr,
typename ITERABLE2::const_iterator last =
nullptr);
108 template <
typename ITERABLE,
typename ITERABLE2,
typename ITYPE,
typename ITYPE2 >
109 void surround(ITERABLE & iterable,
const ITERABLE2 & iterable2,
const ITYPE & pszPrefix =
"",
const ITYPE2 & pszSuffix =
"",
typename ITERABLE2::const_iterator first =
nullptr,
typename ITERABLE2::const_iterator last =
nullptr);
111 template <
typename ITERABLE,
typename ITYPE >
112 void prefix(ITERABLE & iterable,
const ITYPE & pszPrefix,
typename ITERABLE::iterator first =
nullptr,
typename ITERABLE::iterator last =
nullptr);
114 template <
typename ITERABLE,
typename ITYPE >
115 void suffix(ITERABLE & iterable,
const ITYPE & pszSuffix,
typename ITERABLE::iterator first =
nullptr,
typename ITERABLE::iterator last =
nullptr);
117 template <
typename ITERABLE,
typename ITYPE,
typename ITYPE2 >
118 void surround(ITERABLE & iterable,
const ITYPE & pszPrefix =
"",
const ITYPE2 & pszSuffix =
"",
typename ITERABLE::iterator first =
nullptr,
typename ITERABLE::iterator last =
nullptr);
120 template <
typename ITERABLE,
typename ITYPE,
typename ITYPE2,
typename ITYPE3,
typename ITYPE4 >
121 void surround_and_implode(
const ITERABLE & iterable, ITYPE & str,
const ITYPE2 & lpcszSeparator =
"",
const ITYPE3 & pszPrefix =
"",
const ITYPE4 & pszSuffix =
"",
typename ITERABLE::iterator first =
nullptr,
typename ITERABLE::iterator last =
nullptr);
126 template <
typename ITERABLE,
typename ITYPE >
127 ::collection::count explode_command_line(
const ITERABLE & iterable,
const ITYPE & str, char_pointer * argv =
nullptr);
129 template <
typename ITERABLE,
typename ITERABLE2 >
130 bool operator == (
const ITERABLE & iterable,
const ITERABLE & iterable2);
132 template <
typename ITERABLE,
typename ITERABLE2 >
133 bool operator != (
const ITERABLE & iterable,
const ITERABLE & iterable2);
135 template <
typename ITERABLE,
typename ITERABLE2 >
136 ::collection::count case_insensitive_erase_iter(ITERABLE & iterable,
const ITERABLE & iterableRemove);
138 template <
typename ITERABLE,
typename ITERABLE2 >
139 ::collection::count erase_iter(ITERABLE & iterable,
const ITERABLE2 & iterableRemove);
141 template <
typename ITERABLE,
typename ITYPE >
142 ITERABLE & trim_right(ITERABLE & iterable,
const ITYPE & pszChars);
144 template <
typename ITERABLE,
typename ITYPE >
145 ITERABLE & trim_left(ITERABLE & iterable,
const ITYPE & pszChars);
147 template <
typename ITERABLE,
typename ITYPE >
148 ITERABLE & trim(ITERABLE & iterable,
const ITYPE & pszChars);
150 template <
typename ITERABLE >
151 ITERABLE & trim_right(ITERABLE & iterable);
153 template <
typename ITERABLE >
154 ITERABLE & trim_left(ITERABLE & iterable);
156 template <
typename ITERABLE >
157 ITERABLE & trim(ITERABLE & iterable);
160 template <
typename ITERABLE,
typename ITYPE >
161 ITERABLE & preferred(ITERABLE & iterable,
const ITYPE & pcsz);
163 template <
typename ITERABLE,
typename ITERABLE2 >
164 ITERABLE & preferred_iter(ITERABLE & iterable,
const ITERABLE2 & iterable2);
166 template <
typename ITERABLE,
typename PRED >
167 bool predicate_erase_first(ITERABLE & iterable, PRED pred);
169 template <
typename ITERABLE,
typename PRED >
170 typename ITERABLE::const_iterator predicate_find_first(
const ITERABLE & iterable, PRED pred,
typename ITERABLE::const_iterator =
nullptr,
typename ITERABLE::const_iterator last =
nullptr);
172 template <
typename ITERABLE,
typename PRED >
173 typename ITERABLE::iterator predicate_find_first(ITERABLE & iterable, PRED pred,
typename ITERABLE::iterator =
nullptr,
typename ITERABLE::iterator last =
nullptr);
175 template <
typename ITERABLE,
typename ITYPE >
176 typename index case_insensitive_ifind_first(
const ITERABLE & iterable,
const ITYPE & pcsz, index first, ::collection::count count = -1);
178 template <
typename ITERABLE,
typename ITYPE >
179 typename index ifind_first_begins(
const ITERABLE & iterable,
const ITYPE & pcsz, ::collection::index find, ::collection::count count = -1);
181 template <
typename ITERABLE,
typename ITYPE >
182 typename index case_insensitive_ifind_first_begins(
const ITERABLE & iterable,
const ITYPE & pcsz, ::collection::index find = 0, ::collection::count count = -1);
184 template <
typename ITERABLE,
typename ITYPE >
185 typename ITERABLE::const_iterator case_insensitive_find_first(
const ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::const_iterator find =
nullptr,
typename ITERABLE::const_iterator last =
nullptr);
187 template <
typename ITERABLE,
typename ITYPE >
188 typename ITERABLE::const_iterator find_first(
const ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::const_iterator find =
nullptr,
typename ITERABLE::const_iterator last =
nullptr);
190 template <
typename ITERABLE,
typename ITYPE >
191 typename ITERABLE::const_iterator case_insensitive_find_last(
const ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::const_iterator find =
nullptr,
typename ITERABLE::const_iterator last =
nullptr);
193 template <
typename ITERABLE,
typename ITYPE >
194 typename ITERABLE::const_iterator find_last(
const ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::const_iterator find =
nullptr,
typename ITERABLE::const_iterator last =
nullptr);
196 template <
typename ITERABLE,
typename ITYPE >
197 typename ITERABLE::const_iterator case_insensitive_reverse_find(
const ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::const_iterator find = -1,
typename ITERABLE::const_iterator last = 0);
199 template <
typename ITERABLE,
typename ITYPE >
200 typename ITERABLE::const_iterator rear_find(
const ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::const_iterator find = -1,
typename ITERABLE::const_iterator last = 0);
202 template <
typename ITERABLE,
typename ITYPE >
203 typename ITERABLE::const_iterator any_suffixes(
const ITERABLE & iterable,
const ITYPE & lpcszIsSuffixed,
typename ITERABLE::const_iterator find =
nullptr,
typename ITERABLE::const_iterator last =
nullptr);
205 template <
typename ITERABLE,
typename ITYPE >
206 typename ITERABLE::const_iterator any_case_insensitive_suffixes(
const ITERABLE & iterable,
const ITYPE & lpcszIdSuffixed,
typename ITERABLE::const_iterator find =
nullptr,
typename ITERABLE::const_iterator last =
nullptr);
208 template <
typename ITERABLE,
typename ITYPE >
209 typename ITERABLE::const_iterator any_prefixes(
const ITERABLE & iterable,
const ITYPE & lpcszIsPrefixed,
typename ITERABLE::const_iterator find =
nullptr,
typename ITERABLE::const_iterator last =
nullptr);
211 template <
typename ITERABLE,
typename ITYPE >
212 typename ITERABLE::const_iterator case_insensitive_any_prefixes(
const ITERABLE & iterable,
const ITYPE & lpcszIsPrefixed,
typename ITERABLE::const_iterator find =
nullptr,
typename ITERABLE::const_iterator last =
nullptr);
214 template <
typename ITERABLE,
typename ITYPE >
215 typename ITERABLE::const_iterator find_first_ends(
const ITERABLE & iterable,
const ITYPE & lpcszSuffix,
typename ITERABLE::const_iterator find =
nullptr,
typename ITERABLE::const_iterator last =
nullptr);
217 template <
typename ITERABLE,
typename ITYPE >
218 typename ITERABLE::const_iterator case_insensitive_find_first_ends(
const ITERABLE & iterable,
const ITYPE & lpcszSuffix,
typename ITERABLE::const_iterator find =
nullptr,
typename ITERABLE::const_iterator last =
nullptr);
220 template <
typename ITERABLE,
typename ITYPE >
221 typename ITERABLE::const_iterator find_first_ends_eat(
const ITERABLE & iterable, ITYPE & str,
const ITYPE & pcsz,
typename ITERABLE::const_iterator find =
nullptr,
typename ITERABLE::const_iterator last =
nullptr);
223 template <
typename ITERABLE,
typename ITYPE >
224 typename ITERABLE::const_iterator case_insensitive_find_first_ends_eat(
const ITERABLE & iterable, ITYPE & str,
const ITYPE & pcsz,
typename ITERABLE::const_iterator find =
nullptr,
typename ITERABLE::const_iterator last =
nullptr);
226 template <
typename ITERABLE,
typename ITYPE >
227 typename ITERABLE::const_iterator find_first_begins(
const ITERABLE & iterable,
const ITYPE & lpcszPrefix,
typename ITERABLE::const_iterator find =
nullptr,
typename ITERABLE::const_iterator last =
nullptr);
229 template <
typename ITERABLE,
typename ITYPE >
230 typename ITERABLE::const_iterator case_insensitive_find_first_begins(
const ITERABLE & iterable,
const ITYPE & lpcszPrefix,
typename ITERABLE::const_iterator find = 0,
typename ITERABLE::const_iterator last =
nullptr);
232 template <
typename ITERABLE,
typename ITYPE >
233 typename ITERABLE::const_iterator find_first_begins_eat(
const ITERABLE & iterable, ITYPE & str,
const ITYPE & pcsz,
typename ITERABLE::const_iterator find = 0,
typename ITERABLE::const_iterator last =
nullptr);
235 template <
typename ITERABLE,
typename ITYPE >
236 typename ITERABLE::const_iterator case_insensitive_find_first_begins_eat(
const ITERABLE & iterable, ITYPE & str,
const ITYPE & pcsz,
typename ITERABLE::const_iterator find = 0,
typename ITERABLE::const_iterator last =
nullptr);
238 template <
typename ITERABLE,
typename ITYPE >
239 typename ITERABLE::iterator case_insensitive_find_first(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr);
241 template <
typename ITERABLE,
typename ITYPE >
242 typename ITERABLE::iterator find_first(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr);
244 template <
typename ITERABLE,
typename ITYPE >
245 typename ITERABLE::iterator case_insensitive_find_last(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr);
247 template <
typename ITERABLE,
typename ITYPE >
248 typename ITERABLE::iterator find_last(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr);
250 template <
typename ITERABLE,
typename ITYPE >
251 typename ITERABLE::iterator case_insensitive_reverse_find(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find = -1,
typename ITERABLE::iterator last = 0);
253 template <
typename ITERABLE,
typename ITYPE >
254 typename ITERABLE::iterator rear_find(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find = -1,
typename ITERABLE::iterator last = 0);
256 template <
typename ITERABLE,
typename ITYPE >
257 typename ITERABLE::iterator any_suffixes(ITERABLE & iterable,
const ITYPE & lpcszIsSuffixed,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr);
259 template <
typename ITERABLE,
typename ITYPE >
260 typename ITERABLE::iterator any_case_insensitive_suffixes(ITERABLE & iterable,
const ITYPE & lpcszIdSuffixed,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr);
262 template <
typename ITERABLE,
typename ITYPE >
263 typename ITERABLE::iterator any_prefixes(ITERABLE & iterable,
const ITYPE & lpcszIsPrefixed,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr);
265 template <
typename ITERABLE,
typename ITYPE >
266 typename ITERABLE::iterator case_insensitive_any_prefixes(ITERABLE & iterable,
const ITYPE & lpcszIsPrefixed,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr);
268 template <
typename ITERABLE,
typename ITYPE >
269 typename ITERABLE::iterator find_first_ends(ITERABLE & iterable,
const ITYPE & lpcszSuffix,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr);
271 template <
typename ITERABLE,
typename ITYPE >
272 typename ITERABLE::iterator case_insensitive_find_first_ends(ITERABLE & iterable,
const ITYPE & lpcszSuffix,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr);
274 template <
typename ITERABLE,
typename ITYPE >
275 typename ITERABLE::iterator find_first_ends_eat(ITERABLE & iterable, ITYPE & str,
const ITYPE & pcsz,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr);
277 template <
typename ITERABLE,
typename ITYPE >
278 typename ITERABLE::iterator case_insensitive_find_first_ends_eat(ITERABLE & iterable, ITYPE & str,
const ITYPE & pcsz,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr);
280 template <
typename ITERABLE,
typename ITYPE >
281 typename ITERABLE::iterator find_first_begins(ITERABLE & iterable,
const ITYPE & lpcszPrefix,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr);
283 template <
typename ITERABLE,
typename ITYPE >
284 typename ITERABLE::iterator case_insensitive_find_first_begins(ITERABLE & iterable,
const ITYPE & lpcszPrefix,
typename ITERABLE::iterator find = 0,
typename ITERABLE::iterator last =
nullptr);
286 template <
typename ITERABLE,
typename ITYPE >
287 typename ITERABLE::iterator find_first_begins_eat(ITERABLE & iterable, ITYPE & str,
const ITYPE & pcsz,
typename ITERABLE::iterator find = 0,
typename ITERABLE::iterator last =
nullptr);
289 template <
typename ITERABLE,
typename ITYPE >
290 typename ITERABLE::iterator case_insensitive_find_first_begins_eat(ITERABLE & iterable, ITYPE & str,
const ITYPE & pcsz,
typename ITERABLE::iterator find = 0,
typename ITERABLE::iterator last =
nullptr);
292 template <
typename ITERABLE,
typename ITYPE >
293 bool case_insensitive_contains(
const ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find,
typename ITERABLE::iterator last =
nullptr, ::collection::count countMin = 1, ::collection::count countMax = -1);
295 template <
typename ITERABLE,
typename ITYPE >
296 bool case_insensitive_icontains(
const ITERABLE & iterable,
const ITYPE & pcsz, index first, ::collection::count count = -1, ::collection::count countMin = 1, ::collection::count countMax = -1);
298 template <
typename ITERABLE,
typename STRITERABLE,
typename ITYPE >
299 ::collection::count case_insensitive_get_begins(ITERABLE & iterable, STRITERABLE & stra,
const ITYPE & pcsz,
typename ITERABLE::iterator first = 0,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr);
301 template <
typename ITERABLE,
typename ITYPE >
302 ::collection::count case_insensitive_filter_begins(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator first = 0,
typename ITERABLE::iterator last =
nullptr);
304 template <
typename ITERABLE,
typename PRED >
305 ::collection::count filter(ITERABLE & iterable, PRED pred,
typename ITERABLE::iterator first = 0,
typename ITERABLE::iterator last =
nullptr);
307 template <
typename ITERABLE,
typename PRED >
308 ::collection::count filter_out(ITERABLE & iterable, PRED pred,
typename ITERABLE::iterator first = 0,
typename ITERABLE::iterator last =
nullptr);
310 template <
typename ITERABLE,
typename PRED,
typename ArrayOut >
311 ::collection::count filter_out(ITERABLE & iterable, PRED pred, ArrayOut & a,
typename ITERABLE::iterator first = 0,
typename ITERABLE::iterator last =
nullptr);
313 template <
typename ITERABLE,
typename ITYPE >
314 bool case_insensitive_erase_first(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr);
316 template <
typename ITERABLE,
typename ITYPE >
317 bool erase_first(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr);
319 template <
typename ITERABLE >
320 void erase_first(ITERABLE & iterable);
322 template <
typename ITERABLE,
typename ITYPE >
323 bool case_insensitive_erase_last(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr);
325 template <
typename ITERABLE,
typename ITYPE >
326 bool erase_last(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr);
328 template <
typename ITERABLE >
329 void erase_last(ITERABLE & iterable);
331 template <
typename ITERABLE,
typename ITYPE >
332 ::collection::count case_insensitive_erase(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find,
typename ITERABLE::iterator last, ::collection::count countMin, ::collection::count countMax = -1);
334 template <
typename ITERABLE,
typename ITYPE >
335 ::collection::count erase(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find,
typename ITERABLE::iterator last, ::collection::count countMin, ::collection::count countMax = -1);
337 template <
typename ITERABLE,
typename ITYPE >
338 ::collection::count case_insensitive_erase(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find,
typename ITERABLE::iterator last =
nullptr);
340 template <
typename ITERABLE,
typename ITYPE >
341 ::collection::count erase(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find,
typename ITERABLE::iterator last =
nullptr);
343 template <
typename ITERABLE,
typename ITYPE >
344 ::collection::count case_insensitive_erase(ITERABLE & iterable,
const ITYPE & pcsz);
346 template <
typename ITERABLE,
typename ITYPE >
347 ::collection::count erase(ITERABLE & iterable,
const ITYPE & pcsz);
349 template <
typename ITERABLE,
typename ITYPE >
350 ::collection::count case_insensitive_ierase(ITERABLE & iterable,
const ITYPE & pcsz, index first = 0, ::collection::count count = -1);
352 template <
typename ITERABLE,
typename ITYPE >
353 ::collection::count ierase(ITERABLE & iterable,
const ITYPE & pcsz, index first = 0, ::collection::count count = -1);
355 template <
typename ITERABLE,
typename ITYPE,
typename ITYPE2 >
356 ITERABLE & explode(ITERABLE & iterable,
const ITYPE & strSeparator,
const ITYPE2 & str);
359 template <
typename ITERABLE,
typename ITYPE >
360 ITERABLE & csstidy_explode_ws(
const ITERABLE & iterable, ::i8 sep,
const ITYPE & psz);
362 template <
typename ITERABLE,
typename ITYPE >
363 void get_format_string(
const ITERABLE & iterable, ITYPE & str,
const ITYPE & lpcszSeparator);
365 template <
typename ITERABLE,
typename ITYPE,
typename ITYPE2 >
366 ITERABLE & add_tokens(ITERABLE & iterable,
const ITYPE & pcsz,
const ITYPE2 & lpcszSeparator,
bool bAddEmpty =
true);
368 template <
typename ITERABLE,
typename ITYPE >
369 ITYPE encode_v16(
const ITERABLE & iterable);
371 template <
typename ITERABLE,
typename ITYPE >
372 void decode_v16(ITERABLE & iterable,
const ITYPE & psz);
374 template <
typename ITERABLE,
typename ITYPE >
375 ::collection::count get_count_except(
const ITERABLE & iterable,
const ITYPE & psz);
377 template <
typename ITERABLE,
typename ITYPE >
378 ::collection::count get_count_except(
const ITERABLE & iterable,
const ITYPE & str);
380 template <
typename ITERABLE,
typename ITERABLE2 >
381 ::collection::count get_count_except_iter(
const ITERABLE & iterable,
const ITERABLE & iterable2);
383 template <
typename ITERABLE,
typename ITYPE >
384 ::collection::count case_insensitive_get_count_except(
const ITERABLE & iterable,
const ITYPE & psz);
386 template <
typename ITERABLE,
typename ITYPE >
387 ::collection::count case_insensitive_get_count_except(
const ITERABLE & iterable,
const ITYPE & str);
389 template <
typename ITERABLE,
typename ITERABLE2 >
390 ::collection::count case_insensitive_get_count_except_iter(
const ITERABLE & iterable,
const ITERABLE & set);
392 template <
typename ITERABLE,
typename ITYPE >
393 ITYPE & get_network_payload(
const ITERABLE & iterable, ITYPE & str,
bool bNewLine =
true);
395 template <
typename ITERABLE,
typename ITYPE >
396 void c_add(ITERABLE & iterable, char_pointer * ppsz, ::collection::count iCount);
398 template <
typename ITERABLE,
typename ITYPE >
399 void c_add(ITERABLE & iterable, char_pointer * ppsz);
401 template <
typename ITERABLE,
typename ITYPE >
402 void c_add(ITERABLE & iterable,
wchar_t ** ppsz, ::collection::count iCount);
404 template <
typename ITERABLE,
typename ITYPE >
405 void c_add(ITERABLE & iterable,
wchar_t ** ppsz);
407 template <
typename ITERABLE,
typename ITYPE >
408 bool contains(
const ITERABLE & iterable,
const ITYPE & value);
410 template <
typename ITERABLE,
typename ITYPE >
411 bool case_insensitive_contains(
const ITERABLE & iterable,
const ITYPE & value);
416 template <
typename ITERABLE,
typename ITYPE >
417 bool contains(
const ITERABLE & iterable,
const ITYPE & value)
420 for (
auto & item : iterable)
437 template <
typename ITERABLE,
typename ITYPE >
438 bool case_insensitive_contains(
const ITERABLE & iterable,
const ITYPE & value)
441 for (
auto & item : iterable)
444 if (case_insensitive_ansi_compare(item, value) == 0)
458 template <
typename ITERABLE,
typename PAIR >
459 bool contains(ITERABLE & iterable,
const set_node < PAIR > & assoc)
462 for (
auto item : iterable1)
465 if (item == assoc.element1())
479 template <
typename ITERABLE,
typename ITERABLE2,
typename PRED >
480 ITERABLE & intersect(ITERABLE & iterable,
const ITERABLE2 & iterable2, PRED pred)
483 for (
auto it = iterable.begin(); it != iterable.end();)
486 if (contains(iterable2, *it, pred))
489 iterable.erase_at(it);
506 template <
typename ITERABLE1,
typename ITERABLE2 >
507 ITERABLE1 & intersect(ITERABLE1 & iterable,
const ITERABLE2 & iterable2)
510 for (
auto it = iterable.begin(); it != iterable.end();)
513 if (contains(iterable2, *it))
533 template <
typename ITERABLE,
typename ITYPE >
534 typename ITYPE maximum(
const ITERABLE & iterable, ITYPE maximum)
537 for (
auto & item : iterable)
554 template <
typename ITERABLE,
typename ITYPE >
555 typename ITERABLE::iterator find_first_value(ITERABLE & iterable,
const ITYPE & value)
558 auto it = iterable.begin();
560 for (; it != iterable.end(); it++)
563 if (it->element2() == value)
577 template <
typename ITERABLE,
typename ITYPE >
578 typename ITERABLE::const_iterator find_first_value(
const ITERABLE & iterable,
const ITYPE & value)
581 auto it = iterable.begin();
583 for (; it != iterable.end(); it++)
586 if (it->element2() == value)
600 template <
typename ITERABLE >
601 typename ITERABLE::const_iterator find_first_value(
const ITERABLE & iterable,
const typename ITERABLE::PAYLOAD & value)
604 for (
auto & item : iterable)
607 if (item.element2() == value)
616 return iterable.end();
620 template <
typename ITERABLE,
typename ITYPE >
621 bool contains_key(
const ITERABLE & iterable,
const ITYPE & value)
624 return iterable.find_first_key(value) != iterable.end();
628 template <
typename ITERABLE,
typename ITYPE >
629 bool contains_payload(
const ITERABLE & iterable,
const ITYPE & value)
632 return find_first_value(iterable, value) != iterable.end();
637 template <
typename ITERABLE >
638 bool erase_first(ITERABLE & iterable,
const typename ITERABLE::ITYPE & t)
641 auto find = find_first(iterable, t);
643 if (find != iterable.end())
646 iterable.erase(find);
657 template <
typename ITERABLE >
658 bool erase_last(ITERABLE & iterable,
const typename ITERABLE::ITYPE & t)
661 auto find = find_last(iterable, t);
663 if (find != iterable.end())
666 iterable.erase(find);
676 template <
typename ITERABLE,
typename ITYPE >
677 bool erase_first(ITERABLE & iterable,
const ITYPE & t,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last)
680 if ((first = find_first(iterable, t, first, last)) != iterable.end())
683 iterable.erase(first);
694 template <
typename ITERABLE,
typename ITYPE >
695 bool erase_last(ITERABLE & iterable,
const ITYPE & t,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last)
698 if ((first = find_last(iterable, t, first, last)) != iterable.end())
701 iterable.erase(first);
712 template <
typename ITERABLE >
713 void erase_first(ITERABLE & iterable)
716 iterable.erase(iterable.begin());
721 template <
typename ITERABLE >
722 void erase_last(ITERABLE & iterable)
725 iterable.erase(iterable.upper_bound());
730 template <
typename ITERABLE,
typename ITYPE >
731 bool case_insensitive_icontains(
const ITERABLE & iterable,
const ITYPE & t, index first, ::collection::count count, ::collection::count countMin, ::collection::count countMax)
733 ::collection::count c = 0;
734 while ((c < countMin || (countMax >= 0 && c <= countMax))
735 && (first = case_insensitive_ifind_first(iterable, t, first, count)) >= 0)
740 return c >= countMin && conditional(countMax >= 0, c <= countMax);
744 template <
typename ITERABLE,
typename ITYPE >
745 ::collection::index ifind_first(
const ITERABLE & iterable,
const ITYPE & t, index first, ::collection::count count)
748 iterable.iprepare_first_count(first, count);
750 for (; first < count; first++)
753 if (iterable.element_at(first) == t)
767 template <
typename ITERABLE,
typename ITYPE >
768 bool icontains(
const ITERABLE & iterable,
const ITYPE & t, index first, ::collection::count count)
771 return ifind_first(iterable, t, first, count) >= 0;
776 template <
typename ITERABLE,
typename ITYPE >
777 bool contains(
const ITERABLE & iterable,
const ITYPE & t,
typename ITERABLE::const_iterator find,
typename ITERABLE::const_iterator last, ::collection::count countMin, ::collection::count countMax)
779 ::collection::count count = 0;
780 while ((count < countMin || (countMax >= 0 && count <= countMax))
781 && (find = find_first(iterable, t, find, last)) != iterable.end())
783 return count >= countMin && conditional(countMax >= 0, count <= countMax);
788 template <
typename ITERABLE,
typename ITYPE >
789 bool contains(ITERABLE & iterable,
const ITYPE & t,
typename ITERABLE::iterator find,
typename ITERABLE::iterator last, ::collection::count countMin, ::collection::count countMax)
791 ::collection::count count = 0;
792 while ((count < countMin || (countMax >= 0 && count <= countMax))
793 && (find = find_first(iterable, t, find, last)) != iterable.end())
795 return count >= countMin && conditional(countMax >= 0, count <= countMax);
799 template <
typename ITERABLE,
typename ITYPE >
800 typename ITERABLE::const_iterator find_first(
const ITERABLE & iterable,
const ITYPE & t,
typename ITERABLE::const_iterator find,
typename ITERABLE::const_iterator last)
803 iterable.prepare_first_last(find, last);
805 for (; iterable.valid_iter(find, last); find++)
817 return iterable.end();
822 template <
typename ITERABLE,
typename ITYPE >
823 typename ITERABLE::iterator find_first(ITERABLE & iterable,
const ITYPE & t,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last)
826 iterable.prepare_first_last(first, last);
828 for (; iterable.valid_iter(first, last); find++)
840 return iterable.end();
845 template <
typename ITERABLE,
class ITYPE >
846 ::collection::count erase(ITERABLE & iterable,
const ITYPE & t,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last, ::collection::count countMin, ::collection::count countMax)
848 ::collection::count count = 0;
849 if (contains(iterable, t, first, last, countMin, countMax))
850 while (conditional(countMax >= 0, count < countMax) && erase_first(iterable, t, first, last))
856 template <
typename ITERABLE,
class ITYPE >
857 ::collection::count case_insensitive_erase(ITERABLE & iterable,
const ITYPE & t,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last, ::collection::count countMin, ::collection::count countMax)
859 ::collection::count count = 0;
860 if (case_insensitive_contains(iterable, t, first, last, countMin, countMax))
861 while (conditional(countMax >= 0, count < countMax) && case_insensitive_erase_first(iterable, t, first, last))
906 template <
typename ITERABLE,
class ITYPE >
907 ::collection::count erase(ITERABLE & iterable,
const ITYPE & t,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last)
910 ::collection::count c = 0;
912 prepare_first_count(first, last);
914 decltype(first) itRemove;
916 for (; iterable.valid_iter(first, last);)
926 iterable.erase_at(itRemove);
945 template <
typename ITERABLE,
class ITYPE >
946 ::collection::count case_insensitive_erase(ITERABLE & iterable,
const ITYPE & t,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last)
949 ::collection::count c = 0;
951 prepare_first_count(first, last);
953 decltype(first) itRemove;
955 for (; iterable.valid_iter(first, last);)
958 if (case_insensitive_ansi_compare(*first, t) == 0)
965 iterable.erase_at(itRemove);
983 template <
typename ITERABLE,
class ITYPE >
984 ::collection::count erase(ITERABLE & iterable,
const ITYPE & t)
987 ::collection::count c = 0;
989 auto first = iterable.begin();
991 for (; iterable.valid_iter(first, iterable.end());)
997 iterable.erase(first);
1016 template <
typename ITERABLE,
class ITYPE >
1017 ::collection::count case_insensitive_erase(ITERABLE & iterable,
const ITYPE & t)
1020 ::collection::count c = 0;
1022 auto first = iterable.begin();
1024 for (; iterable.valid_iter(first, iterable.end());)
1027 if (case_insensitive_ansi_compare(*first, t) == 0)
1034 iterable.erase_at(itRemove);
1054 template <
typename ITERABLE,
class ITYPE >
1055 ::collection::count rerase(ITERABLE & iterable,
const ITYPE & t,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last, ::collection::count countMin, ::collection::count countMax)
1057 ::collection::count count = 0;
1058 if (contains(iterable, t, first, last, countMin, countMax))
1059 while (conditional(countMax >= 0, count < countMax) && erase_last(iterable, t, first, last))
1065 template <
typename ITERABLE,
typename ITERABLE2 >
1066 void copy(ITERABLE & iterable,
const ITERABLE2 & iterable2)
1069 iterable.erase_all();
1071 for (
auto & item : iterable2)
1133 template <
typename ITERABLE,
typename ITYPE,
typename ITYPE2 >
1134 void reverse_implode(
const ITERABLE & iterable, ITYPE & str,
const ITYPE2 & lpcszSeparator,
typename ITERABLE::iterator first, ::collection::count last)
1139 string strSeparator(lpcszSeparator);
1141 if (first ==
nullptr)
1148 if (last ==
nullptr)
1151 last = upper_bound();
1157 for (
auto i = last; i >= start; i--)
1162 str += strSeparator;
1175 template <
typename ITERABLE,
typename ITERABLE2 >
1176 ::collection::count case_insensitive_erase_iter(ITERABLE & iterable,
const ITERABLE2 & iterable2)
1179 ::collection::count count = 0;
1181 for (
auto & item : iterable2)
1184 count += case_insensitive_erase(iterable, item);
1193 template <
typename ITERABLE,
typename ITERABLE2 >
1194 ::collection::count erase_iter(ITERABLE & iterable,
const ITERABLE2 & iterable2)
1197 ::collection::count count = 0;
1199 for (
auto & item : iterable)
1202 count += erase(iterable, item);
1212 template <
typename ITERABLE,
typename ITYPE,
typename ITYPE2 >
1213 void implode(
const ITERABLE & iterable, ITYPE & str,
const ITYPE2 & lpcszSeparator,
typename ITERABLE::const_iterator first,
typename ITERABLE::const_iterator last)
1216 iterable.prepare_first_last(first, last);
1220 ITYPE strSeparator(lpcszSeparator);
1222 if (iterable.valid_iter(first, last))
1231 for (; iterable.valid_iter(first, last); first++)
1234 str += strSeparator;
1323 template <
typename ITERABLE,
typename ITYPE >
1324 ::collection::count explode_command_line(ITERABLE & iterable,
const ITYPE & str, char_pointer * argv)
1327 ITYPE strParse(str);
1329 while (strParse.has_character())
1332 iterable.add((ITYPE)::str::consume_command_line_argument(strParse));
1336 if (argv !=
nullptr)
1339 for (
typename ITERABLE::iterator i = 0; i < get_count(); i++)
1342 char_pointer pch = (char_pointer )(
const ITYPE &)element_at(i);
1360 template <
typename ITERABLE,
typename ITYPE,
typename ITERABLE2 >
1361 ITERABLE & add_shortest_tokens(ITERABLE & iterable,
const ITYPE & pcsz,
const ITERABLE2 & iterableSeparator,
bool bAddEmpty,
bool bWithSeparator)
1364 ::tokenizer strTokenizer(pcsz);
1371 while (strTokenizer.next_shortest_token(strToken, iterableSeparator, bWithSeparator))
1374 iterable.add(strToken);
1382 while (strTokenizer.next_shortest_token(strToken, iterableSeparator, bWithSeparator))
1385 if (!strToken.is_empty())
1388 iterable.add(strToken);
1402 template <
typename ITERABLE,
typename ITYPE >
1403 ITERABLE & add_lines(ITERABLE & iterable,
const ITYPE & strFindParam,
bool bAddEmpty)
1406 typedef typename ITERABLE::BASE_TYPE STRING_TYPE;
1408 STRING_TYPE str(strFindParam);
1410 character_count iPos = 0;
1412 character_count iFindA;
1414 character_count iFindB;
1416 character_count iFind1;
1418 character_count iFind2;
1423 iFindA = str.find(
'\n', iPos);
1428 iFindB = str.find(
'\r', iPos);
1433 iFind1 = minimum(iFindA, iFindB);
1435 iFind2 = maximum(iFindA, iFindB);
1440 iterable.add((STRING_TYPE)STRING_TYPE(&str[iPos], iFind1 - iPos));
1446 iterable.add(STRING_TYPE());
1450 if (iFind2 - iFind1 == 1)
1473 iFindA = str.find(
'\n', iPos);
1481 iterable.add((STRING_TYPE)STRING_TYPE(&str[iPos], iFindA - iPos));
1487 iterable.add(STRING_TYPE());
1501 iFindB = str.find(
'\r', iPos);
1509 iterable.add((STRING_TYPE)STRING_TYPE(&str[iPos], iFindB - iPos));
1515 iterable.add(STRING_TYPE());
1527 if (str.length() > iPos)
1530 iterable.add((STRING_TYPE)STRING_TYPE(&str[iPos], str.length() - iPos));
1536 iterable.add(STRING_TYPE());
1548 template <
typename ITERABLE,
typename ITYPE >
1549 void get_format_string(
const ITERABLE & iterable, ITYPE & str,
const ITYPE & lpcszSeparator)
1552 if (iterable.m_nSize > 0)
1556 for (::i32 i = 1; i < iterable.m_nSize; i++)
1558 str += lpcszSeparator + get_at(i);
1596 template <
typename ITERABLE,
typename ITYPE >
1597 bool add_unique(ITERABLE & iterable,
const ITYPE & str)
1600 if (::iter::contains(iterable, str))
1607 iterable.add((
const ITYPE &)str);
1613 template <
typename ITERABLE,
typename ITYPE >
1614 bool case_insensitive_add_unique(ITERABLE & iterable,
const ITYPE & str)
1617 if (::iter::case_insensitive_contains(iterable, str))
1624 iterable.add((
const ITYPE &)str);
1632 template <
typename ITERABLE,
typename ITERABLE2 >
1633 ::collection::count add_unique_iter(ITERABLE & iterable,
const typename ITERABLE2 & stra)
1636 ::collection::count count = 0;
1638 for (
auto & str : stra)
1641 if (iterable.add_unique(str))
1655 template <
typename ITERABLE,
typename ITERABLE2 >
1656 ::collection::count case_insensitive_add_unique_iter(ITERABLE & iterable,
const typename ITERABLE2 & iterable2)
1659 ::collection::count count = 0;
1661 for (
auto & str : iterable2)
1664 if (iterable.case_insensitive_add_unique(str) != iterable.end())
1677 template <
typename ITERABLE,
typename PRED>
1678 bool predicate_erase_first(ITERABLE & iterable, PRED pred)
1681 auto it = predicate_find_first(iterable, pred);
1683 if (it == iterable.end())
1696 template <
typename ITERABLE,
typename PRED >
1697 typename ITERABLE::const_iterator predicate_find_first(
const ITERABLE & iterable, PRED pred,
typename ITERABLE::const_iterator first,
typename ITERABLE::const_iterator last)
1700 iterable.prepare_first_last(first, last);
1702 for (; iterable.valid_iter(first, last); first++)
1719 template <
typename ITERABLE,
typename PRED >
1720 typename ITERABLE::iterator predicate_find_first(ITERABLE & iterable, PRED pred,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last)
1723 iterable.prepare_first_last(first, last);
1725 for (; iterable.valid_iter(first, last); first++)
1751 template <
typename ITERABLE,
typename ITYPE >
1752 typename index case_insensitive_ifind_first(
const ITERABLE & iterable,
const ITYPE & pcsz, index first, ::collection::count count)
1755 iterable.iprepare_first_count(first, count);
1757 for (; first < count; first++)
1760 if (case_insensitive_ansi_compare(iterable.element_at(first), pcsz) == 0)
1774 template <
typename ITERABLE,
typename ITYPE >
1775 typename index ifind_first_begins(
const ITERABLE & iterable,
const ITYPE & pcsz, index first, ::collection::count count)
1778 iterable.iprepare_first_count(first, count);
1780 for (; first < count; find++)
1783 if (string_begins(iterable.element_at(first), pcsz))
1796 template <
typename ITERABLE,
typename ITYPE >
1797 typename index case_insensitive_ifind_first_begins(
const ITERABLE & iterable,
const ITYPE & pcsz, index first, ::collection::count count)
1800 iterable.iprepare_first_count(first, count);
1802 for (; first < count; find++)
1805 if (case_insensitive_string_begins(iterable.element_at(first), pcsz))
1842 template <
typename ITERABLE,
typename ITYPE >
1843 typename ITERABLE::const_iterator case_insensitive_find_last(
const ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::const_iterator first,
typename ITERABLE::const_iterator last)
1846 return case_insensitive_reverse_find(pcsz, first, last);
1851 template <
typename ITERABLE,
typename ITYPE >
1852 typename ITERABLE::const_iterator find_last(
const ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::const_iterator first,
typename ITERABLE::const_iterator last)
1855 return rear_find(pcsz, first, last);
1861 template <
typename ITERABLE,
typename ITYPE >
1862 typename ITERABLE::const_iterator case_insensitive_reverse_find(
const ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::const_iterator first,
typename ITERABLE::const_iterator last)
1865 iterable.rprepare_first_last(first, last);
1867 for (; iterable.rvalid_iter(first, last); first--)
1870 if (case_insensitive_ansi_compare(*first, pcsz) == 0)
1879 return iterable.end();
1884 template <
typename ITERABLE,
typename ITYPE >
1885 typename ITERABLE::const_iterator rear_find(
const ITERABLE & iterable,
const ITYPE & value,
typename ITERABLE::const_iterator first,
typename ITERABLE::const_iterator last)
1888 iterable.rprepare_first_last(first, last);
1890 for (; iterable.rvalid_iter(first, last); first--)
1893 if (*first == value)
1902 return iterable.end();
1908 template <
typename ITERABLE,
typename ITYPE >
1909 typename ITERABLE::const_iterator find_first_ends(
const ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::const_iterator first,
typename ITERABLE::const_iterator last)
1912 iterable.prepare_first_last(first, last);
1914 for (; iterable.valid_iter(first, last); first++)
1917 if (string_ends(*first, pcsz))
1926 return iterable.end();
1930 template <
typename ITERABLE,
typename ITYPE >
1931 typename ITERABLE::const_iterator case_insensitive_find_first_ends(
const ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::const_iterator find,
typename ITERABLE::const_iterator last)
1934 iterable.prepare_first_last(first, last);
1936 for (; iterable.valid_iter(first, last); first++)
1939 if (case_insensitive_string_ends(*first, pcsz))
1948 return iterable.end();
1954 template <
typename ITERABLE,
typename ITYPE >
1955 typename ITERABLE::const_iterator find_first_ends_eat(ITERABLE & iterable,
string & str,
const ITYPE & pcsz,
typename ITERABLE::const_iterator first,
typename ITERABLE::const_iterator last)
1958 first = find_first_ends(pcsz, first, last);
1960 if (first == iterable.end())
1963 str = first->Left(first->length() - ansi_length(pcsz));
1971 template <
typename ITERABLE,
typename ITYPE >
1972 typename ITERABLE::const_iterator case_insensitive_find_first_ends_eat(ITERABLE & iterable,
string & str,
const ITYPE & pcsz,
typename ITERABLE::const_iterator find,
typename ITERABLE::const_iterator last)
1975 find = case_insensitive_find_first_ends(pcsz, find, last);
1980 str = element_at(find).left(element_at(find).length() - strlen(pcsz));
1988 template <
typename ITERABLE,
typename ITYPE >
1989 typename ITERABLE::const_iterator find_first_begins(
const ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::const_iterator find,
typename ITERABLE::const_iterator last)
1992 find += iterable.get_count();
1994 last += iterable.get_count();
1995 for (; find < iterable.get_count(); find++)
1997 if (string_begins(iterable.element_at(find), pcsz))
2004 template <
typename ITERABLE,
typename ITYPE >
2005 typename ITERABLE::const_iterator case_insensitive_find_first_begins(
const ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::const_iterator first,
typename ITERABLE::const_iterator last)
2008 iterable.prepare_first_last(first, last);
2010 for(; iterable.valid_iter(first, last); first++)
2013 if (case_insensitive_string_begins(*first, pcsz))
2018 return iterable.end();
2023 template <
typename ITERABLE,
typename ITYPE >
2024 typename ITERABLE::const_iterator find_first_begins_eat(ITERABLE & iterable,
string & str,
const ITYPE & pcsz,
typename ITERABLE::const_iterator find,
typename ITERABLE::const_iterator last)
2027 find = find_first_begins(pcsz, find, last);
2032 str = element_at(find).substr(strlen(pcsz));
2040 template <
typename ITERABLE,
typename ITYPE >
2041 typename ITERABLE::const_iterator case_insensitive_find_first_begins_eat(ITERABLE & iterable,
string & str,
const ITYPE & pcsz,
typename ITERABLE::const_iterator find,
typename ITERABLE::const_iterator last)
2044 find = case_insensitive_find_first_begins(pcsz, find, last);
2049 str = element_at(find).substr(strlen(pcsz));
2056 template <
typename ITERABLE,
typename ITYPE >
2057 typename ITERABLE::const_iterator any_suffixes(
const ITERABLE & iterable,
const ITYPE & lpcszIdSuffixed,
typename ITERABLE::const_iterator find,
typename ITERABLE::const_iterator last)
2061 find += iterable.get_count();
2063 last += iterable.get_count();
2064 for (; find < iterable.get_count(); find++)
2066 if (string_ends(lpcszIdSuffixed, iterable.element_at(find)))
2073 template <
typename ITERABLE,
typename ITYPE >
2074 typename ITERABLE::const_iterator any_case_insensitive_suffixes(
const ITERABLE & iterable,
const ITYPE & lpcszIdSuffixed,
typename ITERABLE::const_iterator find,
typename ITERABLE::const_iterator last)
2077 iterable.prepare_first_last(first, last);
2079 for (; iterable.valid_iter(find, last); find++)
2082 if (case_insensitive_string_ends(lpcszIdSuffixed, *find))
2096 template <
typename ITERABLE,
typename ITYPE >
2097 typename ITERABLE::const_iterator any_prefixes(
const ITERABLE & iterable,
const ITYPE & lpcszIdPrefixed,
typename ITERABLE::const_iterator find,
typename ITERABLE::const_iterator last)
2101 find += iterable.get_count();
2103 last += iterable.get_count();
2104 for (; find < iterable.get_count(); find++)
2106 if (string_begins(lpcszIdPrefixed, iterable.element_at(find)))
2113 template <
typename ITERABLE,
typename ITYPE >
2114 typename ITERABLE::const_iterator case_insensitive_any_prefixes(
const ITERABLE & iterable,
const ITYPE & lpcszIdPrefixed,
typename ITERABLE::const_iterator find,
typename ITERABLE::const_iterator last)
2118 find += iterable.get_count();
2120 last += iterable.get_count();
2121 for (; find < iterable.get_count(); find++)
2123 if (case_insensitive_string_begins(lpcszIdPrefixed, iterable.element_at(find)))
2130 template <
typename ITERABLE,
typename ITYPE >
2131 typename index find_first_begins(ITERABLE & iterable,
const ITYPE & pcsz, ::collection::index find, ::collection::count count)
2134 iterable.iprepare_first_count(find, count);
2136 for (; find < count; find++)
2139 if (string_begins(iterable.element_at(find), pcsz))
2152 template <
typename ITERABLE,
typename ITYPE >
2153 typename index case_insensitive_find_first_begins(ITERABLE & iterable,
const ITYPE & pcsz, ::collection::index find, ::collection::count count)
2156 iterable.iprepare_first_count(find, count);
2158 for (; find < count; find++)
2161 if (case_insensitive_string_begins(iterable.element_at(find), pcsz))
2176 template <
typename ITERABLE,
typename ITYPE >
2177 ::collection::index case_insensitive_find_first(ITERABLE & iterable,
const ITYPE & pcsz, ::collection::index find, ::collection::count count)
2180 find += iterable.get_count();
2182 last += iterable.get_count();
2183 for (; find <= last; find++)
2185 if (iterable.element_at(find).CompareNoCase(pcsz) == 0)
2198 template <
typename ITERABLE,
typename ITYPE >
2199 typename ITERABLE::iterator case_insensitive_find_last(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find,
typename ITERABLE::iterator last)
2201 return case_insensitive_reverse_find(pcsz, find, last);
2205 template <
typename ITERABLE,
typename ITYPE >
2206 typename ITERABLE::iterator find_last(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find,
typename ITERABLE::iterator last)
2208 return rear_find(pcsz, find, last);
2213 template <
typename ITERABLE,
typename ITYPE >
2214 typename ITERABLE::iterator case_insensitive_reverse_find(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find,
typename ITERABLE::iterator last)
2217 find += iterable.get_count();
2219 last += iterable.get_count();
2220 for (; find >= last; find--)
2222 if (iterable.element_at(find).CompareNoCase(pcsz) == 0)
2229 template <
typename ITERABLE,
typename ITYPE >
2230 typename ITERABLE::iterator rear_find(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find,
typename ITERABLE::iterator last)
2233 find += iterable.get_count();
2235 last += iterable.get_count();
2236 for (; find >= last; find--)
2238 if (iterable.element_at(find).Compare(pcsz) == 0)
2247 template <
typename ITERABLE,
typename ITYPE >
2248 typename ITERABLE::iterator find_first_ends(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find,
typename ITERABLE::iterator last)
2251 find += iterable.get_count();
2253 last += iterable.get_count();
2254 for (; find < iterable.get_count(); find++)
2256 if (string_ends(iterable.element_at(find), pcsz))
2262 template <
typename ITERABLE,
typename ITYPE >
2263 typename ITERABLE::iterator case_insensitive_find_first_ends(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find,
typename ITERABLE::iterator last)
2266 find += iterable.get_count();
2268 last += iterable.get_count();
2269 for (; find < iterable.get_count(); find++)
2271 if (case_insensitive_string_ends(iterable.element_at(find), pcsz))
2279 template <
typename ITERABLE,
typename ITYPE >
2280 typename ITERABLE::iterator find_first_ends_eat(ITERABLE & iterable,
string & str,
const ITYPE & pcsz,
typename ITERABLE::iterator find,
typename ITERABLE::iterator last)
2283 find = find_first_ends(pcsz, find, last);
2288 str = element_at(find).left(element_at(find).length() - strlen(pcsz));
2296 template <
typename ITERABLE,
typename ITYPE >
2297 typename ITERABLE::iterator case_insensitive_find_first_ends_eat(ITERABLE & iterable,
string & str,
const ITYPE & pcsz,
typename ITERABLE::iterator find,
typename ITERABLE::iterator last)
2300 find = case_insensitive_find_first_ends(pcsz, find, last);
2305 str = element_at(find).left(element_at(find).length() - strlen(pcsz));
2313 template <
typename ITERABLE,
typename ITYPE >
2314 typename ITERABLE::iterator find_first_begins(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find,
typename ITERABLE::iterator last)
2317 find += iterable.get_count();
2319 last += iterable.get_count();
2320 for (; find < iterable.get_count(); find++)
2322 if (string_begins(iterable.element_at(find), pcsz))
2329 template <
typename ITERABLE,
typename ITYPE >
2330 typename ITERABLE::iterator case_insensitive_find_first_begins(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last)
2333 iterable.prepare_first_last(first, last);
2335 for (; iterable.valid_iter(first, last); first++)
2338 if (case_insensitive_string_begins(*first, pcsz))
2343 return iterable.end();
2348 template <
typename ITERABLE,
typename ITYPE >
2349 typename ITERABLE::iterator find_first_begins_eat(ITERABLE & iterable,
string & str,
const ITYPE & pcsz,
typename ITERABLE::iterator find,
typename ITERABLE::iterator last)
2352 find = find_first_begins(pcsz, find, last);
2357 str = element_at(find).substr(strlen(pcsz));
2365 template <
typename ITERABLE,
typename ITYPE >
2366 typename ITERABLE::iterator case_insensitive_find_first_begins_eat(ITERABLE & iterable,
string & str,
const ITYPE & pcsz,
typename ITERABLE::iterator find,
typename ITERABLE::iterator last)
2369 find = case_insensitive_find_first_begins(pcsz, find, last);
2374 str = element_at(find).substr(strlen(pcsz));
2381 template <
typename ITERABLE,
typename ITYPE >
2382 typename ITERABLE::iterator any_suffixes(ITERABLE & iterable,
const ITYPE & lpcszIsSuffixed,
typename ITERABLE::iterator find,
typename ITERABLE::iterator last)
2385 iterable.prepare_first_last(first, last);
2387 for (; iterable.valid_iter(first, last); first++)
2390 if (string_ends(lpcszIsSuffixed, *first))
2399 return iterable.end();
2404 template <
typename ITERABLE,
typename ITYPE >
2405 typename ITERABLE::iterator any_case_insensitive_suffixes(ITERABLE & iterable,
const ITYPE & lpcszIsSuffixed,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last)
2408 iterable.prepare_first_last(first, last);
2410 for (; iterable.valid_iter(first, last); first++)
2413 if (case_insensitive_string_ends(lpcszIsSuffixed, *first))
2422 return iterable.end();
2427 template <
typename ITERABLE,
typename ITYPE >
2428 typename ITERABLE::iterator any_prefixes(ITERABLE & iterable,
const ITYPE & lpcszIsPrefixed,
typename ITERABLE::iterator find,
typename ITERABLE::iterator last)
2431 iterable.prepare_first_last(first, last);
2433 for (; iterable.valid_iter(first, last); first++)
2436 if (string_begins(lpcszIsPrefixed, *first))
2445 return iterable.end();
2450 template <
typename ITERABLE,
typename ITYPE >
2451 typename ITERABLE::iterator case_insensitive_any_prefixes(ITERABLE & iterable,
const ITYPE & lpcszIsPrefixed,
typename ITERABLE::iterator find,
typename ITERABLE::iterator last)
2454 iterable.prepare_first_last(first, last);
2456 for (; iterable.valid_iter(first, last); first++)
2459 if (case_insensitive_string_begins(lpcszIsPrefixed, *first))
2468 return iterable.end();
2474 template <
typename ITERABLE,
typename ITYPE >
2475 typename ITERABLE::iterator case_insensitive_erase_first(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last)
2478 if ((first = case_insensitive_find_first(pcsz, first, last)) == iterable.end())
2485 iterable.erase(first);
2492 template <
typename ITERABLE,
typename ITYPE >
2493 typename ITERABLE::iterator case_insensitive_erase_last(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last)
2496 if ((first = case_insensitive_find_last(pcsz, first, last)) == iterable.end())
2503 iterable.erase(first);
2510 template <
typename ITERABLE,
typename ITYPE >
2511 typename ITERABLE::iterator erase_last(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator find,
typename ITERABLE::iterator last)
2514 if ((find = find_last(pcsz, find, last)) == iterable.end())
2521 iterable.erase_at(find);
2528 template <
typename ITERABLE,
typename ITYPE >
2529 ITERABLE & trim_left(ITERABLE & iterable,
const ITYPE & pszChars)
2532 for (
auto & item : iterable)
2535 item.trim_left(scopedstrChars);
2544 template <
typename ITERABLE,
typename ITYPE >
2545 ITERABLE & trim_right(ITERABLE & iterable,
const ITYPE & pszChars)
2548 for (
auto & item : iterable)
2551 item.trim_right(scopedstrChars);
2560 template <
typename ITERABLE,
typename ITYPE >
2561 ITERABLE & trim(ITERABLE & iterable,
const ITYPE & pszChars)
2564 for (
auto & item : iterable)
2567 item.trim(scopedstrChars);
2577 template <
typename ITERABLE >
2578 ITERABLE & trim_left(ITERABLE & iterable)
2581 for (
auto & item : iterable)
2593 template <
typename ITERABLE >
2594 ITERABLE & trim_right(ITERABLE & iterable)
2597 for (
auto & item : iterable)
2609 template <
typename ITERABLE >
2610 ITERABLE & trim(ITERABLE & iterable)
2613 for (
auto & item : iterable)
2634 template <
typename ITERABLE >
2635 ::collection::count erase_empty(ITERABLE & iterable)
2638 ::collection::count count = 0;
2640 for (
auto it = iterable.begin(); iterable.valid_iter(it, iterable.end());)
2680 template <
typename ITERABLE,
typename ITYPESEP,
typename ITYPE2 >
2681 ITERABLE & explode(ITERABLE & iterable,
const ITYPESEP & strSeparator,
const ITYPE2 & str)
2684 iterable.erase_all();
2686 return add_tokens(iterable, str, strSeparator,
true);
2690 template <
typename ITERABLE,
typename ITYPE,
typename ITYPESEP >
2691 ITERABLE & add_tokens(ITERABLE & iterable,
const ITYPE & pcsz,
const ITYPESEP & lpcszSeparator,
bool bAddEmpty)
2694 ::tokenizer strTokenizer(pcsz);
2701 while (strTokenizer.next_token(strToken, lpcszSeparator,
false))
2704 iterable.add(strToken);
2712 while (strTokenizer.next_token(strToken, lpcszSeparator,
false))
2715 if (!strToken.is_empty())
2718 iterable.add(strToken);
2732 template <
typename ITERABLE,
typename ITYPE >
2733 ITERABLE & csstidy_explode_ws(ITERABLE & iterable, ::i8 sep,
const ITYPE & psz)
2736 ITYPE istring(scopedstr);
2743 character_count num = 0;
2744 character_count len = istring.length();
2745 for (character_count i = 0; i < len; i++)
2751 if (istring[i] == sep && !::str::simple_escaped(istring, i))
2756 else if ((istring[i] ==
'"' || istring[i] ==
'\'' || istring[i] ==
'(') && !::str::simple_escaped(istring, i))
2759 to = (istring[i] ==
'(') ?
')' : istring[i];
2760 element_at(num) += (ITYPE)ITYPE(istring[i]);
2764 element_at(num) += (ITYPE)ITYPE(istring[i]);
2769 if (istring[i] == to && !::str::simple_escaped(istring, i))
2773 element_at(num) += (ITYPE)ITYPE(istring[i]);
2786 template <
typename ITERABLE,
typename ITYPE >
2787 void replace(ITERABLE & iterable,
const ITYPE & lpszSearch,
const ITYPE & lpszReplace)
2790 for (::i32 i = 0; i < iterable.get_size(); i++)
2793 iterable.element_at(i).replace(lpszSearch, lpszReplace);
2799 template <
typename ITERABLE,
typename ITERABLE2,
typename ITYPE >
2800 void prefix(ITERABLE & iterable,
const ITERABLE2 & iterable2,
const ITYPE & pszPrefix,
typename ITERABLE2::const_iterator first,
typename ITERABLE2::const_iterator last)
2803 typedef ITERABLE::BASE_TYPE STRING_TYPE;
2805 STRING_TYPE strPrefix(scopedstrPrefix);
2807 iterable2.prepare_first_last(first, last);
2809 for (; iterable2.valid_iter(first, last); first++)
2812 iterable.add(strPrefix + *first);
2818 template <
typename ITERABLE,
typename ITERABLE2,
typename ITYPE >
2819 void suffix(ITERABLE & iterable,
const ITERABLE2 & iterable2,
const ITYPE & pszSuffix,
typename ITERABLE2::const_iterator first,
typename ITERABLE2::const_iterator last)
2822 typedef ITERABLE::BASE_TYPE STRING_TYPE;
2824 STRING_TYPE strSuffix(scopedstrSuffix);
2826 iterable2.prepare_first_last(first, last);
2828 for (; iterable2.valid_iter(first, last); first++)
2831 iterable.add(*first + strSuffix);
2837 template <
typename ITERABLE,
typename ITERABLE2,
typename ITYPE,
typename ITYPE2 >
2838 void surround(ITERABLE & iterable,
const ITERABLE2 & iterable2,
const ITYPE & pszPrefix,
const ITYPE2 & pszSuffix,
typename ITERABLE2::const_iterator first,
typename ITERABLE2::const_iterator last)
2841 typedef ITERABLE::BASE_TYPE STRING_TYPE;
2843 STRING_TYPE strPrefix(scopedstrPrefix);
2845 STRING_TYPE strSuffix(scopedstrSuffix);
2847 iterable2.prepare_first_last(first, last);
2849 for (; iterable2.valid_iter(first, last); first++)
2852 iterable.add(strPrefix + *first + strSuffix);
2859 template <
typename ITERABLE,
typename ITYPE >
2860 void prefix(ITERABLE & iterable,
const ITYPE & pszPrefix,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last)
2863 typedef ITERABLE::BASE_TYPE STRING_TYPE;
2865 STRING_TYPE strPrefix(scopedstrPrefix);
2867 iterable.prepare_first_last(first, last);
2869 for (; iterable.valid_iter(first, last); first++)
2872 *first = strPrefix + *first;
2878 template <
typename ITERABLE,
typename ITYPE >
2879 void suffix(ITERABLE & iterable,
const ITYPE & pszSuffix,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last)
2882 typedef ITERABLE::BASE_TYPE STRING_TYPE;
2884 STRING_TYPE strSuffix(scopedstrSuffix);
2886 iterable.prepare_first_last(first, last);
2888 for (; iterable.valid_iter(first, last); first++)
2891 *first = *first + strSuffix;
2898 template <
typename ITERABLE,
typename ITYPE,
typename ITYPE2 >
2899 void surround(ITERABLE & iterable,
const ITYPE & pszPrefix,
const ITYPE2 & pszSuffix,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last)
2902 typedef ITERABLE::BASE_TYPE STRING_TYPE;
2904 STRING_TYPE strPrefix(scopedstrPrefix);
2906 STRING_TYPE strSuffix(scopedstrSuffix);
2908 iterable.prepare_first_last(first, last);
2910 for (; iterable.valid_iter(first, last); first++)
2913 *first = strPrefix + *first + strSuffix;
2920 template <
typename ITERABLE,
typename ITYPE,
typename ITYPE2,
typename ITYPE3,
typename ITYPE4 >
2921 void surround_and_implode(
const ITERABLE & iterable, ITYPE & str,
const ITYPE2 & lpcszSeparator,
const ITYPE3 & pszPrefix,
const ITYPE4 & pszSuffix,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last)
2926 typedef ITERABLE::BASE_TYPE STRING_TYPE;
2928 STRING_TYPE strPrefix(scopedstrPrefix);
2930 STRING_TYPE strSuffix(scopedstrSuffix);
2932 iterable.prepare_first_last(first, last);
2934 if (iterable.valid_iter(first, last))
2937 str = strPrefix + *first + strSuffix;
2943 for (; iterable.valid_iter(first, last); first++)
2946 str += lpcszSeparator;
2948 str += strPrefix + *first + strSuffix;
2959 template <
typename ITERABLE,
typename ITYPE >
2960 void prefix(
const ITERABLE & stra,
const ITYPE & pszPrefix,
typename ITERABLE::iterator iStart, ::collection::count iCount)
2963 ITYPE strPrefix(scopedstrPrefix);
2965 character_count iEnd;
2968 iStart = stra.get_size() + iStart;
2971 iEnd = stra.get_size() + iCount;
2973 iEnd = iStart + iCount - 1;
2975 for (
auto & str : stra)
2978 add(strPrefix + str);
2985 template <
typename ITERABLE,
typename ITYPE >
2986 void suffix(
const ITERABLE & stra,
const ITYPE & pszSuffix,
typename ITERABLE::iterator iStart, ::collection::count iCount)
2989 ITYPE strSuffix(scopedstrSuffix);
2991 character_count iEnd;
2994 iStart = stra.get_size() + iStart;
2997 iEnd = stra.get_size() + iCount;
2999 iEnd = iStart + iCount - 1;
3001 for (
typename ITERABLE::iterator i = iStart; i <= iEnd; i++)
3004 add(stra.element_at(i) + strSuffix);
3011 template <
typename ITERABLE,
typename ITYPE >
3012 void surround(
const ITERABLE & stra,
const ITYPE & pszPrefix,
const ITYPE & pszSuffix,
typename ITERABLE::iterator iStart, ::collection::count iCount)
3015 ITYPE strPrefix(scopedstrPrefix);
3017 ITYPE strSuffix(scopedstrSuffix);
3019 character_count iEnd;
3022 iStart = stra.get_size() + iStart;
3025 iEnd = stra.get_size() + iCount;
3027 iEnd = iStart + iCount - 1;
3029 for (
typename ITERABLE::iterator i = iStart; i <= iEnd; i++)
3032 add(strPrefix + stra.element_at(i) + strSuffix);
3039 template <
typename ITERABLE,
typename ITYPE >
3040 void surround(ITERABLE & iterable,
const ITYPE & pszPrefix,
const ITYPE & pszSuffix,
typename ITERABLE::iterator iStart, ::collection::count iCount)
3043 ITYPE strPrefix(scopedstrPrefix);
3045 ITYPE strSuffix(scopedstrSuffix);
3047 character_count iEnd;
3050 iStart = iterable.get_size() + iStart;
3053 iEnd = iterable.get_size() + iCount;
3055 iEnd = iStart + iCount - 1;
3057 for (
typename ITERABLE::iterator i = iStart; i <= iEnd; i++)
3060 iterable.element_at(i) = strPrefix + iterable.element_at(i);
3067 template <
typename ITERABLE,
typename ITYPE >
3068 void suffix(ITERABLE & iterable,
const ITYPE & pszSuffix,
typename ITERABLE::iterator iStart, ::collection::count iCount)
3071 ITYPE strSuffix(scopedstrSuffix);
3073 character_count iEnd;
3076 iStart = iterable.get_size() + iStart;
3079 iEnd = iterable.get_size() + iCount;
3081 iEnd = iStart + iCount - 1;
3083 for (
typename ITERABLE::iterator i = iStart; i <= iEnd; i++)
3086 iterable.element_at(i) = iterable.element_at(i) + strSuffix;
3096 template <
typename ITERABLE,
typename ITYPE,
typename ITYPE2,
typename ITYPE3 >
3097 void surround_and_implode(
const ITERABLE & iterable, ITYPE & str,
const ITYPE2 & pszSeparator,
const ITYPE3 & pszPrefix,
const ITYPE & pszSuffix,
typename ITERABLE::iterator iStart, ::collection::count iCount)
3100 ITYPE strSeparator(scopedstrSeparator);
3101 ITYPE strPrefix(scopedstrPrefix);
3102 ITYPE strSuffix(scopedstrSuffix);
3104 typename ITERABLE::iterator iEnd;
3107 iStart = iterable.get_size() + iStart;
3110 iEnd = iterable.get_size() + iCount;
3112 iEnd = iStart + iCount - 1;
3117 str = strPrefix + iterable.element_at(iStart) + strSuffix;
3121 for (
typename ITERABLE::iterator i = iStart; i <= iEnd; i++)
3124 str += strSeparator + strPrefix + iterable.element_at(i) + strSuffix;
3134 template <
typename ITERABLE,
typename ITERABLE2 >
3135 ITERABLE & add_iter(ITERABLE & iterable,
const ITERABLE2 & iterable2)
3138 for (
auto & item : iterable2)
3150 template <
typename ITERABLE,
typename ITERABLE2 >
3151 ITERABLE diff(
const ITERABLE & iterable,
const ITERABLE2 & iterable2)
3154 ITERABLE contanerSubtracted(iterable);
3156 contanerSubtracted.erase_iter(iterable2);
3158 return contanerSubtracted;
3163 template <
typename ITERABLE,
typename ITERABLE2 >
3164 ITERABLE sum(
const ITERABLE & iterable,
const ITERABLE2 & iterable2)
3167 ITERABLE contanerAdded(iterable);
3169 contanerAdded += iterable2;
3171 return contanerAdded;
3176 template <
typename ITERABLE,
typename ITYPE >
3177 bool case_insensitive_move(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator iIndex)
3179 typename ITERABLE::iterator i = case_insensitive_find_first(pcsz);
3182 iterable.erase_at(i);
3183 insert_at(iIndex, pcsz);
3188 template <
typename ITERABLE,
typename ITYPE >
3189 bool preferred(ITERABLE & iterable,
const ITYPE & pcsz)
3192 return case_insensitive_move(pcsz, 0);
3197 template <
typename ITERABLE,
typename ITERABLE2 >
3198 ::collection::count preferred_iter(ITERABLE & iterable,
const ITERABLE2 & iterable2)
3201 ::collection::count count = 0;
3203 for (
auto i = upper_bound(); i >= begin(); i--)
3238 template <
typename ITERABLE,
typename ITYPE >
3239 void erase(ITERABLE & iterable,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last)
3242 while(iterable.valid_iter(first, last))
3245 iterable.erase_at(first);
3270 template <
typename ITERABLE,
typename STRITERABLE,
typename ITYPE >
3271 ::collection::count case_insensitive_get_begins(
const ITERABLE & iterable, STRITERABLE & stra,
const ITYPE & pcsz,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last)
3274 last = iterable.get_size() + last;
3275 if (last >= iterable.get_size())
3276 last = get_upper_bound();
3279 typename ITERABLE::iterator i = first;
3280 typename ITERABLE::iterator iFind;
3281 ::collection::count count = 0;
3284 iFind = case_insensitive_find_first_begins(pcsz, i, last);
3285 if (::is_null(pFind))
3287 stra.add(iterable.element_at(iFind));
3294 template <
typename ITERABLE,
typename ITYPE >
3295 ::collection::count case_insensitive_filter_begins(ITERABLE & iterable,
const ITYPE & pcsz,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last)
3298 iterable.prepare_first_last(first, last);
3300 typename ITERABLE::iterator it = first;
3302 typename ITERABLE::iterator itFind;
3304 ::collection::count count = 0;
3309 itFind = case_insensitive_find_first_begins(iterable, pcsz, it, last);
3314 iterable.erase(it, last);
3320 iterable.erase_count(it, itFind - it);
3330 template <
typename ITERABLE,
typename ITYPE,
typename PRED >
3331 ::collection::count filter(ITERABLE & iterable, PRED pred,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last)
3334 last = iterable.get_size() + last;
3335 if (last >= iterable.get_size())
3336 last = get_upper_bound();
3340 ::collection::count count = 0;
3341 for (
typename ITERABLE::iterator i = first; i <= last;)
3343 if (pred(element_at(i)))
3349 iterable.erase_at(i);
3359 template <
typename ITERABLE,
typename ITYPE,
typename PRED >
3360 ::collection::count filter_out(ITERABLE & iterable, PRED pred,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last)
3363 last = iterable.get_size() + last;
3364 if (last >= iterable.get_size())
3365 last = get_upper_bound();
3369 ::collection::count count = 0;
3370 for (
typename ITERABLE::iterator i = first; i <= last;)
3372 if (!pred(element_at(i)))
3378 iterable.erase_at(i);
3387 template <
typename ITERABLE,
typename ITYPE,
typename PRED,
typename ArrayOut >
3388 ::collection::count filter_out(ITERABLE & iterable, PRED pred, ArrayOut & a,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last)
3391 last = iterable.get_size() + last;
3392 if (last >= iterable.get_size())
3393 last = get_upper_bound();
3397 ::collection::count count = 0;
3398 for (
typename ITERABLE::iterator i = first; i <= last;)
3400 if (!pred(element_at(i)))
3406 a.add(iterable.element_at(i));
3407 iterable.erase_at(i);
3421 template <
typename ITERABLE >
3422 void make_lower(ITERABLE & iterable)
3424 for (
typename ITERABLE::iterator i = 0; i < iterable.get_count(); i++)
3426 iterable.element_at(i).make_lower();
3431 template <
typename ITERABLE >
3432 void make_upper(ITERABLE & iterable)
3434 for (
typename ITERABLE::iterator i = 0; i < iterable.get_count(); i++)
3436 iterable.element_at(i).make_upper();
3460 template <
typename ITERABLE,
typename ITYPE >
3461 ITYPE encode_v16(
const ITERABLE & iterable)
3464 for (::i32 u = 0; u < iterable.get_count(); u++)
3466 ITYPE & str = iterable.element_at(u);
3467 strEncode += hex::lower_from((const_char_pointer )str);
3495 template <
typename ITERABLE,
typename ITYPE >
3496 void decode_v16(
const ITERABLE & iterable,
const ITYPE & psz)
3499 char_pointer str =
nullptr;
3500 if (scopedstr ==
nullptr)
3502 while (*psz !=
'\0')
3511 const ITYPE & pszEnd;
3512 ::i32 iConversion = ::ansi_to_int(sz, &pszEnd, 16);
3513 ::i8 ch =
static_cast <::i8
> (iConversion);
3524 str = (char_pointer )::system()->m_pheapmanagement->memory(::heap::e_memory_main)->allocate(iSize);
3526 else if (iSize < (ansi_length(str) + 1))
3528 char_pointer strOld = str;
3530 char_pointer strNew = (char_pointer )::system()->m_pheapmanagement->memory(::heap::e_memory_main)->allocate(iSize);
3531 ansi_copy(strNew, strOld);
3545 template <
typename ITERABLE,
typename ITYPE >
3546 ::collection::count get_count_except(
const ITERABLE & iterable,
const ITYPE & str)
3549 ::collection::count c = get_count();
3551 for (
typename ITERABLE::iterator i = 0; i < get_count(); i++)
3554 if (element_at(i) == str)
3564 template <
typename ITERABLE,
typename ITERABLE2 >
3565 ::collection::count get_count_except_iter(
const ITERABLE & iterable,
const ITERABLE2 & iterable2)
3568 ::collection::count c = get_count();
3570 for (
auto & item : iterable)
3573 if (stra.contains(item))
3584 template <
typename ITERABLE,
typename ITYPE >
3585 ::collection::count case_insensitive_get_count_except(
const ITERABLE & iterable,
const ITYPE & str)
3588 ::collection::count c = get_count();
3590 for (
typename ITERABLE::iterator i = 0; i < get_count(); i++)
3593 if (element_at(i).CompareNoCase(str) == 0)
3603 template <
typename ITERABLE,
typename ITERABLE2 >
3604 ::collection::count case_insensitive_get_count_except_iter(
const ITERABLE & iterable,
const ITERABLE2 & iterable2)
3607 ::collection::count c = get_count();
3609 for (
auto & item : iterable)
3612 if (stra.case_insensitive_contains(item))
3623 template <
typename ITERABLE,
typename ITYPE >
3624 ITYPE & get_network_payload(
const ITERABLE & iterable, ITYPE & str,
bool bNewLine)
3629 auto it = iterable.begin();
3631 if (iterable.get_count() > 0)
3644 for (; iterable.valid_iter(it, iterable.end()); it++)
3685 template <
typename ITERABLE,
typename ITYPE,
typename ITYPE2,
typename ITYPE3 >
3686 void implode_ex(
const ITERABLE & iterable, ITYPE & str,
const ITYPE2 & lpcszSeparator,
const ITYPE3 & lpcszLastSeparator,
typename ITERABLE::const_iterator start,
typename ITERABLE::const_iterator end)
3691 ITYPE strSeparator(lpcszSeparator);
3693 if (start ==
nullptr)
3696 start = iterable.upper_bound();
3700 typename ITERABLE::iterator last;
3705 start = iterable.upper_bound();
3718 if (i != iterable.end())
3721 for (; i != last; i++)
3724 str += strSeparator;
3730 str += lpcszLastSeparator;
3743 template <
typename ITERABLE,
typename ITYPE >
3744 void if_prefix_implode_ex(
const ITERABLE & iterable, ITYPE & str,
const ITYPE & lpcszIfHasElementPrefix,
const ITYPE & lpcszSeparator,
const ITYPE & lpcszLastSeparator,
bool bUseLast,
typename ITERABLE::iterator start, ::collection::count count)
3749 ITYPE strSeparator(lpcszSeparator);
3753 start += iterable.get_size();
3755 typename ITERABLE::iterator last;
3758 last = iterable.get_size() + count;
3762 last = start + count - 1;
3766 str += lpcszIfHasElementPrefix;
3768 for (
typename ITERABLE::iterator i = start; i <= last; i++)
3772 if (i == last && bUseLast)
3774 str += lpcszLastSeparator;
3778 str += strSeparator;
3781 str += iterable.element_at(i);
3786 template <
typename ITERABLE,
typename ITYPE >
3787 typename ITERABLE::ITYPE if_prefix_implode_ex(
const ITERABLE & iterable,
const ITYPE & lpcszIfHasElementPrefix,
const ITYPE & lpcszSeparator,
const ITYPE & lpcszLastSeparator,
bool bUseLast,
typename ITERABLE::iterator iStart,
typename ITERABLE::iterator iEnd)
3790 if_prefix_implode_ex(str, lpcszIfHasElementPrefix, lpcszSeparator, lpcszLastSeparator, bUseLast, iStart, iEnd);
3796 template <
typename ITERABLE >
3797 void c_add(ITERABLE & iterable, char_pointer * ppsz, ::collection::count c)
3800 for (
typename ITERABLE::iterator i = 0; i < c; i++)
3803 iterable.add(ppsz[i]);
3805 free((
void *)ppsz[i]);
3814 template <
typename ITERABLE >
3815 void c_add(ITERABLE & iterable, char_pointer * ppszParam)
3818 char_pointer * ppsz = ppszParam;
3820 while (ppsz !=
nullptr)
3823 char_pointer psz = *ppsz;
3825 iterable.add(scopedstr);
3838 template <
typename ITERABLE >
3839 void c_add(ITERABLE & iterable,
wchar_t ** ppsz, ::collection::count c)
3842 for (
typename ITERABLE::iterator i = 0; i < c; i++)
3845 iterable.add(ppsz[i]);
3847 free((
void *)ppsz[i]);
3856 template <
typename ITERABLE >
3857 void c_add(ITERABLE & iterable,
wchar_t ** ppszParam)
3860 wchar_t ** ppsz = ppszParam;
3862 while (ppsz !=
nullptr)
3865 wchar_t * psz = *ppsz;
3867 iterable.add(scopedstr);
3880 template <
typename ITERABLE,
typename ITERABLE2 >
3881 ITERABLE & copy_iter(ITERABLE & iterable,
const ITERABLE2 & iterable2)
3884 for (
auto & item : iterable2)
3897 template <
typename ITERABLE,
typename ITERABLE2 >
3898 ITERABLE & copy_from(ITERABLE & iterable,
const ITERABLE2 & iterable2)
3901 return copy_iter(iterable, iterable2.begin(), iterable2.end());
3906 template <
typename ITERABLE,
typename ITERATOR >
3907 ITERABLE & copy_from(ITERABLE & iterable, ITERATOR & iterator, ITERATOR & limit)
3912 iterable.provision(iterator, limit);
3914 for (; iterator != limit; iterator++)
3917 iterable.add(as_string(*iterator));
3926 template <
typename ITERABLE >
3927 ITERABLE & copy(ITERABLE & iterable, ::payload varSrc)
3930 iterable.erase_all();
3932 if (varSrc.get_type() == ::e_type_string_array)
3935 varSrc.get_array(iterable);
3940 if (varSrc.get_count() == 1)
3943 add((ITYPE)varSrc.get_string());
3946 else if (varSrc.get_count() > 1)
3949 varSrc.get_array(iterable);
3960 template <
typename ITERABLE,
typename ITERABLE2 >
3961 ITERABLE2 & slice(ITERABLE & iterable, ITERABLE2 & iterable2,
typename ITERABLE::iterator first,
typename ITERABLE::iterator last)
3964 iterable.prepare_first_last(first, last);
3966 for (; iterable.valid_iter(first, last); first++)
3969 iterable2.add(*first);
3973 iterable.erase(first, last);
3980 template <
typename ITERABLE,
typename ITERABLE2 >
3981 ITERABLE2 & islice(ITERABLE & iterable, ITERABLE2 & iterable2, index first, ::collection::count count)
3984 iterable.iprepare_first_count(first, count);
3986 for (; first < count; first++)
3989 iterable2.add(iterable.element_at(first));
3993 iterable.erase_at(first, count-first);
3999 template <
typename ITERABLE,
typename ITYPE >
4000 ITERABLE & add_data(ITERABLE & iterable,
const ITYPE * pdata, ::collection::count count)
4003 for (::collection::index i = 0; i < count; i++)
4006 iterable.add(pdata[i]);
4015 template <
typename ITERABLE,
typename ITYPE >
4016 ITERABLE & add_item(ITERABLE & iterable,
const ITYPE & t, ::collection::count n)
4037template <
typename ITERABLE >
4043 typedef typename ITERABLE::iterator iterator;
4044 typedef typename ITERABLE::const_iterator const_iterator;
4045 typedef typename ITERABLE Iterable;
4046 typedef typename Iterable::BASE_TYPE Type;
4050 template <
typename ITYPE >
4051 bool add_unique(
const ITYPE & str)
4054 return ::iter::add_unique(*
this, str);
4059 template <
typename ITYPE >
4060 bool case_insensitive_add_unique(
const ITYPE & str)
4063 return ::iter::case_insensitive_add_unique(*
this, str);
4068 template <
typename ITYPE >
4069 bool case_insensitive_contains_iter(
const ITYPE & str,
typename ITERABLE::iterator find = 0,
typename ITERABLE::iterator last =
nullptr, ::collection::count countMin = 1, ::collection::count countMax = -1)
const
4072 return ::iter::case_insensitive_contains(*
this, str, find, last, countMin, countMax);
4077 template <
typename ITYPE >
4078 bool contains_iter(
const ITYPE & str,
typename ITERABLE::iterator find = 0,
typename ITERABLE::iterator last =
nullptr, ::collection::count countMin = 1, ::collection::count countMax = -1)
const
4081 return ::iter::contains(*
this, str, find, last, countMin, countMax);
4086 template <
typename ITYPE >
4087 bool case_insensitive_icontains(
const ITYPE & str, ::collection::index find, ::collection::count count, ::collection::count countMin , ::collection::count countMax = -1)
const
4090 return ::iter::case_insensitive_icontains(*
this, str, find, last, countMin, countMax);
4095 template <
typename ITYPE >
4096 bool icontains(
const ITYPE & str, ::collection::index find, ::collection::count count, ::collection::count countMin , ::collection::count countMax = -1)
const
4099 return ::iter::icontains(*
this, str, find, last, countMin, countMax);
4103 template <
typename ITYPE >
4104 Type implode(
const ITYPE & lpcszSeparator =
"",
typename ITERABLE::const_iterator iStart = 0,
typename ITERABLE::const_iterator iEnd =
nullptr)
const
4109 ::iter::implode(*
this, value, lpcszSeparator, iStart, iEnd);
4115 template <
typename ITYPE,
typename ITYPE2 >
4116 Type implode_ex(
const ITYPE & lpcszSeparator =
"",
const ITYPE2 & lpcszLastSeparator =
"",
typename ITERABLE::const_iterator iStart = 0,
typename ITERABLE::const_iterator iEnd =
nullptr)
const
4121 ::iter::implode_ex(*
this, value, lpcszSeparator, lpcszLastSeparator, iStart, iEnd);
4128 template <
typename ITERABLE2,
typename ITYPE >
4129 void prefix(
const ITERABLE2 & iterable2,
const ITYPE & pszPrefix,
typename ITERABLE2::const_iterator first =
nullptr,
typename ITERABLE2::const_iterator last =
nullptr)
4132 ::iter::prefix(*
this, iterable2, pszPrefix, first, last);
4136 template <
typename ITERABLE2,
typename ITYPE >
4137 void suffix(
const ITERABLE2 & iterable2,
const ITYPE & pszSuffix,
typename ITERABLE2::const_iterator first =
nullptr,
typename ITERABLE2::const_iterator last =
nullptr)
4140 ::iter::suffix(*
this, iterable2, pszSuffix, first, last);
4144 template <
typename ITERABLE2,
typename ITYPE,
typename ITYPE2 >
4145 void surround(
const ITERABLE2 & iterable2,
const ITYPE & pszPrefix =
"",
const ITYPE2 & pszSuffix =
"",
typename ITERABLE2::iterator first =
nullptr,
typename ITERABLE2::const_iterator last =
nullptr)
4148 ::iter::surround(*
this, iterable2, pszPrefix, pszSuffix, first, last);
4152 template <
typename ITYPE >
4153 void prefix(
const ITYPE & pszPrefix,
typename ITERABLE::iterator first =
nullptr,
typename ITERABLE::iterator last =
nullptr)
4156 ::iter::surround(*
this, pszPrefix, first, last);
4160 template <
typename ITYPE >
4161 void suffix(
const ITYPE & pszSuffix,
typename ITERABLE::iterator first =
nullptr,
typename ITERABLE::iterator last =
nullptr)
4164 ::iter::surround(*
this, pszSuffix, first, last);
4169 template <
typename ITYPE,
typename ITYPE2 >
4170 void surround(
const ITYPE & pszPrefix =
"",
const ITYPE & pszSuffix =
"",
typename ITERABLE::iterator first = 0,
typename ITERABLE::iterator last =
nullptr)
4173 ::iter::surround(*
this, pszPrefix, pszSuffix, first, last);
4178 template <
typename ITYPE,
typename ITYPE2,
typename ITYPE3 >
4179 void surround_and_implode(
const ITYPE & str,
const ITYPE2 & lpcszSeparator =
"",
const ITYPE3 & pszPrefix =
"",
const ITYPE2 & pszSuffix =
nullptr,
typename ITERABLE::iterator first =
nullptr,
typename ITERABLE::iterator last =
nullptr)
4182 ::iter::surround(*
this, lpcszSeparator, pszPrefix, lpszSuffix, first, last);
4189 template <
typename ITYPE,
typename ITYPESEP >
4190 Container & add_tokens(
const ITYPE & pcsz,
const ITYPESEP & lpcszSeparator,
bool bAddEmpty =
true)
4193 return ::iter::add_tokens(*
this, pcsz, lpcszSeparator, bAddEmpty);
4197 template <
typename ITYPE >
4198 Container & add_lines(
const ITYPE & str,
bool bAddEmpty =
true)
4201 return ::iter::add_lines(*
this, str, bAddEmpty);
4205 template <
typename ITYPE,
typename ITERABLE2 >
4206 Container & add_shortest_tokens(
const ITYPE & pcsz,
const ITERABLE2 & iterableSeparator,
bool bAddEmpty =
true,
bool bWithSeparator =
false)
4209 return ::iter::add_shortest_tokens(*
this, pcsz, iterableSeparator, bAddEmpty, bWithSeparator);
4213 template <
typename ITYPE >
4214 Container & trim_right(
const ITYPE & pszChars)
4217 return ::iter::trim_right(*
this, pszChars);
4221 template <
typename ITYPE >
4222 Container & trim_left(
const ITYPE & pszChars)
4225 return ::iter::trim_left(*
this, pszChars);
4229 template <
typename ITYPE >
4230 Container & trim(
const ITYPE & pszChars)
4233 return ::iter::trim(*
this, pszChars);
4241 template <
typename ITYPE >
4242 Container & preferred(
const ITYPE & pcsz)
4245 return ::iter::preferred(*
this, pcsz);
4250 template <
typename ITERABLE2 >
4251 Container & preferred_iter(
const ITERABLE2 & iterable2)
4254 return ::iter::preferred_iter(*
this, iterable2);
4258 template <
typename ITERABLE2 >
4259 ::collection::count erase_iter(
const ITERABLE2 & iterable2)
4262 return ::iter::erase_iter(*
this, iterable2);
4267 template <
typename ITERABLE2 >
4268 Container & add_iter(
const ITERABLE2 & iterable2)
4271 return ::iter::add_iter(*
this, iterable2);
4276 template <
typename ITERABLE2 >
4277 Container diff(
const ITERABLE2 & iterable2)
const
4280 return ::iter::diff(*
this, iterable2);
4285 template <
typename ITERABLE2 >
4286 Container sum(
const ITERABLE2 & iterable2)
const
4289 return ::iter::sum(*
this, iterable2);
4293 template <
typename ITYPE >
4294 ::collection::count case_insensitive_erase_element_iter(
const ITYPE & pcsz,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr, ::collection::count countMin = 0, ::collection::count countMax = -1)
4297 return ::iter::case_insensitive_erase(pcsz, find, last, countMin, countMax);
4301 template <
typename ITYPE >
4302 ::collection::count erase_element_iter(
const ITYPE & pcsz,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr, ::collection::count countMin = 0, ::collection::count countMax = -1)
4305 return ::iter::case_insensitive_erase(pcsz, find, last, countMin, countMax);
4310 template <
typename ITYPE >
4311 typename ITERABLE::iterator case_insensitive_reverse_find(
const ITYPE & pcsz,
typename ITERABLE::iterator find = -1,
typename ITERABLE::iterator last = 0)
4314 return ::iter::case_insensitive_reverse_find(*
this, pcsz, find, last);
4318 template <
typename ITYPE >
4319 typename ITERABLE::iterator rear_find(
const ITYPE & pcsz,
typename ITERABLE::iterator find = -1,
typename ITERABLE::iterator last = 0)
4322 return ::iter::rear_find(*
this, pcsz, find, last);
4326 template <
typename ITYPE >
4327 typename ITERABLE::iterator any_suffixes(
const ITYPE & lpcszIsSuffixed,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr)
4330 return ::iter::any_suffixes(*
this, lpcszIsSuffixed, find, last);
4334 template <
typename ITYPE >
4335 bool any_case_insensitive_suffixes(
const ITYPE & lpcszIsSuffixed,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr)
4338 return ::iter::any_case_insensitive_suffixes(*
this, lpcszIsSuffixed, find, last) != end();
4342 template <
typename ITYPE >
4343 typename ITERABLE::iterator any_prefixes(
const ITYPE & lpcszIsPrefixed,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr)
4346 return ::iter::any_prefixes(*
this, lpcszIsPrefixed, find, last);
4350 template <
typename ITYPE >
4351 typename ITERABLE::iterator case_insensitive_any_prefixes(
const ITYPE & lpcszIsPrefixed,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr)
4354 return ::iter::case_insensitive_any_prefixes(*
this, lpcszIsPrefixed, find, last);
4358 template <
typename ITYPE >
4359 typename ITERABLE::iterator find_first_ends(
const ITYPE & lpcszSuffix,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr)
4362 return ::iter::find_first_ends(*
this, lpcszSuffix, find, last);
4366 template <
typename ITYPE >
4367 typename ITERABLE::iterator case_insensitive_find_first_ends(
const ITYPE & lpcszSuffix,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr)
4370 return ::iter::case_insensitive_find_first_ends(*
this, lpcszSuffix, find, last);
4374 template <
typename ITYPE >
4375 typename ITERABLE::iterator find_first_ends_eat(ITYPE & str,
const ITYPE & pcsz,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr)
4378 return ::iter::find_first_ends_eat(*
this, str, pcsz, find, last);
4382 template <
typename ITYPE >
4383 typename ITERABLE::iterator case_insensitive_find_first_ends_eat(ITYPE & str,
const ITYPE & pcsz,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr)
4386 return ::iter::case_insensitive_find_first_ends_eat(*
this, str, pcsz, find, last);
4390 template <
typename ITYPE >
4391 typename ITERABLE::iterator find_first_begins(
const ITYPE & lpcszPrefix,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr)
4394 return ::iter::find_first_begins(*
this, lpclpcszPrefixsz, find, last);
4398 template <
typename ITYPE >
4399 typename ITERABLE::iterator case_insensitive_find_first_begins(
const ITYPE & lpcszPrefix,
typename ITERABLE::iterator find = 0,
typename ITERABLE::iterator last =
nullptr)
4402 return ::iter::case_insensitive_find_first_begins(*
this, lpcszPrefix, find, last);
4406 template <
typename ITYPE >
4407 typename ITERABLE::iterator find_first_begins_eat(ITYPE & str,
const ITYPE & pcsz,
typename ITERABLE::iterator find = 0,
typename ITERABLE::iterator last =
nullptr)
4410 return ::iter::find_first_begins_eat(*
this, str, pcsz, find, last);
4414 template <
typename ITYPE >
4415 typename ITERABLE::iterator case_insensitive_find_first_begins_eat(ITYPE & str,
const ITYPE & pcsz,
typename ITERABLE::iterator find = 0,
typename ITERABLE::iterator last =
nullptr)
4418 return ::iter::case_insensitive_find_first_begins_eat(*
this, str, pcsz, find, last);
4422 template <
typename STRITERABLE,
typename ITYPE >
4423 ::collection::count case_insensitive_get_begins(STRITERABLE & stra,
const ITYPE & pcsz,
typename ITERABLE::iterator first = 0,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr)
4426 return ::iter::case_insensitive_get_begins(*
this, stra, pcsz, first, last);
4431 template <
typename ITYPE >
4432 ::collection::count case_insensitive_filter_begins(
const ITYPE & pcsz,
typename ITERABLE::iterator first = 0,
typename ITERABLE::iterator last =
nullptr)
4435 return ::iter::case_insensitive_filter_begins(*
this, pcsz, first, last);
4440 template <
typename PRED >
4441 ::collection::count filter(PRED pred,
typename ITERABLE::iterator first = 0,
typename ITERABLE::iterator last =
nullptr)
4444 return ::iter::filter(*
this, pred, first, last);
4448 template <
typename PRED >
4449 ::collection::count filter_out(PRED pred,
typename ITERABLE::iterator first = 0,
typename ITERABLE::iterator last =
nullptr)
4452 return ::iter::filter_out(*
this, pred, first, last);
4456 template <
typename PRED,
typename ArrayOut >
4457 ::collection::count filter_out(PRED pred, ArrayOut & a,
typename ITERABLE::iterator first = 0,
typename ITERABLE::iterator last =
nullptr)
4460 return ::iter::filter_out(*
this, pred, a, first, last);
4464 template <
typename ITYPE >
4465 ::collection::count case_insensitive_erase_first(
const ITYPE & pcsz,
typename ITERABLE::iterator find =
nullptr,
typename ITERABLE::iterator last =
nullptr)
4468 return ::iter::case_insensitive_erase_first(*
this, pcsz, first, last);
4472 using ITERABLE::erase_first;
4473 template <
typename ITYPE >
4474 ::collection::count erase_first(
const ITYPE & pcsz,
typename ITERABLE::iterator first =
nullptr,
typename ITERABLE::iterator last =
nullptr)
4477 return ::iter::erase_first(*
this, pcsz, first, last);
4481 template <
typename ITYPE >
4482 ::collection::count case_insensitive_erase_last(
const ITYPE & pcsz,
typename ITERABLE::iterator first =
nullptr,
typename ITERABLE::iterator last =
nullptr)
4485 return ::iter::case_insensitive_erase_last(*
this, pcsz, first, last);
4490 using ITERABLE::erase_last;
4491 template <
typename ITYPE >
4492 ::collection::count erase_last(
const ITYPE & pcsz,
typename ITERABLE::iterator first =
nullptr,
typename ITERABLE::iterator last =
nullptr)
4495 return ::iter::erase_last(*
this, pcsz, first, last);
4503 template <
typename ITYPESEP,
typename ITYPE2 >
4504 Container & explode(
const ITYPESEP & strSeparator,
const ITYPE2 & str)
4507 return ::iter::explode(*
this, strSeparator, str);
4512 template <
typename ITYPE >
4513 Container & csstidy_explode_ws(const ::i8 sep,
const ITYPE & psz)
4516 return ::iter::csstidy_explode_ws(*
this, sep, psz);
4520 template <
typename ITYPE >
4521 void get_format_string(
const ITYPE & str,
const ITYPE & lpcszSeparator)
const
4524 return ::iter::get_format_string(*
this, str, lpcszSeparator);
4528 template <
typename ITYPE >
4529 ITYPE & get_network_payload(ITYPE & str,
bool bNewLine =
true)
const
4532 return ::iter::get_network_payload(*
this, str, bNewLine);
4536 template <
typename ITYPE >
4537 void c_add(char_pointer * ppsz, ::collection::count iCount)
4540 return ::iter::c_add(*
this, ppsz, iCount);
4544 template <
typename ITYPE >
4545 void c_add(char_pointer * ppsz)
4548 return ::iter::c_add(*
this, ppsz);
4552 template <
typename ITYPE >
4553 void c_add(
wchar_t ** ppsz, ::collection::count iCount)
4556 return ::iter::c_add(*
this, ppsz, iCount);
4560 template <
typename ITYPE >
4561 void c_add(
wchar_t ** ppsz)
4564 return ::iter::c_add(ppsz);
4569 template <
typename ITYPE >
4570 bool contains_key(
const ITYPE & key)
const
4573 return ::iter::contains_key(*
this, key);
4578 template <
typename ITYPE >
4579 bool contains_payload(
const ITYPE & value)
const
4582 return ::iter::contains_payload(*
this, value);
4587 template <
typename ITYPE >
4588 bool contains(
const ITYPE & value)
const
4591 return ::iter::contains(*
this, value);
4596 template <
typename ITYPE >
4597 bool contains(
const ITYPE & value, const_iterator first, const_iterator last =
nullptr)
const
4600 return ::iter::contains(*
this, value, first, last);
4604 template <
typename ITYPE >
4605 bool case_insensitive_icontains(
const ITYPE & value, index first = 0, ::collection::count count = -1)
const
4608 return ::iter::case_insensitive_icontains(*
this, value, first, count);
4613 template <
typename ITYPE >
4614 bool icontains(
const ITYPE & value, index first = 0, ::collection::count count = -1)
const
4617 return ::iter::icontains(*
this, value, first, count);
4621 template <
typename ITYPE >
4622 ::collection::count erase(
const ITYPE & value)
4625 return ::iter::erase(*
this, value);
4630 template <
typename ITERABLE2 >
4631 ITERABLE & intersect(
const ITERABLE2 & iterable2)
4634 return ::iter::intersect(*
this, iterable2);
4638 template <
typename ITERABLE2 >
4639 typename ::collection::count add_unique_iter(
const ITERABLE2 & stra)
4642 return ::iter::add_unique_iter(*
this, stra);
4646 template <
typename ITERABLE2 >
4647 typename ::collection::count case_insensitive_add_unique_iter(
const ITERABLE2 & stra)
4650 return ::iter::case_insensitive_add_unique_iter(*
this, stra);
4654 template <
typename PRED >
4655 bool predicate_erase_first(PRED pred)
4658 return ::iter::predicate_erase_first(*
this, pred);
4662 template <
typename PRED >
4663 typename ITERABLE::const_iterator predicate_find_first(PRED pred,
typename ITERABLE::const_iterator first =
nullptr,
typename ITERABLE::const_iterator last =
nullptr)
const
4666 return ::iter::predicate_find_first(*
this, pred, first, last);
4670 template <
typename PRED >
4671 typename ITERABLE::iterator predicate_find_first(PRED pred,
typename ITERABLE::iterator first =
nullptr,
typename ITERABLE::iterator last =
nullptr)
4674 return ::iter::predicate_find_first(*
this, pred, first, last);
4678 template <
typename ITERATOR >
4679 Container slice(ITERATOR first, ITERATOR last =
nullptr)
4682 Container iterableSlice;
4684 ::iter::slice(*
this, iterableSlice, first, last);
4686 return iterableSlice;
4691 template <
typename ::i32,
typename INT2 >
4692 Container islice(::i32 first, INT2 count = -1)
4695 Container iterableSlice;
4697 ::iter::islice(*
this, iterableSlice, first, count);
4699 return iterableSlice;
4705 template <
typename ITYPE >
4706 typename index ifind_first_begins(
const ITYPE & lpcszPrefix,
typename ITERABLE::const_iterator find =
nullptr,
typename ITERABLE::const_iterator last =
nullptr)
const
4709 return ::iter::ifind_first_begins(*
this, lpcszPrefix, find, last);
4714 template <
typename ITYPE >
4715 typename index ifind_first_begins(
const ITYPE & lpcszPrefix, index first = 0, ::collection::count count = -1)
4718 return ::iter::ifind_first_begins(*
this, lpcszPrefix, first, count);
4723 template <
typename ITYPE >
4724 typename index ifind_first(
const ITYPE & lpcszPrefix, ::collection::index find = 0, ::collection::count count = -1)
const
4727 return ::iter::ifind_first(*
this, lpcszPrefix, find, count);
4732 template <
typename ITYPE >
4733 typename index ifind_first(
const ITYPE & lpcszPrefix, ::collection::index find = 0, ::collection::count count = -1)
4736 return ::iter::ifind_first(*
this, lpcszPrefix, find, count);
4741 template <
typename ITYPE >
4742 typename index case_insensitive_ifind_first(
const ITYPE & lpcszPrefix, ::collection::index find = 0, ::collection::count count = -1)
const
4745 return ::iter::case_insensitive_ifind_first(*
this, lpcszPrefix, find, count);
4749 template <
typename ITYPE >
4750 typename index case_insensitive_ifind_first(
const ITYPE & lpcszPrefix, ::collection::index find = 0, ::collection::count count = -1)
4753 return ::iter::case_insensitive_ifind_first(*
this, lpcszPrefix, find, count);
4762 template <
typename SWAP >
4763 void swap_quick_sort(SWAP __swap,
bool bAscending)
4766 ::sort::swap_quick_sort(*
this, __swap, bAscending);
4770 template <
typename SWAP >
4771 void swap_quick_sort(SWAP __swap)
4774 ::sort::swap_quick_sort(*
this, __swap);
4778 template <
typename SWAP >
4779 void swap_quick_sort_descending(SWAP __swap)
4782 ::sort::swap_quick_sort_desceding(*
this, __swap);
4786 template <
typename SWAP >
4787 void case_insensitive_swap_quick_sort(SWAP __swap,
bool bAscending)
4790 ::sort::swap_quick_sort(*
this, __swap, bAscending);
4794 template <
typename SWAP >
4795 void case_insensitive_swap_quick_sort(SWAP __swap)
4798 ::sort::swap_quick_sort(*
this, __swap);
4802 template <
typename SWAP >
4803 void swap_quick_sort_ci_descending(SWAP __swap)
4806 ::sort::swap_quick_sort_desceding(*
this, __swap);
4816 template <
typename PRED >
4817 void predicate_quick_sort(PRED pred,
bool bAscending)
4820 ::sort::predicate_quick_sort(*
this, pred, bAscending);
4825 template <
typename PRED >
4826 void predicate_quick_sort(PRED pred)
4829 ::sort::predicate_quick_sort(*
this, pred);
4834 template <
typename PRED >
4835 void predicate_quick_sort_descending(PRED pred)
4838 ::sort::predicate_quick_sort_descending(*
this, pred);
4847 template <
typename PRED,
typename SWAP >
4848 void predicate_swap_quick_sort(PRED pred, SWAP __swap,
bool bAscending)
4851 ::sort::predicate_swap_quick_sort(*
this, pred, bAscending);
4856 template <
typename PRED,
typename SWAP >
4857 void predicate_swap_quick_sort(PRED pred, SWAP __swap)
4860 ::sort::predicate_swap_quick_sort(*
this, pred);
4864 template <
typename PRED,
typename SWAP >
4865 void predicate_swap_quick_sort_descending(PRED pred, SWAP __swap)
4868 ::sort::predicate_swap_quick_sort_descending(*
this, pred, bAscending);
4877 template <
typename INDEX_ARRAY >
4878 void get_quick_sort(
const INDEX_ARRAY & ia)
4881 ::sort::get_quick_sort(*
this, ia);
4885 template <
typename INDEX_ARRAY >
4886 void case_insensitive_get_quick_sort(
const INDEX_ARRAY & ia)
4889 ::sort::case_insensitive_get_quick_sort(*
this, ia);
4894 template <
typename ITERABLE2 >
4895 bool is_equal(
const ITERABLE2 & iterable2)
const
4898 if (iterable2.get_count() != get_count())
4907 auto b = iterable2.begin();
4909 for (; valid_iter(a, end()) && iterable2.valid_iter(b, iterable2.end()); a++, b++)
4921 return a == end() && b == iterable2.end();
Definition iterable.h:4040