133 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			133 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// (C) Copyright Tobias Schwinger
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Use modification and distribution are subject to the boost Software License,
							 | 
						||
| 
								 | 
							
								// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//------------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef BOOST_FT_DETAIL_CV_TRAITS_HPP_INCLUDED
							 | 
						||
| 
								 | 
							
								#define BOOST_FT_DETAIL_CV_TRAITS_HPP_INCLUDED
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <cstddef>
							 | 
						||
| 
								 | 
							
								#include <boost/detail/workaround.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if BOOST_WORKAROUND(__BORLANDC__, <= 0x582)
							 | 
						||
| 
								 | 
							
								#   include <boost/type_traits/remove_cv.hpp>
							 | 
						||
| 
								 | 
							
								#   include <boost/type_traits/remove_pointer.hpp>
							 | 
						||
| 
								 | 
							
								#   include <boost/type_traits/remove_reference.hpp>
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/function_types/property_tags.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost { namespace function_types { namespace detail {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if !BOOST_WORKAROUND(__BORLANDC__, <= 0x582)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits 
							 | 
						||
| 
								 | 
							
								{ typedef non_cv tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T &>     
							 | 
						||
| 
								 | 
							
								{ typedef non_cv tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T *>    
							 | 
						||
| 
								 | 
							
								{ typedef non_cv tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T * const> 
							 | 
						||
| 
								 | 
							
								{ typedef non_cv tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T * volatile> 
							 | 
						||
| 
								 | 
							
								{ typedef non_cv tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T * const volatile> 
							 | 
						||
| 
								 | 
							
								{ typedef non_cv tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T const> 
							 | 
						||
| 
								 | 
							
								{ typedef const_non_volatile tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T const &>
							 | 
						||
| 
								 | 
							
								{ typedef const_non_volatile tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T const *> 
							 | 
						||
| 
								 | 
							
								{ typedef const_non_volatile tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T const * const> 
							 | 
						||
| 
								 | 
							
								{ typedef const_non_volatile tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T const * volatile> 
							 | 
						||
| 
								 | 
							
								{ typedef const_non_volatile tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T const * const volatile> 
							 | 
						||
| 
								 | 
							
								{ typedef const_non_volatile tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T volatile>  
							 | 
						||
| 
								 | 
							
								{ typedef volatile_non_const tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T volatile &>  
							 | 
						||
| 
								 | 
							
								{ typedef volatile_non_const tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T volatile *> 
							 | 
						||
| 
								 | 
							
								{ typedef volatile_non_const tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T volatile * const> 
							 | 
						||
| 
								 | 
							
								{ typedef volatile_non_const tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T volatile * volatile> 
							 | 
						||
| 
								 | 
							
								{ typedef volatile_non_const tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T volatile * const volatile> 
							 | 
						||
| 
								 | 
							
								{ typedef volatile_non_const tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T const volatile>   
							 | 
						||
| 
								 | 
							
								{ typedef cv_qualified tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T const volatile &>
							 | 
						||
| 
								 | 
							
								{ typedef cv_qualified tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T const volatile *>
							 | 
						||
| 
								 | 
							
								{ typedef cv_qualified tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T const volatile * const>
							 | 
						||
| 
								 | 
							
								{ typedef cv_qualified tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T const volatile * volatile>
							 | 
						||
| 
								 | 
							
								{ typedef cv_qualified tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits<T const volatile * const volatile>
							 | 
						||
| 
								 | 
							
								{ typedef cv_qualified tag; typedef T type; };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								template<std::size_t> struct cv_tag_impl;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<> struct cv_tag_impl<1> { typedef non_cv type;};
							 | 
						||
| 
								 | 
							
								template<> struct cv_tag_impl<2> { typedef const_non_volatile type; };
							 | 
						||
| 
								 | 
							
								template<> struct cv_tag_impl<3> { typedef volatile_non_const type; };
							 | 
						||
| 
								 | 
							
								template<> struct cv_tag_impl<4> { typedef cv_qualified type; };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef char (& case_1)[1];
							 | 
						||
| 
								 | 
							
								typedef char (& case_2)[2];
							 | 
						||
| 
								 | 
							
								typedef char (& case_3)[3];
							 | 
						||
| 
								 | 
							
								typedef char (& case_4)[4];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<typename T> case_1 switch_cv(T *);
							 | 
						||
| 
								 | 
							
								template<typename T> case_2 switch_cv(T const *);
							 | 
						||
| 
								 | 
							
								template<typename T> case_3 switch_cv(T volatile *);
							 | 
						||
| 
								 | 
							
								template<typename T> case_4 switch_cv(T const volatile *);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<typename T> T                * ref_to_ptr(T &);
							 | 
						||
| 
								 | 
							
								template<typename T> T const          * ref_to_ptr(T const &);
							 | 
						||
| 
								 | 
							
								template<typename T> T volatile       * ref_to_ptr(T volatile &);
							 | 
						||
| 
								 | 
							
								template<typename T> T const volatile * ref_to_ptr(T const volatile &);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<typename T> T                * ref_to_ptr(T * const volatile &);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<typename T>
							 | 
						||
| 
								 | 
							
								struct cv_code
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  static T _t;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(std::size_t, value = 
							 | 
						||
| 
								 | 
							
								      sizeof(::boost::function_types::detail::switch_cv(
							 | 
						||
| 
								 | 
							
								         ::boost::function_types::detail::ref_to_ptr(_t) ) ));
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<typename T> struct cv_traits 
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  typedef typename boost::function_types::detail::cv_tag_impl< 
							 | 
						||
| 
								 | 
							
								    ::boost::function_types::detail::cv_code<T>::value >::type
							 | 
						||
| 
								 | 
							
								  tag;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // may require Boost.TypeTraits broken compiler specializations
							 | 
						||
| 
								 | 
							
								  // to work
							 | 
						||
| 
								 | 
							
								  typedef typename boost::remove_cv<
							 | 
						||
| 
								 | 
							
								              typename boost::remove_pointer<
							 | 
						||
| 
								 | 
							
								                  typename boost::remove_reference<T>::type 
							 | 
						||
| 
								 | 
							
								              >::type 
							 | 
						||
| 
								 | 
							
								          >::type type; 
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								} } } // namespace boost::function_types::detail
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								 
							 |