123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- /*=============================================================================
- 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(BOOST_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
|