8#ifndef INCLUDED_BSLSTL_ITERATORUTIL
9#define INCLUDED_BSLSTL_ITERATORUTIL
86#include <bslscm_version.h>
98#ifndef BDE_DONT_ALLOW_TRANSITIVE_INCLUDES
105#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
106 template <
typename t_ITERATOR>
107 concept IteratorUtil_ModernIterator =
108 requires {
typename t_ITERATOR::iterator_concept; };
124template <
class t_INPUT_ITERATOR,
126 bool t_MATCHING_SENTINEL =
137 typename bsl::iterator_traits<t_INPUT_ITERATOR>::difference_type
138 doCalc(
const t_INPUT_ITERATOR&,
139 const t_INPUT_ITERATOR&,
140 const std::input_iterator_tag&);
142 typename bsl::iterator_traits<t_INPUT_ITERATOR>::difference_type
143 doCalc(
const t_INPUT_ITERATOR& first,
144 const t_INPUT_ITERATOR& last,
145 const std::forward_iterator_tag&);
160 typename bsl::iterator_traits<t_INPUT_ITERATOR>::difference_type
161 insertDistance(
const t_INPUT_ITERATOR& first,
const t_SENTINEL& last);
169template <
class t_INPUT_ITERATOR,
class t_SENTINEL>
178 typename bsl::iterator_traits<t_INPUT_ITERATOR>::difference_type
179 insertDistance(
const t_INPUT_ITERATOR& first,
const t_SENTINEL& last);
193 template <
class t_INPUT_ITERATOR,
class t_SENTINEL>
205 template <
class t_INPUT_ITERATOR,
class t_SENTINEL>
206 static typename bsl::iterator_traits<t_INPUT_ITERATOR>::difference_type
208 const t_SENTINEL& last);
210#ifdef BSLS_COMPILERFEATURES_SUPPORT_ALIAS_TEMPLATES
216 template <
class INPUT_ITER>
217 using IterVal_t =
typename bsl::iterator_traits<INPUT_ITER>::value_type;
221 template <
class INPUT_ITER>
222 using IterKey_t = bsl::remove_const_t<
223 typename bsl::iterator_traits<INPUT_ITER>::value_type::first_type>;
227 template <
class INPUT_ITER>
229 typename bsl::iterator_traits<INPUT_ITER>::value_type::second_type;
234 template <
class INPUT_ITER>
237 typename bsl::iterator_traits<INPUT_ITER>::value_type::first_type>,
238 typename bsl::iterator_traits<INPUT_ITER>::value_type::second_type
251template <
class t_INPUT_ITERATOR,
253 bool t_MATCHING_SENTINEL>
257 t_MATCHING_SENTINEL>::canCalculate()
260 typename bsl::iterator_traits<t_INPUT_ITERATOR>::iterator_category,
261 bsl::forward_iterator_tag>::value;
264template <
class t_INPUT_ITERATOR,
266 bool t_MATCHING_SENTINEL>
267typename bsl::iterator_traits<t_INPUT_ITERATOR>::difference_type
270 t_MATCHING_SENTINEL>::doCalc(
271 const t_INPUT_ITERATOR&,
272 const t_INPUT_ITERATOR&,
273 const std::input_iterator_tag&)
278template <
class t_INPUT_ITERATOR,
280 bool t_MATCHING_SENTINEL>
281typename bsl::iterator_traits<t_INPUT_ITERATOR>::difference_type
282IteratorUtil_LegacyInsertDistance<t_INPUT_ITERATOR,
284 t_MATCHING_SENTINEL>::doCalc(
285 const t_INPUT_ITERATOR& first,
286 const t_INPUT_ITERATOR& last,
287 const std::forward_iterator_tag&)
289 return bsl::distance(first, last);
292template <
class t_INPUT_ITERATOR,
294 bool t_MATCHING_SENTINEL>
295typename bsl::iterator_traits<t_INPUT_ITERATOR>::difference_type
296IteratorUtil_LegacyInsertDistance<t_INPUT_ITERATOR,
298 t_MATCHING_SENTINEL>::insertDistance(
299 const t_INPUT_ITERATOR& first,
300 const t_SENTINEL& last)
302 typedef typename bsl::iterator_traits<t_INPUT_ITERATOR>::iterator_category
305 static_cast<const t_INPUT_ITERATOR&
>(last),
309template <
class t_INPUT_ITERATOR,
314 false>::canCalculate()
319template <
class t_INPUT_ITERATOR,
321typename bsl::iterator_traits<t_INPUT_ITERATOR>::difference_type
324 false>::insertDistance(
325 const t_INPUT_ITERATOR&,
335template <
class t_INPUT_ITERATOR,
class t_SENTINEL>
342#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
343 typedef typename bsl::iterator_traits<t_INPUT_ITERATOR>::iterator_category
349 if constexpr (IteratorUtil_ModernIterator<t_INPUT_ITERATOR>
350 || !bsl::is_convertible_v<t_SENTINEL, t_INPUT_ITERATOR>)
352 if constexpr (bsl::input_iterator<t_INPUT_ITERATOR>
353 && bsl::sentinel_for<t_SENTINEL, t_INPUT_ITERATOR>)
355 if constexpr (bsl::forward_iterator<t_INPUT_ITERATOR>
356 && bsl::is_convertible_v<IterCategory,
357 bsl::forward_iterator_tag>) {
373 t_SENTINEL>::canCalculate();
375#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
380template <
class t_INPUT_ITERATOR,
class t_SENTINEL>
381typename bsl::iterator_traits<t_INPUT_ITERATOR>::difference_type
383 const t_SENTINEL& last)
389#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
390 typedef typename bsl::iterator_traits<t_INPUT_ITERATOR>::iterator_category
393 if constexpr (IteratorUtil_ModernIterator<t_INPUT_ITERATOR>
394 || !bsl::is_convertible_v<t_SENTINEL, t_INPUT_ITERATOR>)
397 if constexpr (bsl::input_iterator<t_INPUT_ITERATOR>
398 && bsl::sentinel_for<t_SENTINEL, t_INPUT_ITERATOR>)
412 if constexpr (bsl::forward_iterator<t_INPUT_ITERATOR>
413 && bsl::is_convertible_v<IterCategory,
414 bsl::forward_iterator_tag>) {
415 return bsl::ranges::distance(first, last);
432#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES)
Definition bslstl_pair.h:1280
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_KEYWORD_CONSTEXPR
Definition bsls_keyword.h:624
Definition bslstl_algorithm.h:84
Definition bslmf_isconvertible.h:875
Definition bslstl_iteratorutil.h:129
static BSLS_KEYWORD_CONSTEXPR bool canCalculate()
Definition bslstl_iteratorutil.h:257
static bsl::iterator_traits< t_INPUT_ITERATOR >::difference_type insertDistance(const t_INPUT_ITERATOR &first, const t_SENTINEL &last)
Definition bslstl_iteratorutil.h:298
Definition bslstl_iteratorutil.h:190
static BSLS_KEYWORD_CONSTEXPR bool canCalculateInsertDistance()
Definition bslstl_iteratorutil.h:336
static bsl::iterator_traits< t_INPUT_ITERATOR >::difference_type insertDistance(const t_INPUT_ITERATOR &first, const t_SENTINEL &last)
Definition bslstl_iteratorutil.h:382