8#ifndef INCLUDED_BDLB_TRANSFORMITERATOR
9#define INCLUDED_BDLB_TRANSFORMITERATOR
230#include <bdlscm_version.h>
247#include <bsl_algorithm.h>
248#include <bsl_functional.h>
249#include <bsl_iterator.h>
250#include <bsl_utility.h>
252#ifndef BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE
260template <
class FUNCTOR,
class ITERATOR>
261class TransformIterator;
271template <
class FUNCTOR,
class ITERATOR>
276#ifndef BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE
292 typedef decltype(bsl::declval<FUNCTOR>()(*bsl::declval<ITERATOR>()))
306 typename BaseIteratorTraits::iterator_category,
317#if defined(BSLS_LIBRARYFEATURES_STDCPP_LIBCSTD)
337template <
class RESULT,
class ARGUMENT,
class ITERATOR>
342template <
class RESULT,
class ARGUMENT,
class ITERATOR>
364template <
class BASE_TYPE,
bool>
368template <
class BASE_TYPE>
391template <
class BASE_TYPE,
bool>
395template <
class BASE_TYPE>
414template <
class FUNCTOR,
class ITERATOR>
417 TransformIterator<FUNCTOR, ITERATOR>,
418 bslma::UsesBslmaAllocator<ITERATOR>::value>
420 TransformIterator<FUNCTOR, ITERATOR>,
421 !bslma::UsesBslmaAllocator<ITERATOR>::value &&
422 bslma::UsesBslmaAllocator<FUNCTOR>::value>
423#if defined(BSLS_LIBRARYFEATURES_STDCPP_LIBCSTD)
604 const FUNCTOR&
functor()
const;
632 template <
class FUNCTOR,
class ITERATOR>
634 const ITERATOR& iterator,
635 const FUNCTOR& functor,
648template <
class FUNCTOR,
class ITERATOR>
659template <
class FUNCTOR,
class ITERATOR>
670template <
class FUNCTOR,
class ITERATOR>
681template <
class FUNCTOR,
class ITERATOR>
692template <
class FUNCTOR,
class ITERATOR>
703template <
class FUNCTOR,
class ITERATOR>
711template <
class FUNCTOR,
class ITERATOR>
720template <
class FUNCTOR,
class ITERATOR>
730template <
class FUNCTOR,
class ITERATOR>
740template <
class FUNCTOR,
class ITERATOR>
750template <
class FUNCTOR,
class ITERATOR>
759template <
class FUNCTOR,
class ITERATOR>
769template <
class FUNCTOR,
class ITERATOR>
782template <
class BASE_TYPE>
787 return static_cast<const BASE_TYPE&
>(*this).iterator().allocator();
795template <
class BASE_TYPE>
800 return static_cast<const BASE_TYPE&
>(*this).functor().allocator();
808template <
class FUNCTOR,
class ITERATOR>
816template <
class FUNCTOR,
class ITERATOR>
820: d_iterator(basicAllocator)
821, d_functor(basicAllocator)
825template <
class FUNCTOR,
class ITERATOR>
828 const ITERATOR& iterator,
831: d_iterator(iterator, basicAllocator)
832, d_functor(functor, basicAllocator)
836template <
class FUNCTOR,
class ITERATOR>
841: d_iterator(original.iterator(), basicAllocator)
842, d_functor(original.functor(), basicAllocator)
847template <
class FUNCTOR,
class ITERATOR>
852 iterator() = rhs.iterator();
853 functor() = rhs.functor();
858template <
class FUNCTOR,
class ITERATOR>
863 iterator() += offset;
867template <
class FUNCTOR,
class ITERATOR>
872 iterator() -= offset;
876template <
class FUNCTOR,
class ITERATOR>
885template <
class FUNCTOR,
class ITERATOR>
894template <
class FUNCTOR,
class ITERATOR>
899 return functor()(*iterator());
902template <
class FUNCTOR,
class ITERATOR>
910template <
class FUNCTOR,
class ITERATOR>
915 return functor()(iterator()[offset]);
918template <
class FUNCTOR,
class ITERATOR>
922 return d_functor.object();
925template <
class FUNCTOR,
class ITERATOR>
929 return d_iterator.object();
934template <
class FUNCTOR,
class ITERATOR>
940 swap(functor(), other.
functor());
945template <
class FUNCTOR,
class ITERATOR>
950 return functor()(*iterator());
953template <
class FUNCTOR,
class ITERATOR>
961template <
class FUNCTOR,
class ITERATOR>
966 return functor()(iterator()[offset]);
969template <
class FUNCTOR,
class ITERATOR>
973 return d_functor.object();
976template <
class FUNCTOR,
class ITERATOR>
980 return d_iterator.object();
986template <
class FUNCTOR,
class ITERATOR>
989 const TransformIterator<FUNCTOR, ITERATOR>& rhs)
991 return lhs.iterator() == rhs.iterator();
994template <
class FUNCTOR,
class ITERATOR>
997 const TransformIterator<FUNCTOR, ITERATOR>& rhs)
999 return lhs.iterator() !=
rhs.iterator();
1002template <
class FUNCTOR,
class ITERATOR>
1005 const TransformIterator<FUNCTOR, ITERATOR>& rhs)
1007 return lhs.iterator() <
rhs.iterator();
1010template <
class FUNCTOR,
class ITERATOR>
1013 const TransformIterator<FUNCTOR, ITERATOR>& rhs)
1015 return lhs.iterator() >
rhs.iterator();
1018template <
class FUNCTOR,
class ITERATOR>
1021 const TransformIterator<FUNCTOR, ITERATOR>& rhs)
1023 return lhs.iterator() <=
rhs.iterator();
1026template <
class FUNCTOR,
class ITERATOR>
1029 const TransformIterator<FUNCTOR, ITERATOR>& rhs)
1031 return lhs.iterator() >=
rhs.iterator();
1034template <
class FUNCTOR,
class ITERATOR>
1037 TransformIterator<FUNCTOR, ITERATOR>& iterator,
1040 return TransformIterator<FUNCTOR, ITERATOR>(iterator.iterator()++,
1041 iterator.functor());
1044template <
class FUNCTOR,
class ITERATOR>
1047 TransformIterator<FUNCTOR, ITERATOR>& iterator,
1050 return TransformIterator<FUNCTOR, ITERATOR>(iterator.iterator()--,
1051 iterator.functor());
1054template <
class FUNCTOR,
class ITERATOR>
1057 const TransformIterator<FUNCTOR, ITERATOR>& iterator,
1058 typename TransformIterator<FUNCTOR, ITERATOR>::difference_type offset)
1060 return TransformIterator<FUNCTOR, ITERATOR>(iterator.iterator() + offset,
1061 iterator.functor());
1064template <
class FUNCTOR,
class ITERATOR>
1067 typename TransformIterator<FUNCTOR, ITERATOR>::difference_type offset,
1068 const TransformIterator<FUNCTOR, ITERATOR>& iterator)
1070 return TransformIterator<FUNCTOR, ITERATOR>(iterator.iterator() + offset,
1071 iterator.functor());
1074template <
class FUNCTOR,
class ITERATOR>
1077 const TransformIterator<FUNCTOR, ITERATOR>& iterator,
1078 typename TransformIterator<FUNCTOR, ITERATOR>::difference_type offset)
1080 return TransformIterator<FUNCTOR, ITERATOR>(iterator.iterator() - offset,
1081 iterator.functor());
1084template <
class FUNCTOR,
class ITERATOR>
1088 const TransformIterator<FUNCTOR, ITERATOR>& b)
1090 return a.iterator() - b.iterator();
1094template <
class FUNCTOR,
class ITERATOR>
1096void bdlb::swap(TransformIterator<FUNCTOR, ITERATOR>& a,
1097 TransformIterator<FUNCTOR, ITERATOR>& b)
1100 swap(a.functor(), b.functor());
1101 swap(a.iterator(), b.iterator());
1111template <
class FUNCTOR,
class ITERATOR>
1114 const ITERATOR& iterator,
1115 const FUNCTOR& functor,
1119 iterator, functor, basicAllocator);
Forward declaration.
Definition bslstl_function.h:946
Definition bslalg_constructorproxy.h:376
Definition bslma_allocator.h:545
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
void swap(OptionValue &a, OptionValue &b)
Definition bdlb_algorithmworkaroundutil.h:74
bool operator!=(const BigEndianInt16 &lhs, const BigEndianInt16 &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
void swap(NullableAllocatedValue< TYPE > &a, NullableAllocatedValue< TYPE > &b)
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)
bool operator<(const Guid &lhs, const Guid &rhs)
bool operator==(const BigEndianInt16 &lhs, const BigEndianInt16 &rhs)
void swap(array< VALUE_TYPE, SIZE > &lhs, array< VALUE_TYPE, SIZE > &rhs)
ALLOCATOR const STRING_VIEW_LIKE_TYPE & rhs
Definition bslstl_string.h:3918
ALLOCATOR & lhs
Definition bslstl_string.h:3917
Definition bslmf_conditional.h:123
Definition bslmf_integralconstant.h:261
Definition bslmf_isreference.h:137
Definition bslmf_removecv.h:120
t_TYPE type
This typedef is an alias to the (template parameter) t_TYPE.
Definition bslmf_removereference.h:156
Definition bslma_usesbslmaallocator.h:344
t_FALLBACK type
Definition bslmf_resulttype.h:262
static TYPE * addressOf(TYPE &obj)
Definition bsls_util.h:312