17. post-review question: should Range mean lowest common denominator? or perhaps Forward Range? problem with not being explicit. 18. maybe iterator_range operator==() should be defined when rhs or lhs take a forward range argument; this comparison function should then call std::lexigraphical_compare(....). Example: sub_range sub = ...; if( sub == "foo" ) /* namespace range_detail { template< class Range > inline iterator_range< BOOST_DEDUCED_TYPENAME range_result_iterator::type > make_sub_range_impl( Range& r, BOOST_DEDUCED_TYPENAME range_difference::type advance_begin, BOOST_DEDUCED_TYPENAME range_difference::type advance_end ) { BOOST_ASSERT( advance_begin >= 0 ); BOOST_ASSERT( advance_end >= 0 ); BOOST_DEDUCED_TYPENAME range_result_iterator::type new_begin = begin( r ), new_end = end( r ); std::advance( new_begin, advance_begin ); std::advance( new_end, -advance_end ); return make_iterator_range( new_begin, new_end ); } template< class Range > inline iterator_range< BOOST_DEDUCED_TYPENAME range_result_iterator::type > make_super_range_impl( Range& r, BOOST_DEDUCED_TYPENAME range_difference::type advance_begin, BOOST_DEDUCED_TYPENAME range_difference::type advance_end ) { BOOST_ASSERT( advance_begin >= 0 ); BOOST_ASSERT( advance_end >= 0 ); BOOST_DEDUCED_TYPENAME range_result_iterator::type new_begin = begin( r ), new_end = end( r ); std::advance( new_begin, -advance_begin ); std::advance( new_end, advance_end ); return make_iterator_range( new_begin, new_end ); } }*/ /* template< class Range > inline iterator_range< BOOST_DEDUCED_TYPENAME range_result_iterator::type > make_sub_range( Range& r, BOOST_DEDUCED_TYPENAME range_difference::type advance_begin, BOOST_DEDUCED_TYPENAME range_difference::type advance_end = 0 ) { return range_detail::make_sub_range_impl( r, advance_begin, advance_end ); } template< class Range > inline iterator_range< BOOST_DEDUCED_TYPENAME range_result_iterator::type > make_super_range( Range& r, BOOST_DEDUCED_TYPENAME range_difference::type advance_begin, BOOST_DEDUCED_TYPENAME range_difference::type advance_end = 0 ) { return range_detail::make_super_range_impl( r, advance_begin, advance_end ); }*/ /* template< class Range > inline iterator_range< BOOST_DEDUCED_TYPENAME range_iterator::type > make_sub_range( Range& r, BOOST_DEDUCED_TYPENAME range_difference::type advance_begin, BOOST_DEDUCED_TYPENAME range_difference::type advance_end = 0 ) { return range_detail::make_sub_range_impl( r, advance_begin, advance_end ); } template< class Range > inline iterator_range< BOOST_DEDUCED_TYPENAME range_const_iterator::type > make_sub_range( const Range& r, BOOST_DEDUCED_TYPENAME range_difference::type advance_begin, BOOST_DEDUCED_TYPENAME range_difference::type advance_end = 0 ) { return range_detail::make_sub_range_impl( r, advance_begin, advance_end ); } template< class Range > inline iterator_range< BOOST_DEDUCED_TYPENAME range_iterator::type > make_super_range( Range& r, BOOST_DEDUCED_TYPENAME range_difference::type advance_begin, BOOST_DEDUCED_TYPENAME range_difference::type advance_end = 0 ) { return range_detail::make_super_range_impl( r, advance_begin, advance_end ); } template< class Range > inline iterator_range< BOOST_DEDUCED_TYPENAME range_const_iterator::type > make_super_range( const Range& r, BOOST_DEDUCED_TYPENAME range_difference::type advance_begin, BOOST_DEDUCED_TYPENAME range_difference::type advance_end = 0 ) { return range_detail::make_super_range_impl( r, advance_begin, advance_end ); }*/