123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- // 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/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 typename ::boost::mpl::eval_if<
- ::boost::algorithm::detail::is_pair<T>,
- detail::pair_container_traits_selector<T>,
- typename ::boost::mpl::eval_if<
- ::boost::is_array<T>,
- detail::array_container_traits_selector<T>,
- 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 typename
- container_helper_type::value_type value_type;
- //! Size type
- typedef typename
- container_helper_type::size_type size_type;
- //! Iterator type
- typedef typename
- container_helper_type::iterator iterator;
- //! Const iterator type
- typedef typename
- container_helper_type::const_iterator const_iterator;
- //! Result iterator type ( iterator of const_iterator, depending on the constness of the container )
- typedef typename
- container_helper_type::result_iterator result_iterator;
- //! Difference type
- typedef 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 typename collection_traits<C>::value_type type;
- };
-
- //! Container difference trait
- /*!
- Extract the container's difference type
- */
- template< typename C >
- struct difference_type_of
- {
- typedef typename collection_traits<C>::difference_type type;
- };
- //! Container iterator trait
- /*!
- Extract the container's iterator type
- */
- template< typename C >
- struct iterator_of
- {
- typedef 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 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 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 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 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 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 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 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 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 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
|