template <class RootIt, class UnaryFunc>
class mapped_iterator {
RootIt current;
+ UnaryFunc Fn;
public:
typedef typename iterator_traits<RootIt>::iterator_category
iterator_category;
inline RootIt &getCurrent() const { return current; }
- inline explicit mapped_iterator(const RootIt &I) : current(I) {}
- inline mapped_iterator(const mapped_iterator &It) : current(It.current) {}
+ inline explicit mapped_iterator(const RootIt &I, UnaryFunc F)
+ : current(I), Fn(F) {}
+ inline mapped_iterator(const mapped_iterator &It)
+ : current(It.current), Fn(It.Fn) {}
inline value_type operator*() const { // All this work to do this
- return UnaryFunc()(*current); // little change
+ return Fn(*current); // little change
}
_Self& operator++() { ++current; return *this; }
// vector iterators are commonly value_type **'s
template <class RootIt, class UnaryFunc>
class mapped_iterator : public RootIt {
+ UnaryFunc Fn;
public:
typedef typename UnaryFunc::result_type value_type;
typedef typename UnaryFunc::result_type *pointer;
inline mapped_iterator(const super &It) : super(It) {}
inline value_type operator*() const { // All this work to do
- return UnaryFunc(super::operator*()); // this little thing
+ return Fn(super::operator*()); // this little thing
}
};
#endif
//
template <class ItTy, class FuncTy>
inline mapped_iterator<ItTy, FuncTy> map_iterator(const ItTy &I, FuncTy F) {
- return mapped_iterator<ItTy, FuncTy>(I);
+ return mapped_iterator<ItTy, FuncTy>(I, F);
}
return reduce_apply(First, Last, bitwise_or<bool>(), false, Func);
}
+
+// map - This function maps the specified input sequence into the specified
+// output iterator, applying a unary function in between.
+//
+template <class InIt, class OutIt, class Functor>
+inline OutIt mapto(InIt Begin, InIt End, OutIt Dest, Functor F) {
+ return copy(map_iterator(Begin, F), map_iterator(End, F), Dest);
+}
#endif