/*============================================================================= 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 #include #include #include #include namespace boost { namespace fusion { namespace detail { template struct that_ptr { private: typedef typename remove_reference::type pointee; template BOOST_FUSION_GPU_ENABLED static inline pointee * do_get_pointer(T &, pointee * x) { return x; } template BOOST_FUSION_GPU_ENABLED static inline pointee * do_get_pointer(T & x, void const *) { return get_pointer(x); } public: BOOST_FUSION_GPU_ENABLED static inline pointee * get(pointee * x) { return x; } BOOST_FUSION_GPU_ENABLED static inline pointee * get(pointee & x) { return boost::addressof(x); } template BOOST_FUSION_GPU_ENABLED static inline pointee * get(T & x) { return do_get_pointer(x, boost::addressof(x)); } }; template struct non_const_pointee; namespace adl_barrier { using boost::get_pointer; void const * BOOST_TT_DECL get_pointer(...); // fallback template< typename T> char const_tester(T *); template< typename T> long const_tester(T const *); template struct non_const_pointee_impl { static Ptr & what; static bool const value = sizeof(const_tester(get_pointer(what))) == 1; }; } template struct non_const_pointee : adl_barrier::non_const_pointee_impl< typename remove_cv< typename remove_reference::type >::type > { typedef non_const_pointee type; typedef bool value_type; }; }}} #endif