| /*============================================================================= |
| 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/get_pointer.hpp> |
| #include <boost/utility/addressof.hpp> |
| #include <boost/type_traits/config.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> |
| static inline pointee * do_get_pointer(T &, pointee * x) |
| { |
| return x; |
| } |
| template <typename T> |
| static inline pointee * do_get_pointer(T & x, void const *) |
| { |
| return get_pointer(x); |
| } |
| |
| public: |
| |
| static inline pointee * get(pointee * x) |
| { |
| return x; |
| } |
| |
| static inline pointee * get(pointee & x) |
| { |
| return boost::addressof(x); |
| } |
| |
| template <typename T> static inline pointee * get(T & x) |
| { |
| return do_get_pointer(x, boost::addressof(x)); |
| } |
| }; |
| |
| template <typename PtrOrSmartPtr> 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 <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 |
| |