100 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			100 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /*============================================================================= | ||
|  |     Copyright (c) 2006-2007 Tobias Schwinger | ||
|  |    | ||
|  |     Use modification and distribution are 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). | ||
|  | ==============================================================================*/ | ||
|  | 
 | ||
|  | #if !defined(BOOST_FUSION_FUNCTIONAL_INVOCATION_DETAIL_THAT_PTR_HPP_INCLUDED) | ||
|  | #define BOOST_FUSION_FUNCTIONAL_INVOCATION_DETAIL_THAT_PTR_HPP_INCLUDED | ||
|  | 
 | ||
|  | #include <boost/fusion/support/config.hpp> | ||
|  | #include <boost/get_pointer.hpp> | ||
|  | #include <boost/utility/addressof.hpp> | ||
|  | #include <boost/type_traits/remove_reference.hpp> | ||
|  | 
 | ||
|  | namespace boost { namespace fusion { namespace detail | ||
|  | { | ||
|  |     template <typename Wanted> | ||
|  |     struct that_ptr | ||
|  |     { | ||
|  |       private: | ||
|  | 
 | ||
|  |         typedef typename remove_reference<Wanted>::type pointee; | ||
|  | 
 | ||
|  |         template <typename T>  | ||
|  |         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         static inline pointee * do_get_pointer(T &, pointee * x)  | ||
|  |         { | ||
|  |             return x; | ||
|  |         } | ||
|  |         template <typename T>  | ||
|  |         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         static inline pointee * do_get_pointer(T & x, void const *)  | ||
|  |         { | ||
|  |             return get_pointer(x);  | ||
|  |         } | ||
|  | 
 | ||
|  |       public: | ||
|  | 
 | ||
|  |         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         static inline pointee * get(pointee * x) | ||
|  |         { | ||
|  |             return x;  | ||
|  |         } | ||
|  | 
 | ||
|  |         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         static inline pointee * get(pointee & x) | ||
|  |         { | ||
|  |             return boost::addressof(x);  | ||
|  |         } | ||
|  | 
 | ||
|  |         template <typename T> | ||
|  |         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         static inline pointee * get(T & x) | ||
|  |         { | ||
|  |             return do_get_pointer(x, boost::addressof(x));  | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     template <typename PtrOrSmartPtr> struct non_const_pointee; | ||
|  | 
 | ||
|  | #if defined(BOOST_MSVC) || (defined(__BORLANDC__) && !defined(BOOST_DISABLE_WIN32)) | ||
|  | #   define BOOST_FUSION_TRAIT_DECL __cdecl | ||
|  | #else | ||
|  | #   define BOOST_FUSION_TRAIT_DECL /**/ | ||
|  | #endif | ||
|  | 
 | ||
|  | namespace adl_barrier | ||
|  |     { | ||
|  |         using boost::get_pointer; | ||
|  |         void const * BOOST_FUSION_TRAIT_DECL get_pointer(...); // fallback | ||
|  |    | ||
|  |         template< typename T> char const_tester(T *); | ||
|  |         template< typename T> long const_tester(T const *); | ||
|  | 
 | ||
|  |         template <typename Ptr> | ||
|  |         struct non_const_pointee_impl | ||
|  |         { | ||
|  |             static Ptr & what; | ||
|  | 
 | ||
|  |             static bool const value = | ||
|  |                 sizeof(const_tester(get_pointer(what))) == 1; | ||
|  |         }; | ||
|  |     } | ||
|  | 
 | ||
|  |     template <typename PtrOrSmartPtr> struct non_const_pointee | ||
|  |         : adl_barrier::non_const_pointee_impl<  | ||
|  |               typename remove_cv< | ||
|  |                   typename remove_reference<PtrOrSmartPtr>::type >::type > | ||
|  |     { | ||
|  |         typedef non_const_pointee type; | ||
|  |         typedef bool value_type; | ||
|  |     }; | ||
|  | 
 | ||
|  | }}} | ||
|  | 
 | ||
|  | #endif | ||
|  | 
 |