#ifndef __MLIB_RANGE_ANY_RANGE_H__ #define __MLIB_RANGE_ANY_RANGE_H__ #include #include #include namespace fe { using namespace IteratorTypeErasure; using boost::range_reference; template struct traits { typedef typename boost::remove_reference::type Value; // in practice, only bidirectional one is needed typedef any_iterator iterator; typedef boost::iterator_range range_base; }; template class range: public traits::range_base { typedef typename traits::range_base super_t; public: range() {} template< class Iterator > range(const Iterator& Begin, const Iterator& End): super_t(Begin, End) {} // only identical type ranges are allowed (to restrict more than one wrapping with any_iterator!) range(const range& r): super_t(r) {} }; // // make_any // template struct range_range { typedef range::type> type; }; template typename range_range::type _make_any(Range& r) { typedef typename range_reference::type reference; return range(boost::begin(r), boost::end(r)); } template typename range_range::type make_any(Range& r) { return _make_any(r); } template typename range_range::type make_any(const Range& r) { return _make_any(r); } } // namespace fe #endif // #ifndef __MLIB_RANGE_ANY_RANGE_H__