Chris@16: ///////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // (C) Copyright Ion Gaztanaga 2009-2013. Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: // See http://www.boost.org/libs/intrusive for documentation. Chris@16: // Chris@16: ///////////////////////////////////////////////////////////////////////////// Chris@16: // This code was modified from the code posted by Alexandre Courpron in his Chris@16: // article "Interface Detection" in The Code Project: Chris@16: // http://www.codeproject.com/KB/architecture/Detector.aspx Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // Copyright 2007 Alexandre Courpron Chris@16: // Chris@16: // Permission to use, copy, modify, redistribute and sell this software, Chris@16: // provided that this copyright notice appears on all copies of the software. Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: #ifndef BOOST_INTRUSIVE_DETAIL_FUNCTION_DETECTOR_HPP Chris@16: #define BOOST_INTRUSIVE_DETAIL_FUNCTION_DETECTOR_HPP Chris@16: Chris@101: #ifndef BOOST_CONFIG_HPP Chris@101: # include Chris@101: #endif Chris@101: Chris@101: #if defined(BOOST_HAS_PRAGMA_ONCE) Chris@101: # pragma once Chris@101: #endif Chris@16: Chris@16: namespace boost { Chris@16: namespace intrusive { Chris@16: namespace function_detector { Chris@16: Chris@16: typedef char NotFoundType; Chris@16: struct StaticFunctionType { NotFoundType x [2]; }; Chris@16: struct NonStaticFunctionType { NotFoundType x [3]; }; Chris@16: Chris@16: enum Chris@16: { NotFound = 0, Chris@16: StaticFunction = sizeof( StaticFunctionType ) - sizeof( NotFoundType ), Chris@16: NonStaticFunction = sizeof( NonStaticFunctionType ) - sizeof( NotFoundType ) Chris@16: }; Chris@16: Chris@16: } //namespace boost { Chris@16: } //namespace intrusive { Chris@16: } //namespace function_detector { Chris@16: Chris@16: #define BOOST_INTRUSIVE_CREATE_FUNCTION_DETECTOR(Identifier, InstantiationKey) \ Chris@16: namespace boost { \ Chris@16: namespace intrusive { \ Chris@16: namespace function_detector { \ Chris@16: template < class T, \ Chris@16: class NonStaticType, \ Chris@16: class NonStaticConstType, \ Chris@16: class StaticType > \ Chris@16: class DetectMember_##InstantiationKey_##Identifier { \ Chris@16: template < NonStaticType > \ Chris@16: struct TestNonStaticNonConst ; \ Chris@16: \ Chris@16: template < NonStaticConstType > \ Chris@16: struct TestNonStaticConst ; \ Chris@16: \ Chris@16: template < StaticType > \ Chris@16: struct TestStatic ; \ Chris@16: \ Chris@16: template \ Chris@16: static NonStaticFunctionType Test( TestNonStaticNonConst<&U::Identifier>*, int ); \ Chris@16: \ Chris@16: template \ Chris@16: static NonStaticFunctionType Test( TestNonStaticConst<&U::Identifier>*, int ); \ Chris@16: \ Chris@16: template \ Chris@16: static StaticFunctionType Test( TestStatic<&U::Identifier>*, int ); \ Chris@16: \ Chris@16: template \ Chris@16: static NotFoundType Test( ... ); \ Chris@16: public : \ Chris@16: static const int check = NotFound + (sizeof(Test(0, 0)) - sizeof(NotFoundType));\ Chris@16: };\ Chris@16: }}} //namespace boost::intrusive::function_detector { Chris@16: Chris@16: #define BOOST_INTRUSIVE_DETECT_FUNCTION(Class, InstantiationKey, ReturnType, Identifier, Params) \ Chris@16: ::boost::intrusive::function_detector::DetectMember_##InstantiationKey_##Identifier< Class,\ Chris@16: ReturnType (Class::*)Params,\ Chris@16: ReturnType (Class::*)Params const,\ Chris@16: ReturnType (*)Params \ Chris@16: >::check Chris@16: Chris@16: #endif //@ifndef BOOST_INTRUSIVE_DETAIL_FUNCTION_DETECTOR_HPP