diff --git a/include/boost/range/config.hpp b/include/boost/range/config.hpp index 2a2259e..8b5f5e1 100755 --- a/include/boost/range/config.hpp +++ b/include/boost/range/config.hpp @@ -21,7 +21,7 @@ #error "macro already defined!" #endif -#ifdef __BORLANDC__ +#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) #define BOOST_RANGE_DEDUCED_TYPENAME #else #define BOOST_RANGE_DEDUCED_TYPENAME BOOST_DEDUCED_TYPENAME diff --git a/include/boost/range/end.hpp b/include/boost/range/end.hpp index 004e3f7..9759108 100755 --- a/include/boost/range/end.hpp +++ b/include/boost/range/end.hpp @@ -118,8 +118,29 @@ inline BOOST_DEDUCED_TYPENAME range_const_iterator::type end( const T& r ) return range_detail::end( r ); } + + +#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) +// BCB is not able to overload pointer when class overloads are also available +template<> +inline range_const_iterator::type end( const char*& r ) +{ + return range_detail::str_end( r ); +} + +template<> +inline range_const_iterator::type end( const wchar_t*& r ) +{ + return range_detail::str_end( r ); +} + +#endif + + } // namespace 'boost' + + #endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING #endif diff --git a/include/boost/range/iterator_range.hpp b/include/boost/range/iterator_range.hpp index b99e137..3eed5b5 100755 --- a/include/boost/range/iterator_range.hpp +++ b/include/boost/range/iterator_range.hpp @@ -15,6 +15,8 @@ #include #include #include +#include +#include #include #include #include @@ -88,13 +90,13 @@ namespace boost { //! Constructor from a Range template< class Range > iterator_range( const Range& r ) : - m_Begin( boost::begin( r ) ), m_End( boost::end( r ) ), + m_Begin( adl_begin( r ) ), m_End( adl_end( r ) ), singular(false) {} //! Constructor from a Range template< class Range > iterator_range( Range& r ) : - m_Begin( boost::begin( r ) ), m_End( boost::end( r ) ), + m_Begin( adl_begin( r ) ), m_End( adl_end( r ) ), singular(false) {} template< class Iterator > @@ -112,8 +114,8 @@ namespace boost { template< class ForwardRange > iterator_range& operator=( ForwardRange& r ) { - m_Begin = boost::begin( r ); - m_End = boost::end( r ); + m_Begin = adl_begin( r ); + m_End = adl_end( r ); singular = false; return *this; } @@ -121,8 +123,8 @@ namespace boost { template< class ForwardRange > iterator_range& operator=( const ForwardRange& r ) { - m_Begin = boost::begin( r ); - m_End = boost::end( r ); + m_Begin = adl_begin( r ); + m_End = adl_end( r ); singular = false; return *this; } @@ -183,6 +185,29 @@ namespace boost { return empty() ? 0: &iterator_range::end; } + private: + template< class ForwardRange > + iterator adl_begin( ForwardRange& r ) + { + #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) + return boost::begin( r ); + #else + using boost::begin; + return begin( r ); + #endif + } + + template< class ForwardRange > + iterator adl_end( ForwardRange& r ) + { + #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) + return boost::end( r ); + #else + using boost::end; + return end( r ); + #endif + } + private: // begin and end iterators IteratorT m_Begin; @@ -257,6 +282,49 @@ namespace boost { { return iterator_range( Begin, End ); } + + + + 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 ); + } + + } + #ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING @@ -267,6 +335,28 @@ namespace boost { return iterator_range< BOOST_DEDUCED_TYPENAME range_result_iterator::type > ( begin( r ), end( r ) ); } + + + + 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 ); + } #else //! iterator_range construct helper @@ -289,7 +379,50 @@ namespace boost { return iterator_range< BOOST_DEDUCED_TYPENAME range_const_iterator::type > ( r ); } -#endif + + + + 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 ); + } + + +#endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING //! copy a range into a sequence /*!