⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 collection_traits_detail.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
📖 第 1 页 / 共 2 页
字号:
//  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 <boost/algorithm/string/config.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>#include <boost/algorithm/string/yes_no_type.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 BOOST_STRING_TYPENAME ContainerT::value_type value_type;                typedef BOOST_STRING_TYPENAME ContainerT::iterator iterator;                typedef BOOST_STRING_TYPENAME ContainerT::const_iterator const_iterator;                typedef BOOST_STRING_TYPENAME                     ::boost::mpl::if_< ::boost::is_const<ContainerT>,                        const_iterator,                        iterator                     >::type result_iterator;                typedef BOOST_STRING_TYPENAME ContainerT::difference_type difference_type;                typedef BOOST_STRING_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 ---------------------------------------------------------------------                                // 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 BOOST_STRING_TYPENAME PairT::first_type element_type;                typedef BOOST_STRING_TYPENAME ::boost::detail::                    iterator_traits<element_type>::value_type value_type;                typedef std::size_t size_type;                typedef BOOST_STRING_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 ---------------------------------------------------------------#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION            // 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 );            };#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION            // array traits ( no partial specialization )            /*                without parial specialization we are able to                provide support only for a limited number of                types. Currently the primitive numeric types                 are supported            */            template< typename T, typename BaseT >            struct array_traits_impl            {                typedef BaseT value_type;                typedef BaseT* iterator;                typedef const BaseT* const_iterator;                typedef std::size_t size_type;                typedef std::ptrdiff_t difference_type;                // size of the array                BOOST_STATIC_CONSTANT( size_type, array_size = sizeof(T)/sizeof(BaseT) );            };                        template< typename T, typename BaseT >            struct array_traits_impl_selector            {                typedef array_traits_impl<T,BaseT> type;            };            struct array_traits_void            {                typedef void type;            };            template< typename T, typename BaseT >            struct array_traits_cv_selector            {                typedef BOOST_STRING_TYPENAME                     ::boost::mpl::eval_if<                         ::boost::is_convertible<T,BaseT*>,                        array_traits_impl_selector<T,BaseT>,                        ::boost::mpl::eval_if<                             ::boost::is_convertible<T,const BaseT*>,                                array_traits_impl_selector<T, const BaseT>,                                ::boost::mpl::eval_if<                                     ::boost::is_convertible<T, volatile BaseT*>,                                    array_traits_impl_selector<T, volatile BaseT>,                                    array_traits_impl_selector<T, const volatile BaseT>                                >                            >                    >::type type;            };            template< typename T >            struct array_traits_select            {                template< typename T1, typename T2 >                struct apply                {                    typedef BOOST_STRING_TYPENAME                        ::boost::mpl::eval_if<                             ::boost::is_convertible<T,const volatile T2*>,                            array_traits_cv_selector<T,T2>,                            ::boost::mpl::identity<T1> >::type type;                };            };            template< typename T >            struct array_traits_selector             {            private:                // supported array base types#ifndef BOOST_NO_INTRINSIC_WCHAR_T                typedef BOOST_STRING_TYPENAME                    ::boost::mpl::vector10<                        wchar_t,#else // BOOST_NO_INTRINSIC_WCHAR_T                typedef BOOST_STRING_TYPENAME                    ::boost::mpl::vector9<#endif // BOOST_NO_INTRINSIC_WCHAR_T                        char,                        signed char,                        unsigned char,                        signed short,                        unsigned short,                        signed int,                        unsigned int,                        signed long,                        unsigned long                >::type array_base_types;            public:                typedef BOOST_STRING_TYPENAME                    ::boost::mpl::fold<                        array_base_types,                        ::boost::algorithm::detail::array_traits_void,                        ::boost::algorithm::detail::array_traits_select<T> >::type type;            };            template< typename T >            struct array_traits            {                typedef BOOST_STRING_TYPENAME                    array_traits_selector<T>::type traits_type;                typedef BOOST_STRING_TYPENAME

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -