//
// It turns out that this is disturbingly similar to boost::transform_iterator
//
-#if 1
template <class RootIt, class UnaryFunc>
class mapped_iterator {
RootIt current;
return mapped_iterator<_Iterator, Func>(X.getCurrent() - N);
}
-#else
-
-// This fails to work, because some iterators are not classes, for example
-// 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;
- typedef void reference; // Can't modify value returned by fn
-
- typedef mapped_iterator<RootIt, UnaryFunc> _Self;
- typedef RootIt super;
- inline explicit mapped_iterator(const RootIt &I) : super(I) {}
- inline mapped_iterator(const super &It) : super(It) {}
-
- inline value_type operator*() const { // All this work to do
- return Fn(super::operator*()); // this little thing
- }
-};
-#endif
// map_iterator - Provide a convenient way to create mapped_iterators, just like
// make_pair is useful for creating pairs...
}
+// next/prior - These functions unlike std::advance do not modify the
+// passed iterator but return a copy.
+//
+// next(myIt) returns copy of myIt incremented once
+// next(myIt, n) returns copy of myIt incremented n times
+// prior(myIt) returns copy of myIt decremented once
+// prior(myIt, n) returns copy of myIt decremented n times
+
+template <typename ItTy, typename Dist>
+inline ItTy next(ItTy it, Dist n)
+{
+ std::advance(it, n);
+ return it;
+}
+
+template <typename ItTy>
+inline ItTy next(ItTy it)
+{
+ std::advance(it, 1);
+ return it;
+}
+
+template <typename ItTy, typename Dist>
+inline ItTy prior(ItTy it, Dist n)
+{
+ std::advance(it, -n);
+ return it;
+}
+
+template <typename ItTy>
+inline ItTy prior(ItTy it)
+{
+ std::advance(it, -1);
+ return it;
+}
+
+
//===----------------------------------------------------------------------===//
// Extra additions to <algorithm>
//===----------------------------------------------------------------------===//
//
// It turns out that this is disturbingly similar to boost::transform_iterator
//
-#if 1
template <class RootIt, class UnaryFunc>
class mapped_iterator {
RootIt current;
return mapped_iterator<_Iterator, Func>(X.getCurrent() - N);
}
-#else
-
-// This fails to work, because some iterators are not classes, for example
-// 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;
- typedef void reference; // Can't modify value returned by fn
-
- typedef mapped_iterator<RootIt, UnaryFunc> _Self;
- typedef RootIt super;
- inline explicit mapped_iterator(const RootIt &I) : super(I) {}
- inline mapped_iterator(const super &It) : super(It) {}
-
- inline value_type operator*() const { // All this work to do
- return Fn(super::operator*()); // this little thing
- }
-};
-#endif
// map_iterator - Provide a convenient way to create mapped_iterators, just like
// make_pair is useful for creating pairs...
}
+// next/prior - These functions unlike std::advance do not modify the
+// passed iterator but return a copy.
+//
+// next(myIt) returns copy of myIt incremented once
+// next(myIt, n) returns copy of myIt incremented n times
+// prior(myIt) returns copy of myIt decremented once
+// prior(myIt, n) returns copy of myIt decremented n times
+
+template <typename ItTy, typename Dist>
+inline ItTy next(ItTy it, Dist n)
+{
+ std::advance(it, n);
+ return it;
+}
+
+template <typename ItTy>
+inline ItTy next(ItTy it)
+{
+ std::advance(it, 1);
+ return it;
+}
+
+template <typename ItTy, typename Dist>
+inline ItTy prior(ItTy it, Dist n)
+{
+ std::advance(it, -n);
+ return it;
+}
+
+template <typename ItTy>
+inline ItTy prior(ItTy it)
+{
+ std::advance(it, -1);
+ return it;
+}
+
+
//===----------------------------------------------------------------------===//
// Extra additions to <algorithm>
//===----------------------------------------------------------------------===//