PageRenderTime 72ms CodeModel.GetById 40ms app.highlight 15ms RepoModel.GetById 1ms app.codeStats 1ms

/extlibs/Boost/include/boost/range/detail/common.hpp

https://bitbucket.org/hugoruscitti/pilascpp
C++ Header | 117 lines | 81 code | 12 blank | 24 comment | 8 complexity | 88aa40891bf3c8a25c0e11504f52f502 MD5 | raw file
  1// Boost.Range library
  2//
  3//  Copyright Thorsten Ottosen 2003-2004. Use, modification and
  4//  distribution is subject to the Boost Software License, Version
  5//  1.0. (See accompanying file LICENSE_1_0.txt or copy at
  6//  http://www.boost.org/LICENSE_1_0.txt)
  7//
  8// For more information, see http://www.boost.org/libs/range/
  9//
 10
 11#ifndef BOOST_RANGE_DETAIL_COMMON_HPP
 12#define BOOST_RANGE_DETAIL_COMMON_HPP
 13
 14#if defined(_MSC_VER) && (_MSC_VER >= 1200)
 15# pragma once
 16#endif
 17
 18#include <boost/range/config.hpp>
 19#include <boost/range/detail/sfinae.hpp>
 20#include <boost/type_traits/is_void.hpp>
 21#include <boost/type_traits/detail/ice_or.hpp>
 22#include <boost/mpl/if.hpp>
 23#include <boost/mpl/int.hpp>
 24#include <cstddef>
 25
 26//////////////////////////////////////////////////////////////////////////////
 27// missing partial specialization  workaround.
 28//////////////////////////////////////////////////////////////////////////////
 29
 30namespace boost 
 31{
 32    namespace range_detail 
 33    {        
 34        // 1 = std containers
 35        // 2 = std::pair
 36        // 3 = const std::pair
 37        // 4 = array
 38        // 5 = const array
 39        // 6 = char array
 40        // 7 = wchar_t array
 41        // 8 = char*
 42        // 9 = const char*
 43        // 10 = whar_t*
 44        // 11 = const wchar_t*
 45        // 12 = string
 46        
 47        typedef mpl::int_<1>::type    std_container_;
 48        typedef mpl::int_<2>::type    std_pair_;
 49        typedef mpl::int_<3>::type    const_std_pair_;
 50        typedef mpl::int_<4>::type    array_;
 51        typedef mpl::int_<5>::type    const_array_;
 52        typedef mpl::int_<6>::type    char_array_;
 53        typedef mpl::int_<7>::type    wchar_t_array_;
 54        typedef mpl::int_<8>::type    char_ptr_;
 55        typedef mpl::int_<9>::type    const_char_ptr_;
 56        typedef mpl::int_<10>::type   wchar_t_ptr_;
 57        typedef mpl::int_<11>::type   const_wchar_t_ptr_;
 58        typedef mpl::int_<12>::type   string_;
 59        
 60        template< typename C >
 61        struct range_helper
 62        {
 63            static C* c;
 64            static C  ptr;
 65
 66            BOOST_STATIC_CONSTANT( bool, is_pair_                = sizeof( boost::range_detail::is_pair_impl( c ) ) == sizeof( yes_type ) );
 67            BOOST_STATIC_CONSTANT( bool, is_char_ptr_            = sizeof( boost::range_detail::is_char_ptr_impl( ptr ) ) == sizeof( yes_type ) );
 68            BOOST_STATIC_CONSTANT( bool, is_const_char_ptr_      = sizeof( boost::range_detail::is_const_char_ptr_impl( ptr ) ) == sizeof( yes_type ) );
 69            BOOST_STATIC_CONSTANT( bool, is_wchar_t_ptr_         = sizeof( boost::range_detail::is_wchar_t_ptr_impl( ptr ) ) == sizeof( yes_type ) );
 70            BOOST_STATIC_CONSTANT( bool, is_const_wchar_t_ptr_   = sizeof( boost::range_detail::is_const_wchar_t_ptr_impl( ptr ) ) == sizeof( yes_type ) );
 71            BOOST_STATIC_CONSTANT( bool, is_char_array_          = sizeof( boost::range_detail::is_char_array_impl( ptr ) ) == sizeof( yes_type ) );
 72            BOOST_STATIC_CONSTANT( bool, is_wchar_t_array_       = sizeof( boost::range_detail::is_wchar_t_array_impl( ptr ) ) == sizeof( yes_type ) );
 73            BOOST_STATIC_CONSTANT( bool, is_string_              = (boost::type_traits::ice_or<is_const_char_ptr_, is_const_wchar_t_ptr_>::value ));
 74            BOOST_STATIC_CONSTANT( bool, is_array_               = boost::is_array<C>::value );
 75            
 76        };
 77        
 78        template< typename C >
 79        class range
 80        {
 81            typedef BOOST_RANGE_DEDUCED_TYPENAME   boost::mpl::if_c< ::boost::range_detail::range_helper<C>::is_pair_,
 82                                                                  boost::range_detail::std_pair_,
 83                                                                  void >::type pair_t;
 84            typedef BOOST_RANGE_DEDUCED_TYPENAME   boost::mpl::if_c< ::boost::range_detail::range_helper<C>::is_array_,
 85                                                                    boost::range_detail::array_,
 86                                                                    pair_t >::type array_t;
 87            typedef BOOST_RANGE_DEDUCED_TYPENAME   boost::mpl::if_c< ::boost::range_detail::range_helper<C>::is_string_,
 88                                                                    boost::range_detail::string_,
 89                                                                    array_t >::type string_t;
 90            typedef BOOST_RANGE_DEDUCED_TYPENAME   boost::mpl::if_c< ::boost::range_detail::range_helper<C>::is_const_char_ptr_,
 91                                                                    boost::range_detail::const_char_ptr_,
 92                                                                    string_t >::type const_char_ptr_t;
 93            typedef BOOST_RANGE_DEDUCED_TYPENAME   boost::mpl::if_c< ::boost::range_detail::range_helper<C>::is_char_ptr_,
 94                                                                    boost::range_detail::char_ptr_,
 95                                                                    const_char_ptr_t >::type char_ptr_t;
 96            typedef BOOST_RANGE_DEDUCED_TYPENAME   boost::mpl::if_c< ::boost::range_detail::range_helper<C>::is_const_wchar_t_ptr_,
 97                                                                    boost::range_detail::const_wchar_t_ptr_,
 98                                                                    char_ptr_t >::type const_wchar_ptr_t;
 99            typedef BOOST_RANGE_DEDUCED_TYPENAME   boost::mpl::if_c< ::boost::range_detail::range_helper<C>::is_wchar_t_ptr_,
100                                                                    boost::range_detail::wchar_t_ptr_,
101                                                                    const_wchar_ptr_t >::type wchar_ptr_t;
102            typedef BOOST_RANGE_DEDUCED_TYPENAME   boost::mpl::if_c< ::boost::range_detail::range_helper<C>::is_wchar_t_array_,
103                                                                    boost::range_detail::wchar_t_array_,
104                                                                    wchar_ptr_t >::type wchar_array_t;
105            typedef BOOST_RANGE_DEDUCED_TYPENAME   boost::mpl::if_c< ::boost::range_detail::range_helper<C>::is_char_array_,
106                                                                    boost::range_detail::char_array_,
107                                                                    wchar_array_t >::type char_array_t;
108        public:
109            typedef BOOST_RANGE_DEDUCED_TYPENAME   boost::mpl::if_c< ::boost::is_void<char_array_t>::value,
110                                                                    boost::range_detail::std_container_,
111                                                                    char_array_t >::type type;  
112        }; // class 'range' 
113    }
114}
115        
116#endif
117