503 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			503 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
//  Boost string_algo library collection_traits.hpp header file  -----------------------//
 | 
						|
 | 
						|
//  Copyright Pavol Droba 2002-2003. Use, modification and
 | 
						|
//  distribution is subject to the Boost Software License, Version
 | 
						|
//  1.0. (See accompanying file LICENSE_1_0.txt or copy at
 | 
						|
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
						|
 | 
						|
//  See http://www.boost.org for updates, documentation, and revision history.
 | 
						|
 | 
						|
#ifndef BOOST_RANGE_STRING_DETAIL_COLLECTION_TRAITS_HPP
 | 
						|
#define BOOST_RANGE_STRING_DETAIL_COLLECTION_TRAITS_HPP
 | 
						|
 | 
						|
#include <cstddef>
 | 
						|
#include <string>
 | 
						|
#include <boost/type_traits/is_array.hpp>
 | 
						|
#include <boost/type_traits/is_pointer.hpp>
 | 
						|
#include <boost/type_traits/is_const.hpp>
 | 
						|
#include <boost/type_traits/is_convertible.hpp>
 | 
						|
#include <boost/type_traits/remove_pointer.hpp>
 | 
						|
#include <boost/type_traits/remove_cv.hpp>
 | 
						|
#include <boost/mpl/eval_if.hpp>
 | 
						|
#include <boost/mpl/identity.hpp>
 | 
						|
#include <boost/mpl/vector.hpp>
 | 
						|
#include <boost/mpl/fold.hpp>
 | 
						|
#include <boost/detail/iterator.hpp>
 | 
						|
 | 
						|
// Container traits implementation ---------------------------------------------------------
 | 
						|
 | 
						|
namespace boost {
 | 
						|
    namespace algorithm {
 | 
						|
        namespace detail {
 | 
						|
 | 
						|
// Default collection traits -----------------------------------------------------------------
 | 
						|
 | 
						|
            // Default collection helper 
 | 
						|
            /*
 | 
						|
                Wraps std::container compliant containers
 | 
						|
            */
 | 
						|
            template< typename ContainerT >     
 | 
						|
            struct default_container_traits
 | 
						|
            {
 | 
						|
                typedef typename ContainerT::value_type value_type;
 | 
						|
                typedef typename ContainerT::iterator iterator;
 | 
						|
                typedef typename ContainerT::const_iterator const_iterator;
 | 
						|
                typedef typename
 | 
						|
                    ::boost::mpl::if_< ::boost::is_const<ContainerT>,
 | 
						|
                        const_iterator,
 | 
						|
                        iterator 
 | 
						|
                    >::type result_iterator;
 | 
						|
                typedef typename ContainerT::difference_type difference_type;
 | 
						|
                typedef typename ContainerT::size_type size_type;
 | 
						|
                
 | 
						|
                // static operations
 | 
						|
                template< typename C >
 | 
						|
                static size_type size( const C& c )
 | 
						|
                {
 | 
						|
                    return c.size();
 | 
						|
                }
 | 
						|
 | 
						|
                template< typename C >
 | 
						|
                static bool empty( const C& c )
 | 
						|
                {
 | 
						|
                    return c.empty();
 | 
						|
                }
 | 
						|
 | 
						|
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
 | 
						|
 | 
						|
                template< typename C >
 | 
						|
                static iterator begin( C& c )
 | 
						|
                {
 | 
						|
                    return c.begin();
 | 
						|
                }
 | 
						|
 | 
						|
                template< typename C >
 | 
						|
                static const_iterator begin( const C& c )
 | 
						|
                {
 | 
						|
                    return c.begin();
 | 
						|
                }
 | 
						|
 | 
						|
                template< typename C >
 | 
						|
                static iterator end( C& c )
 | 
						|
                {
 | 
						|
                    return c.end();
 | 
						|
                }
 | 
						|
 | 
						|
                template< typename C >
 | 
						|
                static const_iterator end( const C& c )
 | 
						|
                {
 | 
						|
                    return c.end();
 | 
						|
                }
 | 
						|
 | 
						|
#else // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
 | 
						|
 | 
						|
                template< typename C >
 | 
						|
                static result_iterator begin( C& c )
 | 
						|
                {
 | 
						|
                    return c.begin();
 | 
						|
                }
 | 
						|
 | 
						|
                template< typename C >
 | 
						|
                static result_iterator end( C& c )
 | 
						|
                {
 | 
						|
                    return c.end();
 | 
						|
                }
 | 
						|
 | 
						|
#endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING    
 | 
						|
 | 
						|
            }; 
 | 
						|
 | 
						|
            template<typename T>
 | 
						|
            struct default_container_traits_selector
 | 
						|
            {
 | 
						|
                typedef default_container_traits<T> type;
 | 
						|
            };
 | 
						|
 | 
						|
// Pair container traits ---------------------------------------------------------------------
 | 
						|
 | 
						|
            typedef double yes_type;
 | 
						|
            typedef char no_type;
 | 
						|
 | 
						|
            // pair selector
 | 
						|
            template< typename T, typename U >
 | 
						|
            yes_type is_pair_impl( const std::pair<T,U>* );
 | 
						|
            no_type is_pair_impl( ... );
 | 
						|
 | 
						|
            template<typename T> struct is_pair
 | 
						|
            {
 | 
						|
            private:
 | 
						|
                static T* t;
 | 
						|
            public:
 | 
						|
                BOOST_STATIC_CONSTANT( bool, value=
 | 
						|
                    sizeof(is_pair_impl(t))==sizeof(yes_type) );
 | 
						|
            };
 | 
						|
 | 
						|
            // pair helper
 | 
						|
            template< typename PairT >
 | 
						|
            struct pair_container_traits
 | 
						|
            {
 | 
						|
                typedef typename PairT::first_type element_type;
 | 
						|
 | 
						|
                typedef typename ::boost::detail::
 | 
						|
                    iterator_traits<element_type>::value_type value_type;
 | 
						|
                typedef std::size_t size_type;
 | 
						|
                typedef typename ::boost::detail::
 | 
						|
                    iterator_traits<element_type>::difference_type difference_type;
 | 
						|
 | 
						|
                typedef element_type iterator;
 | 
						|
                typedef element_type const_iterator;
 | 
						|
                typedef element_type result_iterator;
 | 
						|
 | 
						|
                // static operations
 | 
						|
                template< typename P >
 | 
						|
                static size_type size( const P& p )
 | 
						|
                {
 | 
						|
                    difference_type diff = std::distance( p.first, p.second );
 | 
						|
                    if ( diff < 0 ) 
 | 
						|
                        return 0;
 | 
						|
                    else
 | 
						|
                        return diff;
 | 
						|
                }
 | 
						|
 | 
						|
                template< typename P >
 | 
						|
                static bool empty( const P& p )
 | 
						|
                {
 | 
						|
                    return p.first==p.second;
 | 
						|
                }
 | 
						|
 | 
						|
                template< typename P > 
 | 
						|
                static const_iterator begin( const P& p )
 | 
						|
                {
 | 
						|
                    return p.first;
 | 
						|
                }
 | 
						|
 | 
						|
                template< typename P >
 | 
						|
                static const_iterator end( const P& p )
 | 
						|
                {
 | 
						|
                    return p.second;
 | 
						|
                }
 | 
						|
            }; // 'pair_container_helper'
 | 
						|
 | 
						|
            template<typename T>
 | 
						|
            struct pair_container_traits_selector
 | 
						|
            {
 | 
						|
                typedef pair_container_traits<T> type;
 | 
						|
            };
 | 
						|
 | 
						|
// Array container traits ---------------------------------------------------------------
 | 
						|
 | 
						|
            // array traits ( partial specialization )
 | 
						|
            template< typename T >
 | 
						|
            struct array_traits;
 | 
						|
 | 
						|
            template< typename T, std::size_t sz >
 | 
						|
            struct array_traits<T[sz]>
 | 
						|
            {
 | 
						|
                // typedef
 | 
						|
                typedef T* iterator;
 | 
						|
                typedef const T* const_iterator;
 | 
						|
                typedef T value_type;
 | 
						|
                typedef std::size_t size_type;
 | 
						|
                typedef std::ptrdiff_t difference_type;
 | 
						|
 | 
						|
                // size of the array ( static );
 | 
						|
                BOOST_STATIC_CONSTANT( size_type, array_size = sz );
 | 
						|
            };
 | 
						|
 | 
						|
            
 | 
						|
            // array length resolving
 | 
						|
            /*
 | 
						|
                Lenght of string contained in a static array could
 | 
						|
                be different from the size of the array.
 | 
						|
                For string processing we need the length without
 | 
						|
                terminating 0.
 | 
						|
 | 
						|
                Therefore, the length is calculated for char and wchar_t
 | 
						|
                using char_traits, rather then simply returning
 | 
						|
                the array size.
 | 
						|
            */
 | 
						|
            template< typename T >
 | 
						|
            struct array_length_selector
 | 
						|
            {
 | 
						|
                template< typename TraitsT >
 | 
						|
                struct array_length
 | 
						|
                {
 | 
						|
                    typedef typename
 | 
						|
                        TraitsT::size_type size_type;
 | 
						|
 | 
						|
                    BOOST_STATIC_CONSTANT(
 | 
						|
                        size_type,
 | 
						|
                        array_size=TraitsT::array_size );
 | 
						|
 | 
						|
                    template< typename A >
 | 
						|
                    static size_type length( const A& )
 | 
						|
                    {
 | 
						|
                        return array_size;
 | 
						|
                    }
 | 
						|
 | 
						|
                    template< typename A >
 | 
						|
                    static bool empty( const A& )
 | 
						|
                    {
 | 
						|
                        return array_size==0;
 | 
						|
                    }
 | 
						|
                };
 | 
						|
            };
 | 
						|
 | 
						|
            // specialization for char
 | 
						|
            template<>
 | 
						|
            struct array_length_selector<char>
 | 
						|
            {
 | 
						|
                template< typename TraitsT >
 | 
						|
                struct array_length
 | 
						|
                {
 | 
						|
                    typedef typename
 | 
						|
                        TraitsT::size_type size_type;
 | 
						|
 | 
						|
                    template< typename A >
 | 
						|
                    static size_type length( const A& a )
 | 
						|
                    {
 | 
						|
                        if ( a==0 ) 
 | 
						|
                            return 0;
 | 
						|
                        else
 | 
						|
                            return std::char_traits<char>::length(a);
 | 
						|
                    }
 | 
						|
                    
 | 
						|
                    template< typename A >
 | 
						|
                    static bool empty( const A& a )
 | 
						|
                    {
 | 
						|
                        return a==0 || a[0]==0;
 | 
						|
                    }
 | 
						|
                };
 | 
						|
            };
 | 
						|
 | 
						|
            // specialization for wchar_t
 | 
						|
            template<>
 | 
						|
            struct array_length_selector<wchar_t>
 | 
						|
            {
 | 
						|
                template< typename TraitsT >
 | 
						|
                struct array_length
 | 
						|
                {
 | 
						|
                    typedef typename
 | 
						|
                        TraitsT::size_type size_type;
 | 
						|
 | 
						|
                    template< typename A >
 | 
						|
                    static size_type length( const A& a )
 | 
						|
                    {
 | 
						|
                        if ( a==0 ) 
 | 
						|
                            return 0;
 | 
						|
                        else
 | 
						|
                            return std::char_traits<wchar_t>::length(a);
 | 
						|
                    }
 | 
						|
 | 
						|
                    template< typename A >
 | 
						|
                    static bool empty( const A& a )
 | 
						|
                    {
 | 
						|
                        return a==0 || a[0]==0;
 | 
						|
                    }
 | 
						|
                };
 | 
						|
            };
 | 
						|
 | 
						|
            template< typename T >
 | 
						|
            struct array_container_traits
 | 
						|
            {
 | 
						|
            private:
 | 
						|
                // resolve array traits
 | 
						|
                typedef array_traits<T> traits_type;
 | 
						|
 | 
						|
            public:
 | 
						|
                typedef typename
 | 
						|
                    traits_type::value_type value_type;
 | 
						|
                typedef typename
 | 
						|
                    traits_type::iterator iterator;
 | 
						|
                typedef typename
 | 
						|
                    traits_type::const_iterator const_iterator;
 | 
						|
                typedef typename
 | 
						|
                    traits_type::size_type size_type;
 | 
						|
                typedef typename
 | 
						|
                    traits_type::difference_type difference_type;
 | 
						|
 | 
						|
                typedef typename
 | 
						|
                    ::boost::mpl::if_< ::boost::is_const<T>,
 | 
						|
                        const_iterator,
 | 
						|
                        iterator 
 | 
						|
                    >::type result_iterator;
 | 
						|
                
 | 
						|
            private:
 | 
						|
                // resolve array size
 | 
						|
                typedef typename
 | 
						|
                    ::boost::remove_cv<value_type>::type char_type;
 | 
						|
                typedef typename
 | 
						|
                    array_length_selector<char_type>::
 | 
						|
                        BOOST_NESTED_TEMPLATE array_length<traits_type> array_length_type;
 | 
						|
 | 
						|
            public:
 | 
						|
                BOOST_STATIC_CONSTANT( size_type, array_size = traits_type::array_size );
 | 
						|
 | 
						|
                // static operations
 | 
						|
                template< typename A >
 | 
						|
                static size_type size( const A& a )
 | 
						|
                {
 | 
						|
                    return array_length_type::length(a);
 | 
						|
                }
 | 
						|
 | 
						|
                template< typename A >
 | 
						|
                static bool empty( const A& a )
 | 
						|
                {
 | 
						|
                    return array_length_type::empty(a);
 | 
						|
                }
 | 
						|
                
 | 
						|
 | 
						|
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
 | 
						|
 | 
						|
                template< typename A >
 | 
						|
                static iterator begin( A& a )
 | 
						|
                {
 | 
						|
                    return a;
 | 
						|
                }
 | 
						|
 | 
						|
                template< typename A >
 | 
						|
                static const_iterator begin( const A& a )
 | 
						|
                {
 | 
						|
                    return a;
 | 
						|
                }
 | 
						|
 | 
						|
                template< typename A >
 | 
						|
                static iterator end( A& a )
 | 
						|
                {
 | 
						|
                    return a+array_length_type::length(a);
 | 
						|
                }
 | 
						|
 | 
						|
                template< typename A >
 | 
						|
                static const_iterator end( const A& a )
 | 
						|
                {
 | 
						|
                    return a+array_length_type::length(a);
 | 
						|
                }
 | 
						|
 | 
						|
#else // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
 | 
						|
 | 
						|
                template< typename A >
 | 
						|
                static result_iterator begin( A& a )
 | 
						|
                {
 | 
						|
                    return a;
 | 
						|
                }
 | 
						|
 | 
						|
                template< typename A >
 | 
						|
                static result_iterator end( A& a )
 | 
						|
                {
 | 
						|
                    return a+array_length_type::length(a);
 | 
						|
                }
 | 
						|
 | 
						|
#endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING    
 | 
						|
 | 
						|
            }; 
 | 
						|
 | 
						|
            template<typename T>
 | 
						|
            struct array_container_traits_selector
 | 
						|
            {
 | 
						|
                typedef array_container_traits<T> type;
 | 
						|
            };
 | 
						|
 | 
						|
// Pointer container traits ---------------------------------------------------------------
 | 
						|
 | 
						|
            template<typename T>
 | 
						|
            struct pointer_container_traits
 | 
						|
            {
 | 
						|
                typedef typename
 | 
						|
                    ::boost::remove_pointer<T>::type value_type;
 | 
						|
 | 
						|
                typedef typename
 | 
						|
                    ::boost::remove_cv<value_type>::type char_type;
 | 
						|
                typedef ::std::char_traits<char_type> char_traits;
 | 
						|
 | 
						|
                typedef value_type* iterator;
 | 
						|
                typedef const value_type* const_iterator;
 | 
						|
                typedef std::ptrdiff_t difference_type;
 | 
						|
                typedef std::size_t size_type;
 | 
						|
 | 
						|
                typedef typename
 | 
						|
                    ::boost::mpl::if_< ::boost::is_const<T>,
 | 
						|
                        const_iterator,
 | 
						|
                        iterator 
 | 
						|
                    >::type result_iterator;
 | 
						|
 | 
						|
                // static operations
 | 
						|
                template< typename P >
 | 
						|
                static size_type size( const P& p )
 | 
						|
                {
 | 
						|
                    if ( p==0 ) 
 | 
						|
                        return 0;
 | 
						|
                    else
 | 
						|
                        return char_traits::length(p);
 | 
						|
                }
 | 
						|
 | 
						|
                template< typename P >
 | 
						|
                static bool empty( const P& p )
 | 
						|
                {
 | 
						|
                    return p==0 || p[0]==0;
 | 
						|
                }
 | 
						|
 | 
						|
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
 | 
						|
 | 
						|
                template< typename P >
 | 
						|
                static iterator begin( P& p )
 | 
						|
                {
 | 
						|
                    return p;
 | 
						|
                }
 | 
						|
 | 
						|
                template< typename P >
 | 
						|
                static const_iterator begin( const P& p )
 | 
						|
                {
 | 
						|
                    return p;
 | 
						|
                }
 | 
						|
 | 
						|
                template< typename P >
 | 
						|
                static iterator end( P& p )
 | 
						|
                {
 | 
						|
                    if ( p==0 )
 | 
						|
                        return p;
 | 
						|
                    else
 | 
						|
                        return p+char_traits::length(p);
 | 
						|
                }
 | 
						|
 | 
						|
                template< typename P >
 | 
						|
                static const_iterator end( const P& p )
 | 
						|
                {
 | 
						|
                    if ( p==0 )
 | 
						|
                        return p;
 | 
						|
                    else
 | 
						|
                        return p+char_traits::length(p);
 | 
						|
                }
 | 
						|
 | 
						|
#else // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
 | 
						|
 | 
						|
                template< typename P >
 | 
						|
                static result_iterator begin( P& p )
 | 
						|
                {
 | 
						|
                    return p;
 | 
						|
                }
 | 
						|
 | 
						|
                template< typename P >
 | 
						|
                static result_iterator end( P& p )
 | 
						|
                {
 | 
						|
                    if ( p==0 )
 | 
						|
                        return p;
 | 
						|
                    else
 | 
						|
                        return p+char_traits::length(p);
 | 
						|
                }
 | 
						|
 | 
						|
#endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING    
 | 
						|
            }; 
 | 
						|
 | 
						|
            template<typename T>
 | 
						|
            struct pointer_container_traits_selector
 | 
						|
            {
 | 
						|
                typedef pointer_container_traits<T> type;
 | 
						|
            };
 | 
						|
 | 
						|
        } // namespace detail
 | 
						|
    } // namespace algorithm
 | 
						|
} // namespace boost
 | 
						|
 | 
						|
 | 
						|
#endif  // BOOST_STRING_DETAIL_COLLECTION_HPP
 |