Boost.Range

Introduction

This library makes it possible to treat different types as if they have implemented a subset of the container requirements (see §23.1of the C++ standard). Formally, that subset is defined by the Range concept. The subset deals mostly with iterator returning functions and nested typedefs. The main goal is to treat built-in arrays, standard containers, pairs of iterators and some iterators uniformly.

The main advantages are

Below are given a small example (the complete example can be found here ):

       
       //
       // Example: extracting bounds in generic algorithms
       //
                       
       template< typename XRange, typename T >
       inline typename boost::iterator_of<XRange>::type
       find( XRange& c, const T& value )
       {
           return std::find( boost::begin( c ), boost::end( c ), value );
       }

       template< typename XRange, typename T >
       inline typename boost::const_iterator_of<XRange>::type
       find( const XRange& c, const T& value )
       {
           return std::find( boost::begin( c ), boost::end( c ), value );
       }
                       
       //
       // replace first value and return its index
       //
       template< typename EC, typename T >
       inline typename boost::size_type_of< EC >::type
       my_generic_replace( EC& c, const T& value, const T& replacement )
       {
           typename boost::const_iterator_of<EC>::type found = find( c, value );
           *found = replacement;
           return std::distance( boost::begin( c ), found );
       }
                       
       //
       // usage
       //
       std::vector<int>              my_vector;
       typedef vector<int>::iterator iterator;
       std::pair<iterator,iterator>  my_view( my_vector.begin(), my_vector.begin(
       ) + N );
       char str[] = "a string";
       // ...
       std::cout << my_generic_replace( my_vector, 4, 2 )
                 << my_generic_replace( my_view, 4, 2 )
                 << my_generic_replace( str, 'a', 'b' );
       
By using the free-standing functions and type-generators, the code automatically works for all the types supported by this library. Notice that we have to provide two version of find() since we cannot forward a non-const rvalue with reference arguments (see this article about The Forwarding Problem ).


(C) Copyright Thorsten Ottosen 2003-2004