You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
87 lines
2.4 KiB
87 lines
2.4 KiB
/*============================================================================= |
|
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 |
|
|
|
|