blob: 7c32a10c544e0dceef047f4e32562142f71f58e3 [file] [log] [blame]
/*=============================================================================
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