Chris@16: /*============================================================================= Chris@16: Copyright (c) 2006-2007 Tobias Schwinger Chris@16: Chris@16: Use modification and distribution are subject to the Boost Software Chris@16: License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: http://www.boost.org/LICENSE_1_0.txt). Chris@16: ==============================================================================*/ Chris@16: Chris@16: #if !defined(BOOST_FUSION_FUNCTIONAL_INVOCATION_DETAIL_THAT_PTR_HPP_INCLUDED) Chris@16: #define BOOST_FUSION_FUNCTIONAL_INVOCATION_DETAIL_THAT_PTR_HPP_INCLUDED Chris@16: Chris@101: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace fusion { namespace detail Chris@16: { Chris@16: template Chris@16: struct that_ptr Chris@16: { Chris@16: private: Chris@16: Chris@16: typedef typename remove_reference::type pointee; Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static inline pointee * do_get_pointer(T &, pointee * x) Chris@16: { Chris@16: return x; Chris@16: } Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static inline pointee * do_get_pointer(T & x, void const *) Chris@16: { Chris@16: return get_pointer(x); Chris@16: } Chris@16: Chris@16: public: Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static inline pointee * get(pointee * x) Chris@16: { Chris@16: return x; Chris@16: } Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static inline pointee * get(pointee & x) Chris@16: { Chris@16: return boost::addressof(x); Chris@16: } Chris@16: Chris@101: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@101: static inline pointee * get(T & x) Chris@16: { Chris@16: return do_get_pointer(x, boost::addressof(x)); Chris@16: } Chris@16: }; Chris@16: Chris@16: template struct non_const_pointee; Chris@16: Chris@16: namespace adl_barrier Chris@16: { Chris@16: using boost::get_pointer; Chris@16: void const * BOOST_TT_DECL get_pointer(...); // fallback Chris@16: Chris@16: template< typename T> char const_tester(T *); Chris@16: template< typename T> long const_tester(T const *); Chris@16: Chris@16: template Chris@16: struct non_const_pointee_impl Chris@16: { Chris@16: static Ptr & what; Chris@16: Chris@16: static bool const value = Chris@16: sizeof(const_tester(get_pointer(what))) == 1; Chris@16: }; Chris@16: } Chris@16: Chris@16: template struct non_const_pointee Chris@16: : adl_barrier::non_const_pointee_impl< Chris@16: typename remove_cv< Chris@16: typename remove_reference::type >::type > Chris@16: { Chris@16: typedef non_const_pointee type; Chris@16: typedef bool value_type; Chris@16: }; Chris@16: Chris@16: }}} Chris@16: Chris@16: #endif Chris@16: