Boost.Range

Introduction

When writing generic code that works with Standard Library containers, one often finds it desirable to extend that code to work with other types that offer enough functionality to satisfy the needs of the generic code, but in an altered form. For example, raw arrays are often suitable for use with generic code that works with containers, provided a suitable adapter is used. Likewise, null terminated strings can be treated as containers of characters, if suitably adapted. This library provides the means to adapt Standard Library containers, null terminated strings, std::pairs of iterators, and raw arrays, such that the same generic code can work with them all.

The main advantages are

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

    //
    // example: extracting bounds in a generic algorithm
    //
    template< typename ForwardRange, typename T >
    inline typename boost::iterator_of< ForwardRange >::type
    find( ForwardRange& c, const T& value )
    {
       return std::find( boost::begin( c ), boost::end( c ), value );
    }
    
    template< typename ForwardRange, typename T >
    inline typename boost::const_iterator_of< ForwardRange >::type
    find( const ForwardRange& c, const T& value )
    {
       return std::find( boost::begin( c ), boost::end( c ), value );
    }
                   
    //
    // replace first value and return its index
    //
    template< class ForwardRange, class T >
    inline typename boost::size_type_of< ForwardRange >::type
    my_generic_replace( ForwardRange& c, const T& value, const T& replacement )
    {
       typename boost::iterator_of< ForwardRange >::type found = find( c, value );
       
       if( found != boost::end( c ) )
           *found = replacement;
       return std::distance( boost::begin( c ), found );
    }

    //
    // usage
    //
    const int N = 5;
    std::vector my_vector;
    int values[] = { 1,2,3,4,5,6,7,8,9 };
    my_vector.assign( values, values + 9 );
    typedef std::vector::iterator iterator;
    std::pair       my_view( boost::begin( my_vector ),
                             boost::begin( my_vector ) + N );
    char  str_val[] = "a string";
    char* str       = str_val;
    
    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 metafunctions, 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