8#ifndef INCLUDED_BSLSTL_ITERATOR
9#define INCLUDED_BSLSTL_ITERATOR
218#include <bslscm_version.h>
228#if BSLS_COMPILERFEATURES_FULL_CPP11
229 #include <initializer_list>
230 #include <type_traits>
233#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES) && \
234 defined(BSLS_LIBRARYFEATURES_STDCPP_LLVM) && _LIBCPP_VERSION < 220000
242#ifndef BDE_DONT_ALLOW_TRANSITIVE_INCLUDES
246#ifdef BSLS_LIBRARYFEATURES_STDCPP_LIBCSTD
247 #define BSLSTL_ITERATOR_IMPLEMENT_CPP11_REVERSE_ITERATOR 1
248 #define BSLSTL_ITERATOR_PROVIDE_SUN_CPP98_FIXES 1
255using std::input_iterator_tag;
256using std::output_iterator_tag;
257using std::forward_iterator_tag;
258using std::bidirectional_iterator_tag;
259using std::random_access_iterator_tag;
267using std::back_insert_iterator;
268using std::back_inserter;
269using std::front_insert_iterator;
270using std::front_inserter;
271using std::insert_iterator;
274#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_BASELINE_LIBRARY
277using std::incrementable;
278using std::incrementable_traits;
279using std::iter_difference_t;
282using std::indirectly_readable_traits;
283using std::iter_value_t;
286using std::iter_reference_t;
287using std::iter_rvalue_reference_t;
290using std::iter_common_reference_t;
293using std::indirectly_readable;
294using std::indirectly_writable;
297using std::weakly_incrementable;
300using std::input_or_output_iterator;
303using std::sentinel_for;
306using std::sized_sentinel_for;
309using std::input_iterator;
312using std::output_iterator;
315using std::forward_iterator;
318using std::bidirectional_iterator;
321using std::random_access_iterator;
324using std::contiguous_iterator;
327using std::indirect_binary_predicate;
328using std::indirect_equivalence_relation;
329using std::indirect_result_t;
330using std::indirect_strict_weak_order;
331using std::indirect_unary_predicate;
332using std::indirectly_regular_unary_invocable;
333using std::indirectly_unary_invocable;
339using std::indirectly_movable;
340using std::indirectly_movable_storable;
343using std::indirectly_copyable;
344using std::indirectly_copyable_storable;
347using std::indirectly_swappable;
350using std::indirectly_comparable;
353using std::permutable;
362using std::contiguous_iterator_tag;
365using std::move_sentinel;
368using std::common_iterator;
371using std::default_sentinel_t;
374using std::counted_iterator;
377using std::unreachable_sentinel_t;
381#ifdef BSLS_LIBRARYFEATURES_HAS_CPP14_BASELINE_LIBRARY
383using std::make_reverse_iterator;
387using std::istream_iterator;
388using std::ostream_iterator;
389using std::istreambuf_iterator;
390using std::ostreambuf_iterator;
392#ifdef BSLS_LIBRARYFEATURES_HAS_CPP11_BASELINE_LIBRARY
394using std::move_iterator;
395using std::make_move_iterator;
401#ifdef BSLS_LIBRARYFEATURES_HAS_CPP23_RANGES_AS_CONST
402using std::const_iterator;
403using std::const_sentinel;
404using std::basic_const_iterator;
405using std::make_const_iterator;
406using std::make_const_sentinel;
407using std::iter_const_reference_t;
410#ifdef BSLSTL_ITERATOR_PROVIDE_SUN_CPP98_FIXES
422struct iterator_traits {
424 typedef typename ITER::iterator_category iterator_category;
425 typedef typename ITER::value_type value_type;
426 typedef typename ITER::difference_type difference_type;
427 typedef typename ITER::pointer pointer;
428 typedef typename ITER::reference reference;
436struct iterator_traits<const TYPE *> {
438 typedef std::random_access_iterator_tag iterator_category;
439 typedef TYPE value_type;
440 typedef std::ptrdiff_t difference_type;
441 typedef const TYPE* pointer;
442 typedef const TYPE& reference;
448struct iterator_traits<TYPE *> {
450 typedef std::random_access_iterator_tag iterator_category;
451 typedef TYPE value_type;
452 typedef std::ptrdiff_t difference_type;
453 typedef TYPE* pointer;
454 typedef TYPE& reference;
458using std::iterator_traits;
461#ifdef BSLSTL_ITERATOR_IMPLEMENT_CPP11_REVERSE_ITERATOR
491class reverse_iterator :
492 public std::reverse_iterator<
494 typename iterator_traits<ITER>::iterator_category,
495 typename iterator_traits<ITER>::value_type,
496 typename iterator_traits<ITER>::reference,
497 typename iterator_traits<ITER>::pointer> {
499 typedef std::reverse_iterator<
501 typename iterator_traits<ITER>::iterator_category,
502 typename iterator_traits<ITER>::value_type,
503 typename iterator_traits<ITER>::reference,
504 typename iterator_traits<ITER>::pointer> Base;
509 typedef typename reverse_iterator::difference_type difference_type;
521 explicit reverse_iterator(ITER base);
525 template <
class OTHER_ITER>
526 reverse_iterator(
const reverse_iterator<OTHER_ITER>& original);
554 reverse_iterator& operator+=(difference_type n);
580 reverse_iterator& operator-=(difference_type n);
592 reverse_iterator
operator+(difference_type n)
const;
602 reverse_iterator
operator-(difference_type n)
const;
617 const reverse_iterator<ITER>&
rhs);
627template <
class ITER1,
class ITER2>
630 const reverse_iterator<ITER2>&
rhs);
643 const reverse_iterator<ITER>&
rhs);
654template <
class ITER1,
class ITER2>
657 const reverse_iterator<ITER2>&
rhs);
671 const reverse_iterator<ITER>&
rhs);
683template <
class ITER1,
class ITER2>
686 const reverse_iterator<ITER2>&
rhs);
700 const reverse_iterator<ITER>&
rhs);
712template <
class ITER1,
class ITER2>
715 const reverse_iterator<ITER2>&
rhs);
730 const reverse_iterator<ITER>&
rhs);
742template <
class ITER1,
class ITER2>
745 const reverse_iterator<ITER2>&
rhs);
760 const reverse_iterator<ITER>&
rhs);
773template <
class ITER1,
class ITER2>
776 const reverse_iterator<ITER2>&
rhs);
787typename reverse_iterator<ITER>::difference_type
789 const reverse_iterator<ITER>&
rhs);
798template <
class ITER,
class DIFF_TYPE>
800reverse_iterator<ITER>
801operator+(DIFF_TYPE n,
const reverse_iterator<ITER>&
rhs);
804using std::reverse_iterator;
807#ifdef BSLSTL_ITERATOR_PROVIDE_SUN_CPP98_FIXES
817struct IteratorDistanceImp {
828 template <
class INPUT_ITER,
class DIFFERENCE_TYPE>
829 static void getDistance(DIFFERENCE_TYPE *ret,
840 template <
class FWD_ITER,
class DIFFERENCE_TYPE>
841 static void getDistance(DIFFERENCE_TYPE *ret,
844 forward_iterator_tag);
853 template <
class RANDOM_ITER,
class DIFFERENCE_TYPE>
854 static void getDistance(DIFFERENCE_TYPE *ret,
857 random_access_iterator_tag);
873typename iterator_traits<ITER>::difference_type
880#ifdef BSLS_LIBRARYFEATURES_HAS_CPP11_RANGE_FUNCTIONS
888typename T::iterator
begin(T& container);
893typename T::const_iterator
begin(
const T& container);
897template<
class T,
size_t N>
898T *
begin(T (&array)[N]);
902template<
class T,
size_t N>
903const T *
begin(
const T (&array)[N]);
908typename T::iterator
end(T& container);
913typename T::const_iterator
end(
const T& container);
917template<
class T,
size_t N>
918T *
end(T (&array)[N]);
922template<
class T,
size_t N>
923const T *
end(
const T (&array)[N]);
927#ifdef BSLS_LIBRARYFEATURES_HAS_CPP14_RANGE_FUNCTIONS
939typename T::const_iterator
cbegin(
const T& container);
943template<
class T,
size_t N>
944const T *
cbegin(
const T (&array)[N]);
949typename T::reverse_iterator
rbegin(T& container);
954typename T::const_reverse_iterator
rbegin(
const T& container);
958template <
class T,
size_t N>
959reverse_iterator<T *>
rbegin(T (&array)[N]);
961#ifdef BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS
965reverse_iterator<const T *>
rbegin(std::initializer_list<T> initializerList);
971typename T::const_reverse_iterator
crbegin(
const T& container);
975template <
class T,
size_t N>
976reverse_iterator<const T *>
crbegin(
const T (&array)[N]);
981typename T::const_iterator
cend(
const T& container);
985template<
class T,
size_t N>
986const T *
cend(
const T (&array)[N]);
991typename T::reverse_iterator
rend(T& container);
997typename T::const_reverse_iterator
rend(
const T& container);
1001template <
class T,
size_t N>
1002reverse_iterator<T *>
rend(T (&array)[N]);
1004#ifdef BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS
1008reverse_iterator<const T *>
rend(std::initializer_list<T> initializerList);
1014typename T::const_reverse_iterator
crend(
const T& container);
1018template <
class T,
size_t N>
1019reverse_iterator<const T *>
crend(
const T (&array)[N]);
1023#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES
1025using std::ranges::begin;
1026using std::ranges::end;
1027using std::ranges::cbegin;
1028using std::ranges::cend;
1029using std::ranges::rbegin;
1030using std::ranges::rend;
1031using std::ranges::crbegin;
1032using std::ranges::crend;
1033using std::ranges::size;
1034using std::ranges::ssize;
1035using std::ranges::empty;
1036using std::ranges::data;
1037using std::ranges::cdata;
1039using std::ranges::advance;
1040using std::ranges::distance;
1041using std::ranges::iter_move;
1042using std::ranges::iter_swap;
1043using std::ranges::next;
1044using std::ranges::prev;
1064#ifdef BSLSTL_ITERATOR_IMPLEMENT_CPP11_REVERSE_ITERATOR
1071template <
class ITER>
1073reverse_iterator<ITER>::reverse_iterator()
1078template <
class ITER>
1080reverse_iterator<ITER>::reverse_iterator(ITER base)
1085template <
class ITER>
1086template <
class OTHER_ITER>
1088reverse_iterator<ITER>::reverse_iterator(
1089 const reverse_iterator<OTHER_ITER>& original)
1090: Base(original.base())
1095template <
class ITER>
1097reverse_iterator<ITER>&
1098reverse_iterator<ITER>::operator++()
1104template <
class ITER>
1106reverse_iterator<ITER>
1107reverse_iterator<ITER>::operator++(
int)
1109 const reverse_iterator tmp(*
this);
1114template <
class ITER>
1116reverse_iterator<ITER>&
1117reverse_iterator<ITER>::operator+=(difference_type n)
1119 Base::operator+=(n);
1123template <
class ITER>
1125reverse_iterator<ITER>&
1126reverse_iterator<ITER>::operator--()
1132template <
class ITER>
1134reverse_iterator<ITER>
1135reverse_iterator<ITER>::operator--(
int)
1137 reverse_iterator tmp(*
this);
1142template <
class ITER>
1144reverse_iterator<ITER>&
1145reverse_iterator<ITER>::operator-=(difference_type n)
1147 Base::operator-=(n);
1152template <
class ITER>
1154reverse_iterator<ITER>
1155reverse_iterator<ITER>::operator+(difference_type n)
const
1157 reverse_iterator tmp(*
this);
1162template <
class ITER>
1164reverse_iterator<ITER>
1165reverse_iterator<ITER>::operator-(difference_type n)
const
1167 reverse_iterator tmp(*
this);
1173template <
class ITER>
1176 const reverse_iterator<ITER>&
rhs)
1178 typedef std::reverse_iterator<
1180 typename iterator_traits<ITER>::iterator_category,
1181 typename iterator_traits<ITER>::value_type,
1182 typename iterator_traits<ITER>::reference,
1183 typename iterator_traits<ITER>::pointer> Base;
1185 return std::operator==(
static_cast<const Base&
>(
lhs),
1186 static_cast<const Base&
>(
rhs));
1189template <
class ITER1,
class ITER2>
1192 const reverse_iterator<ITER2>&
rhs)
1196 return lhs.base() ==
rhs.base();
1199template <
class ITER>
1202 const reverse_iterator<ITER>&
rhs)
1207template <
class ITER1,
class ITER2>
1210 const reverse_iterator<ITER2>&
rhs)
1217template <
class ITER>
1220 const reverse_iterator<ITER>&
rhs)
1222 return rhs.base() <
lhs.base();
1225template <
class ITER1,
class ITER2>
1228 const reverse_iterator<ITER2>&
rhs)
1232 return rhs.base() <
lhs.base();
1235template <
class ITER>
1238 const reverse_iterator<ITER>&
rhs)
1243template <
class ITER1,
class ITER2>
1246 const reverse_iterator<ITER2>&
rhs)
1251template <
class ITER>
1254 const reverse_iterator<ITER>&
rhs)
1259template <
class ITER1,
class ITER2>
1262 const reverse_iterator<ITER2>&
rhs)
1267template <
class ITER>
1270 const reverse_iterator<ITER>&
rhs)
1275template <
class ITER1,
class ITER2>
1278 const reverse_iterator<ITER2>&
rhs)
1283template <
class ITER>
1285typename reverse_iterator<ITER>::difference_type
1287 const reverse_iterator<ITER>&
rhs)
1289 typedef std::reverse_iterator<
1291 typename iterator_traits<ITER>::iterator_category,
1292 typename iterator_traits<ITER>::value_type,
1293 typename iterator_traits<ITER>::reference,
1294 typename iterator_traits<ITER>::pointer> Base;
1296 return std::operator-(
static_cast<const Base&
>(
lhs),
1297 static_cast<const Base&
>(
rhs));
1300template <
class ITER,
class DIFF_TYPE>
1302reverse_iterator<ITER>
1303operator+(DIFF_TYPE n,
const reverse_iterator<ITER>&
rhs)
1305 return rhs.operator+(n);
1314#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_RANGE_FUNCTIONS
1320template <class CONTAINER>
1322#ifdef BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE
1323auto data(CONTAINER& container) ->
decltype(container.data())
1325typename CONTAINER::value_type *
data(CONTAINER& container)
1328 return container.data();
1334template <
class CONTAINER>
1336#ifdef BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE
1337auto data(
const CONTAINER& container) ->
decltype(container.data())
1339typename CONTAINER::value_type
const *
data(
const CONTAINER& container)
1342 return container.data();
1346template<
class T,
size_t N>
1358#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_RANGE_FUNCTIONS
1361# ifdef BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE
1364template <
class CONTAINER>
1367 decltype(container.empty())
1369 return container.empty();
1375template <
class CONTAINER>
1379 return container.empty();
1384template <
class TYPE,
size_t DIMENSION>
1391#ifdef BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS
1395template <
class TYPE>
1399 return 0 == initializerList.size();
1417#if defined(BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY) || \
1418 defined(BSLS_PLATFORM_CMP_MSVC)
1427template <
class TYPE,
size_t DIMENSION>
1439#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE) && \
1440 201103L <= BSLS_COMPILERFEATURES_SUPPORT_CPLUSPLUS
1446template <
class CONTAINER>
1449 decltype(container.size())
1451 return container.size();
1459template <
class CONTAINER>
1463 return container.size();
1480#if 201703L < BSLS_COMPILERFEATURES_CPLUSPLUS && \
1481 defined(__cpp_lib_ssize) && __cpp_lib_ssize >= 201902L
1490template <
class TYPE, std::ptrdiff_t DIMENSION>
1502#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE) && \
1503 201103L <= BSLS_COMPILERFEATURES_SUPPORT_CPLUSPLUS
1509template <
class CONTAINER>
1514 std::make_signed_t<
decltype(container.size())>>
1516 return container.size();
1524template <
class CONTAINER>
1528 return container.size();
1533#ifdef BSLSTL_ITERATOR_PROVIDE_SUN_CPP98_FIXES
1539template <
class INPUT_ITER,
class DIFFERENCE_TYPE>
1540void IteratorDistanceImp::getDistance(DIFFERENCE_TYPE *ret,
1543 input_iterator_tag )
1545 DIFFERENCE_TYPE count = 0;
1546 for ( ; start != finish; ++start) {
1553template <
class FWD_ITER,
class DIFFERENCE_TYPE>
1554void IteratorDistanceImp::getDistance(DIFFERENCE_TYPE *ret,
1557 forward_iterator_tag)
1559 DIFFERENCE_TYPE count = 0;
1560 for ( ; start != finish; ++start) {
1567template <
class RANDOM_ITER,
class DIFFERENCE_TYPE>
1569void IteratorDistanceImp::getDistance(DIFFERENCE_TYPE *ret,
1572 random_access_iterator_tag)
1574 *ret = DIFFERENCE_TYPE(finish - start);
1577template <
class ITER>
1579typename iterator_traits<ITER>::difference_type
1582 typedef typename bsl::iterator_traits<ITER>::iterator_category tag;
1584 typename iterator_traits<ITER>::difference_type ret;
1585 IteratorDistanceImp::getDistance(&ret, start, finish, tag());
1590#ifndef BSLS_LIBRARYFEATURES_HAS_CPP11_RANGE_FUNCTIONS
1595 return container.begin();
1600typename T::const_iterator
begin(
const T& container)
1602 return container.begin();
1605template<
class T,
size_t N>
1612template<
class T,
size_t N>
1621typename T::iterator
end(T& container)
1623 return container.end();
1628typename T::const_iterator
end(
const T& container)
1630 return container.end();
1633template<
class T,
size_t N>
1640template<
class T,
size_t N>
1648#ifndef BSLS_LIBRARYFEATURES_HAS_CPP14_RANGE_FUNCTIONS
1651typename T::const_iterator
cbegin(
const T& container)
1653 return begin(container);
1656template<
class T,
size_t N>
1665typename T::reverse_iterator
rbegin(T& container)
1667 return container.rbegin();
1672typename T::const_reverse_iterator
rbegin(
const T& container)
1674 return container.rbegin();
1677template <
class T,
size_t N>
1681 return reverse_iterator<T *>(
array + N);
1684#ifdef BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS
1687reverse_iterator<const T *> rbegin(std::initializer_list<T> initializerList)
1689 return reverse_iterator<const T *>(initializerList.end());
1695typename T::const_reverse_iterator
crbegin(
const T& container)
1697 return rbegin(container);
1700template <
class T,
size_t N>
1704 return reverse_iterator<const T *>(
array + N);
1709typename T::const_iterator
cend(
const T& container)
1711 return end(container);
1714template<
class T,
size_t N>
1723typename T::reverse_iterator
rend(T& container)
1725 return container.rend();
1730typename T::const_reverse_iterator
rend(
const T& container)
1732 return container.rend();
1735template <
class T,
size_t N>
1739 return reverse_iterator<T *>(
array);
1742#ifdef BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS
1745reverse_iterator<const T *> rend(std::initializer_list<T> initializerList)
1747 return reverse_iterator<const T *>(initializerList.begin());
1752typename T::const_reverse_iterator
crend(
const T& container)
1754 return rend(container);
1757template <
class T,
size_t N>
1761 return reverse_iterator<const T *>(
array);
1765#ifndef BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES
1776template <
class t_RANGE>
1778typename iterator_traits<typename t_RANGE::const_iterator>::difference_type
1784template <
class T,
size_t N>
#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
#define BSLS_KEYWORD_NOEXCEPT
Definition bsls_keyword.h:674
bool operator!=(const FileCleanerConfiguration &lhs, const FileCleanerConfiguration &rhs)
bool operator==(const FileCleanerConfiguration &lhs, const FileCleanerConfiguration &rhs)
bool operator<(const MetricId &lhs, const MetricId &rhs)
TransformIterator< FUNCTOR, ITERATOR > operator--(TransformIterator< FUNCTOR, ITERATOR > &iterator, int)
bool operator>=(const Guid &lhs, const Guid &rhs)
FunctionOutputIterator< FUNCTION > & operator++(FunctionOutputIterator< FUNCTION > &iterator)
Do nothing and return specified iterator.
Definition bdlb_functionoutputiterator.h:408
TransformIterator< FUNCTOR, ITERATOR > operator+(const TransformIterator< FUNCTOR, ITERATOR > &iterator, typename TransformIterator< FUNCTOR, ITERATOR >::difference_type offset)
bool operator<=(const Guid &lhs, const Guid &rhs)
bool operator>(const Guid &lhs, const Guid &rhs)
TransformIterator< FUNCTOR, ITERATOR > operator-(const TransformIterator< FUNCTOR, ITERATOR > &iterator, typename TransformIterator< FUNCTOR, ITERATOR >::difference_type offset)
iterator_traits< typenamet_RANGE::const_iterator >::difference_type distance(const t_RANGE &range)
Definition bslstl_iterator.h:1779
Definition bdlat_valuetypefunctions.h:939
T::reverse_iterator rend(T &container)
Definition bslstl_iterator.h:1723
T::const_iterator cend(const T &container)
Definition bslstl_iterator.h:1709
T::const_reverse_iterator crbegin(const T &container)
Definition bslstl_iterator.h:1695
T::reverse_iterator rbegin(T &container)
Definition bslstl_iterator.h:1665
ALLOCATOR const STRING_VIEW_LIKE_TYPE & rhs
Definition bslstl_string.h:3918
BSLS_KEYWORD_CONSTEXPR std::ptrdiff_t ssize(const TYPE(&)[DIMENSION]) BSLS_KEYWORD_NOEXCEPT
Return the dimension of the specified array argument.
Definition bslstl_iterator.h:1492
T::iterator begin(T &container)
Definition bslstl_iterator.h:1593
T::const_iterator cbegin(const T &container)
Definition bslstl_iterator.h:1651
basic_string< CHAR_TYPE, CHAR_TRAITS, ALLOCATOR > operator+(const basic_string< CHAR_TYPE, CHAR_TRAITS, ALLOCATOR > &lhs, const basic_string< CHAR_TYPE, CHAR_TRAITS, ALLOCATOR > &rhs)
BSLS_KEYWORD_CONSTEXPR size_t size(const TYPE(&)[DIMENSION]) BSLS_KEYWORD_NOEXCEPT
Return the dimension of the specified array argument.
Definition bslstl_iterator.h:1429
ALLOCATOR & lhs
Definition bslstl_string.h:3917
T::iterator end(T &container)
Definition bslstl_iterator.h:1621
BSLS_KEYWORD_CONSTEXPR CONTAINER::value_type * data(CONTAINER &container)
Definition bslstl_iterator.h:1325
BSLS_KEYWORD_CONSTEXPR bool empty(const CONTAINER &container)
Definition bslstl_iterator.h:1377
T::const_reverse_iterator crend(const T &container)
Definition bslstl_iterator.h:1752
Definition bslstl_array.h:293