PageRenderTime 17ms CodeModel.GetById 7ms app.highlight 8ms RepoModel.GetById 1ms app.codeStats 0ms

/extlibs/Boost/include/boost/type_traits/msvc/remove_volatile.hpp

https://bitbucket.org/hugoruscitti/pilascpp
C++ Header | 143 lines | 131 code | 9 blank | 3 comment | 0 complexity | 5a4571ca90a9b08977aa2f2a3449bdc0 MD5 | raw file
  1// Copyright (C) 2004 Peder Holt
  2// Use, modification and distribution is subject to the Boost Software
  3// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt)
  4
  5#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_VOLATILE_HOLT_2004_0828
  6#define BOOST_TYPE_TRAITS_MSVC_REMOVE_VOLATILE_HOLT_2004_0828
  7
  8#include <boost/type_traits/msvc/typeof.hpp>
  9#include <boost/type_traits/is_volatile.hpp>
 10#include <boost/type_traits/is_const.hpp>
 11#include <boost/type_traits/is_pointer.hpp>
 12#include <boost/type_traits/is_array.hpp>
 13
 14namespace boost {
 15    namespace detail {
 16        template<bool IsPointer,bool IsArray,bool IsConst,bool IsVolatile>
 17        struct remove_volatile_impl_typeof {
 18            template<typename T,typename ID>
 19            struct inner {
 20                typedef T type;
 21            };
 22            template<typename T>
 23            struct transform_type {
 24                typedef T type;
 25            };
 26        };
 27        template<> //Volatile
 28        struct remove_volatile_impl_typeof<false,false,false,true> {
 29            template<typename T,typename ID>
 30            struct inner {
 31                template<typename U>
 32                static msvc_register_type<U,ID> test(U volatile&(*)());
 33                static msvc_register_type<T,ID> test(...);
 34                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) ));
 35                typedef typename msvc_extract_type<ID>::id2type::type type;
 36            };            
 37            template<typename T>
 38            struct transform_type {
 39                typedef T& type;
 40            };
 41        };
 42        template<> //CV
 43        struct remove_volatile_impl_typeof<false,false,true,true> {
 44            template<typename T,typename ID>
 45            struct inner {
 46                template<typename U>
 47                static msvc_register_type<U const,ID> test(U const volatile&(*)());
 48                static msvc_register_type<T,ID> test(...);
 49                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) ));
 50                typedef typename msvc_extract_type<ID>::id2type::type type;
 51            };
 52            template<typename T>
 53            struct transform_type {
 54                typedef T& type;
 55            };
 56        };
 57        template<> //Volatile Pointer
 58        struct remove_volatile_impl_typeof<true,false,false,true> {
 59            template<typename T,typename ID>
 60            struct inner {
 61                template<typename U>
 62                static msvc_register_type<U,ID> test(void(*)(U volatile[]));
 63                static msvc_register_type<T,ID> test(...);
 64                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) ));
 65                typedef typename msvc_extract_type<ID>::id2type::type type;
 66            };
 67            template<typename T>
 68            struct transform_type {
 69                typedef T type[];
 70            };
 71        };
 72        template<> //CV Pointer
 73        struct remove_volatile_impl_typeof<true,false,true,true> {
 74            template<typename T,typename ID>
 75            struct inner {
 76                template<typename U>
 77                static msvc_register_type<U const,ID> test(void(*)(U const volatile[]));
 78                static msvc_register_type<T,ID> test(...);
 79                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) ));
 80                typedef typename msvc_extract_type<ID>::id2type::type type;
 81            };
 82            template<typename T>
 83            struct transform_type {
 84                typedef T type[];
 85            };
 86        };        
 87        template<> //Volatile Array
 88        struct remove_volatile_impl_typeof<false,true,false,true> {
 89            template<typename T,typename ID>
 90            struct inner {
 91                BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0])));
 92
 93                template<typename U>
 94                static msvc_register_type<U[value],ID> test(void(*)(U volatile[]));
 95                static msvc_register_type<T,ID> test(...);
 96                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) ));
 97                typedef typename msvc_extract_type<ID>::id2type::type type;                
 98            };
 99            template<typename T>
100            struct transform_type {
101                typedef T type;
102            };
103        };
104
105        template<> //CV Array
106        struct remove_volatile_impl_typeof<false,true,true,true> {
107            template<typename T,typename ID>
108            struct inner {
109                BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0])));
110
111                template<typename U>
112                static msvc_register_type<U const[value],ID> test(void(*)(U const volatile[]));
113                static msvc_register_type<T,ID> test(...);
114                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) ));
115                typedef typename msvc_extract_type<ID>::id2type::type type;
116            };
117            template<typename T>
118            struct transform_type {
119                typedef T type;
120            };
121        };
122
123    } //namespace detail
124
125    template<typename T>
126    struct remove_volatile {
127        typedef boost::detail::remove_volatile_impl_typeof<
128            boost::is_pointer<T>::value,
129            boost::is_array<T>::value,
130            boost::is_const<T>::value,
131            boost::is_volatile<T>::value
132        > remove_volatile_type;
133        typedef typename 
134            remove_volatile_type::template inner<
135                typename remove_volatile_type::template transform_type<T>::type,
136                remove_volatile<T>
137            >::type
138        type;
139        BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_volatile,T)
140    };
141}//namespace boost
142
143#endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_VOLATILE_HOLT_2004_0828