89 lines
3.4 KiB
C++
89 lines
3.4 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// (C) Copyright Ion Gaztanaga 2009-2013.
|
|
//
|
|
// Distributed under 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)
|
|
//
|
|
// See http://www.boost.org/libs/intrusive for documentation.
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// This code was modified from the code posted by Alexandre Courpron in his
|
|
// article "Interface Detection" in The Code Project:
|
|
// http://www.codeproject.com/KB/architecture/Detector.aspx
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Copyright 2007 Alexandre Courpron
|
|
//
|
|
// Permission to use, copy, modify, redistribute and sell this software,
|
|
// provided that this copyright notice appears on all copies of the software.
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef BOOST_INTRUSIVE_DETAIL_FUNCTION_DETECTOR_HPP
|
|
#define BOOST_INTRUSIVE_DETAIL_FUNCTION_DETECTOR_HPP
|
|
|
|
#include <boost/intrusive/detail/config_begin.hpp>
|
|
|
|
namespace boost {
|
|
namespace intrusive {
|
|
namespace function_detector {
|
|
|
|
typedef char NotFoundType;
|
|
struct StaticFunctionType { NotFoundType x [2]; };
|
|
struct NonStaticFunctionType { NotFoundType x [3]; };
|
|
|
|
enum
|
|
{ NotFound = 0,
|
|
StaticFunction = sizeof( StaticFunctionType ) - sizeof( NotFoundType ),
|
|
NonStaticFunction = sizeof( NonStaticFunctionType ) - sizeof( NotFoundType )
|
|
};
|
|
|
|
} //namespace boost {
|
|
} //namespace intrusive {
|
|
} //namespace function_detector {
|
|
|
|
#define BOOST_INTRUSIVE_CREATE_FUNCTION_DETECTOR(Identifier, InstantiationKey) \
|
|
namespace boost { \
|
|
namespace intrusive { \
|
|
namespace function_detector { \
|
|
template < class T, \
|
|
class NonStaticType, \
|
|
class NonStaticConstType, \
|
|
class StaticType > \
|
|
class DetectMember_##InstantiationKey_##Identifier { \
|
|
template < NonStaticType > \
|
|
struct TestNonStaticNonConst ; \
|
|
\
|
|
template < NonStaticConstType > \
|
|
struct TestNonStaticConst ; \
|
|
\
|
|
template < StaticType > \
|
|
struct TestStatic ; \
|
|
\
|
|
template <class U > \
|
|
static NonStaticFunctionType Test( TestNonStaticNonConst<&U::Identifier>*, int ); \
|
|
\
|
|
template <class U > \
|
|
static NonStaticFunctionType Test( TestNonStaticConst<&U::Identifier>*, int ); \
|
|
\
|
|
template <class U> \
|
|
static StaticFunctionType Test( TestStatic<&U::Identifier>*, int ); \
|
|
\
|
|
template <class U> \
|
|
static NotFoundType Test( ... ); \
|
|
public : \
|
|
static const int check = NotFound + (sizeof(Test<T>(0, 0)) - sizeof(NotFoundType));\
|
|
};\
|
|
}}} //namespace boost::intrusive::function_detector {
|
|
|
|
#define BOOST_INTRUSIVE_DETECT_FUNCTION(Class, InstantiationKey, ReturnType, Identifier, Params) \
|
|
::boost::intrusive::function_detector::DetectMember_##InstantiationKey_##Identifier< Class,\
|
|
ReturnType (Class::*)Params,\
|
|
ReturnType (Class::*)Params const,\
|
|
ReturnType (*)Params \
|
|
>::check
|
|
|
|
#include <boost/intrusive/detail/config_end.hpp>
|
|
|
|
#endif //@ifndef BOOST_INTRUSIVE_DETAIL_FUNCTION_DETECTOR_HPP
|