You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
		
		
		
		
		
			
		
			
				
					
					
						
							266 lines
						
					
					
						
							9.3 KiB
						
					
					
				
			
		
		
	
	
							266 lines
						
					
					
						
							9.3 KiB
						
					
					
				//  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) | 
						|
 | 
						|
// (C) Copyright Thorsten Ottosen 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) | 
						|
 | 
						|
// (C) Copyright Jeremy Siek 2001. 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) | 
						|
 | 
						|
//  Original idea of container traits was proposed by Jeremy Siek and | 
						|
//  Thorsten Ottosen. This implementation is lightweighted version | 
						|
//  of container_traits adapter for usage with string_algo library | 
						|
 | 
						|
#ifndef BOOST_RANGE_STRING_COLLECTION_TRAITS_HPP | 
						|
#define BOOST_RANGE_STRING_COLLECTION_TRAITS_HPP | 
						|
 | 
						|
#include <boost/algorithm/string/config.hpp> | 
						|
#include <boost/type_traits/is_array.hpp> | 
						|
#include <boost/type_traits/is_pointer.hpp> | 
						|
#include <boost/mpl/eval_if.hpp> | 
						|
 | 
						|
// Implementation | 
						|
#include <boost/range/detail/collection_traits_detail.hpp> | 
						|
 | 
						|
/*! \file | 
						|
    Defines collection_traits class and related free-standing functions. | 
						|
    This facility is used to unify the access to different types of collections. | 
						|
    It allows the algorithms in the library to work with STL collections, c-style | 
						|
    array, null-terminated c-strings (and more) using the same interface. | 
						|
*/ | 
						|
 | 
						|
namespace boost { | 
						|
    namespace algorithm { | 
						|
 | 
						|
//  collection_traits template class -----------------------------------------// | 
						|
         | 
						|
        //! collection_traits class | 
						|
        /*! | 
						|
            Collection traits provide uniform access to different types of  | 
						|
            collections. This functionality allows to write generic algorithms | 
						|
            which work with several different kinds of collections. | 
						|
 | 
						|
            Currently following collection types are supported: | 
						|
                - containers with STL compatible container interface ( see ContainerConcept ) | 
						|
                    ( i.e. \c std::vector<>, \c std::list<>, \c std::string<> ... ) | 
						|
                - c-style array  | 
						|
                   ( \c char[10], \c int[15] ... ) | 
						|
                - null-terminated c-strings | 
						|
                    ( \c char*, \c wchar_T* ) | 
						|
                - std::pair of iterators  | 
						|
                    ( i.e \c std::pair<vector<int>::iterator,vector<int>::iterator> ) | 
						|
 | 
						|
            Collection traits provide an external collection interface operations. | 
						|
            All are accessible using free-standing functions. | 
						|
 | 
						|
            The following operations are supported: | 
						|
                - \c size() | 
						|
                - \c empty() | 
						|
                - \c begin() | 
						|
                - \c end() | 
						|
 | 
						|
            Container traits have somewhat limited functionality on compilers not | 
						|
            supporting partial template specialization and partial template ordering. | 
						|
        */ | 
						|
        template< typename T > | 
						|
        struct collection_traits | 
						|
        { | 
						|
        private: | 
						|
            typedef BOOST_STRING_TYPENAME ::boost::mpl::eval_if<  | 
						|
                    ::boost::algorithm::detail::is_pair<T>,  | 
						|
                        detail::pair_container_traits_selector<T>, | 
						|
                        BOOST_STRING_TYPENAME ::boost::mpl::eval_if<  | 
						|
                        ::boost::is_array<T>,  | 
						|
                            detail::array_container_traits_selector<T>, | 
						|
                            BOOST_STRING_TYPENAME ::boost::mpl::eval_if< | 
						|
                            ::boost::is_pointer<T>, | 
						|
                                detail::pointer_container_traits_selector<T>, | 
						|
                                detail::default_container_traits_selector<T> | 
						|
                            > | 
						|
                        >  | 
						|
                >::type container_helper_type; | 
						|
        public: | 
						|
            //! Function type        | 
						|
            typedef container_helper_type function_type;         | 
						|
            //! Value type | 
						|
            typedef BOOST_STRING_TYPENAME  | 
						|
                container_helper_type::value_type value_type; | 
						|
            //! Size type | 
						|
            typedef BOOST_STRING_TYPENAME  | 
						|
                container_helper_type::size_type size_type; | 
						|
            //! Iterator type | 
						|
            typedef BOOST_STRING_TYPENAME  | 
						|
                container_helper_type::iterator iterator; | 
						|
            //! Const iterator type | 
						|
            typedef BOOST_STRING_TYPENAME  | 
						|
                container_helper_type::const_iterator const_iterator; | 
						|
            //! Result iterator type ( iterator of const_iterator, depending on the constness of the container ) | 
						|
            typedef BOOST_STRING_TYPENAME  | 
						|
                container_helper_type::result_iterator result_iterator; | 
						|
            //! Difference type | 
						|
            typedef BOOST_STRING_TYPENAME  | 
						|
                container_helper_type::difference_type difference_type; | 
						|
 | 
						|
        }; // 'collection_traits' | 
						|
 | 
						|
//  collection_traits metafunctions -----------------------------------------// | 
						|
 | 
						|
        //! Container value_type trait | 
						|
        /*! | 
						|
            Extract the type of elements contained in a container | 
						|
        */ | 
						|
        template< typename C > | 
						|
        struct value_type_of | 
						|
        { | 
						|
            typedef BOOST_STRING_TYPENAME collection_traits<C>::value_type type; | 
						|
        }; | 
						|
         | 
						|
        //! Container difference trait | 
						|
        /*! | 
						|
            Extract the container's difference type | 
						|
        */ | 
						|
        template< typename C > | 
						|
        struct difference_type_of | 
						|
        { | 
						|
            typedef BOOST_STRING_TYPENAME collection_traits<C>::difference_type type; | 
						|
        }; | 
						|
 | 
						|
        //! Container iterator trait | 
						|
        /*! | 
						|
            Extract the container's iterator type | 
						|
        */ | 
						|
        template< typename C > | 
						|
        struct iterator_of | 
						|
        { | 
						|
            typedef BOOST_STRING_TYPENAME collection_traits<C>::iterator type; | 
						|
        }; | 
						|
 | 
						|
        //! Container const_iterator trait | 
						|
        /*! | 
						|
            Extract the container's const_iterator type | 
						|
        */ | 
						|
        template< typename C > | 
						|
        struct const_iterator_of | 
						|
        { | 
						|
            typedef BOOST_STRING_TYPENAME collection_traits<C>::const_iterator type; | 
						|
        }; | 
						|
 | 
						|
 | 
						|
        //! Container result_iterator | 
						|
        /*! | 
						|
            Extract the container's result_iterator type. This type maps to \c C::iterator | 
						|
            for mutable container and \c C::const_iterator for const containers. | 
						|
        */ | 
						|
        template< typename C > | 
						|
        struct result_iterator_of | 
						|
        { | 
						|
            typedef BOOST_STRING_TYPENAME collection_traits<C>::result_iterator type; | 
						|
        }; | 
						|
 | 
						|
//  collection_traits related functions -----------------------------------------// | 
						|
 | 
						|
        //! Free-standing size() function | 
						|
        /*! | 
						|
            Get the size of the container. Uses collection_traits. | 
						|
        */ | 
						|
        template< typename C > | 
						|
        inline BOOST_STRING_TYPENAME collection_traits<C>::size_type | 
						|
        size( const C& c ) | 
						|
        { | 
						|
            return collection_traits<C>::function_type::size( c );  | 
						|
        } | 
						|
 | 
						|
        //! Free-standing empty() function | 
						|
        /*! | 
						|
            Check whether the container is empty. Uses container traits. | 
						|
        */ | 
						|
        template< typename C > | 
						|
        inline bool empty( const C& c ) | 
						|
        { | 
						|
            return collection_traits<C>::function_type::empty( c ); | 
						|
        } | 
						|
 | 
						|
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING | 
						|
 | 
						|
        //! Free-standing begin() function | 
						|
        /*! | 
						|
            Get the begin iterator of the container. Uses collection_traits. | 
						|
        */ | 
						|
        template< typename C > | 
						|
        inline BOOST_STRING_TYPENAME collection_traits<C>::iterator | 
						|
        begin( C& c ) | 
						|
        { | 
						|
            return collection_traits<C>::function_type::begin( c );  | 
						|
        } | 
						|
 | 
						|
        //! Free-standing begin() function | 
						|
        /*! | 
						|
            \overload | 
						|
        */ | 
						|
        template< typename C > | 
						|
        inline BOOST_STRING_TYPENAME collection_traits<C>::const_iterator | 
						|
        begin( const C& c ) | 
						|
        { | 
						|
            return collection_traits<C>::function_type::begin( c );  | 
						|
        } | 
						|
 | 
						|
        //! Free-standing end() function | 
						|
        /*! | 
						|
            Get the begin iterator of the container. Uses collection_traits. | 
						|
        */ | 
						|
        template< typename C > | 
						|
        inline BOOST_STRING_TYPENAME collection_traits<C>::iterator | 
						|
        end( C& c ) | 
						|
        { | 
						|
            return collection_traits<C>::function_type::end( c ); | 
						|
        } | 
						|
 | 
						|
        //! Free-standing end() function | 
						|
        /*! | 
						|
            \overload            | 
						|
        */ | 
						|
        template< typename C > | 
						|
        inline BOOST_STRING_TYPENAME collection_traits<C>::const_iterator | 
						|
        end( const C& c ) | 
						|
        { | 
						|
            return collection_traits<C>::function_type::end( c ); | 
						|
        } | 
						|
 | 
						|
#else // BOOST_NO_FUNCTION_TEMPLATE_ORDERING | 
						|
 | 
						|
        //! Free-standing begin() function | 
						|
        /*! | 
						|
            \overload | 
						|
        */ | 
						|
        template< typename C > | 
						|
        inline BOOST_STRING_TYPENAME collection_traits<C>::result_iterator | 
						|
        begin( C& c ) | 
						|
        { | 
						|
            return collection_traits<C>::function_type::begin( c ); | 
						|
        } | 
						|
 | 
						|
        //! Free-standing end() function | 
						|
        /*! | 
						|
            \overload | 
						|
        */ | 
						|
        template< typename C > | 
						|
        inline BOOST_STRING_TYPENAME collection_traits<C>::result_iterator | 
						|
        end( C& c ) | 
						|
        { | 
						|
            return collection_traits<C>::function_type::end( c ); | 
						|
        } | 
						|
 | 
						|
#endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING | 
						|
 | 
						|
    } // namespace algorithm | 
						|
} // namespace boost | 
						|
 | 
						|
#endif // BOOST_STRING_COLLECTION_TRAITS_HPP
 | 
						|
 |