10 class TransformIterValProxy{
12 typedef const T & reference;
13 typedef const T * pointer;
16 reference getRef(
const T & functionReturn){
20 pointer getPr(
const T & functionReturn){
30 class TransformIterValProxy<const T &>{
31 typedef const T & reference;
32 typedef const T * pointer;
35 reference getRef(
const T & functionReturn){
39 pointer getPr(
const T & functionReturn){
48 class TransformIterValProxy<T &>{
49 typedef T & reference;
53 reference getRef(
const T & functionReturn){
57 pointer getPr(
const T & functionReturn){
70 class TransformIterator{
74 typedef typename UnaryFunction::result_type function_result_type;
75 typedef TransformIterValProxy<function_result_type> RetHelper;
77 typedef typename RetHelper::value_type value_type;
78 typedef typename RetHelper::reference reference;
79 typedef typename RetHelper::pointer pointer;
81 typedef typename std::iterator_traits<Iterator>::difference_type difference_type;
82 typedef typename std::iterator_traits<Iterator>::iterator_category iterator_category;
84 TransformIterator(
const Iterator & iter = Iterator(),
const UnaryFunction & f = UnaryFunction())
89 reference operator * ()
const{
90 return retHelper_.getRef(f_(*iter_));
93 reference operator[](
const difference_type i)
const{
94 return retHelper_.getRef(f_(iter_[i]));
97 pointer operator -> ()
const{
98 return retHelper_.getRef(f_(*iter_));
102 #define TRANSFORMITERATOR_CP_OP_GEN(OP)\
103 bool operator OP (const TransformIterator & rhs)const{\
104 return iter_ OP rhs.iter_;\
107 TRANSFORMITERATOR_CP_OP_GEN(==);
108 TRANSFORMITERATOR_CP_OP_GEN(!=);
109 TRANSFORMITERATOR_CP_OP_GEN(<);
110 TRANSFORMITERATOR_CP_OP_GEN(<=);
111 TRANSFORMITERATOR_CP_OP_GEN(>);
112 TRANSFORMITERATOR_CP_OP_GEN(>=);
114 #undef TRANSFORMITERATOR_CP_OP_GEN
116 TransformIterator & operator ++ (){
120 TransformIterator & operator -- (){
124 TransformIterator operator ++ (
int)
const{
125 TransformIterator res(*
this);
129 TransformIterator operator -- (
int)
const{
130 TransformIterator res(*
this);
134 TransformIterator & operator+=(
const difference_type i ){
138 TransformIterator & operator-=(
const difference_type i ){
142 TransformIterator operator+(
const difference_type i )
const{
143 TransformIterator res(*
this);
147 TransformIterator operator-(
const difference_type i )
const{
148 TransformIterator res(*
this);
153 difference_type operator - (
const TransformIterator rhs)
const{
154 return iter_ - rhs.iter_;
158 const Iterator & baseIterator()
const{
161 const UnaryFunction & unaryFunction()
const{
167 mutable RetHelper retHelper_;
175 class EndAwareTransformIterator
176 :
public TransformIterator<UnaryFunction, Iterator>
179 EndAwareTransformIterator(
const Iterator & iter = Iterator(),
const UnaryFunction & f = UnaryFunction())
180 : TransformIterator<UnaryFunction, Iterator>(iter,f){
183 EndAwareTransformIterator getEndIterator()
const{
184 return EndAwareTransformIterator(this->baseIterator().getEndIterator(),
185 this->unaryFunction());