Chris@16: // Chris@16: // Boost.Pointer Container Chris@16: // Chris@16: // Copyright Thorsten Ottosen 2003-2007. Use, modification and Chris@16: // distribution is subject to the Boost Software License, Version Chris@16: // 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: // For more information, see http://www.boost.org/libs/ptr_container/ Chris@16: // Chris@16: Chris@16: #ifndef BOOST_PTR_CONTAINER_INDIRECT_FUN_HPP Chris@16: #define BOOST_PTR_CONTAINER_INDIRECT_FUN_HPP Chris@16: Chris@16: #if defined(_MSC_VER) && (_MSC_VER >= 1200) Chris@16: #pragma once Chris@16: #endif Chris@16: Chris@16: #include Chris@16: Chris@16: #ifdef BOOST_NO_SFINAE Chris@16: #else Chris@16: #include Chris@16: #include Chris@16: #endif // BOOST_NO_SFINAE Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: Chris@16: namespace ptr_container_detail Chris@16: { Chris@16: template Chris@16: struct make_lazy Chris@16: { Chris@16: typedef typename Type::type type; Chris@16: }; Chris@16: } Chris@16: Chris@16: template Chris@16: < Chris@16: class Fun Chris@16: #ifdef BOOST_NO_SFINAE Chris@16: , class Result = bool Chris@16: #endif Chris@16: > Chris@16: class indirect_fun Chris@16: { Chris@16: Fun fun; Chris@16: public: Chris@16: indirect_fun() : fun(Fun()) Chris@16: { } Chris@16: Chris@16: indirect_fun( Fun f ) : fun(f) Chris@16: { } Chris@16: Chris@16: template< class T > Chris@16: #ifdef BOOST_NO_SFINAE Chris@16: Result Chris@16: #else Chris@16: typename boost::result_of< const Fun( typename pointee::type& ) >::type Chris@16: #endif Chris@16: operator()( const T& r ) const Chris@16: { Chris@16: return fun( *r ); Chris@16: } Chris@16: Chris@16: template< class T, class U > Chris@16: #ifdef BOOST_NO_SFINAE Chris@16: Result Chris@16: #else Chris@16: typename boost::result_of< const Fun( typename pointee::type&, Chris@16: typename pointee::type& ) >::type Chris@16: #endif Chris@16: operator()( const T& r, const U& r2 ) const Chris@16: { Chris@16: return fun( *r, *r2 ); Chris@16: } Chris@16: }; Chris@16: Chris@16: template< class Fun > Chris@16: inline indirect_fun make_indirect_fun( Fun f ) Chris@16: { Chris@16: return indirect_fun( f ); Chris@16: } Chris@16: Chris@16: Chris@16: template Chris@16: < Chris@16: class Fun, Chris@16: class Arg1, Chris@16: class Arg2 = Arg1 Chris@16: #ifdef BOOST_NO_SFINAE Chris@16: , class Result = bool Chris@16: #endif Chris@16: > Chris@16: class void_ptr_indirect_fun Chris@16: { Chris@16: Fun fun; Chris@16: Chris@16: public: Chris@16: Chris@16: void_ptr_indirect_fun() : fun(Fun()) Chris@16: { } Chris@16: Chris@16: void_ptr_indirect_fun( Fun f ) : fun(f) Chris@16: { } Chris@16: Chris@16: template< class Void > Chris@16: #ifdef BOOST_NO_SFINAE Chris@16: Result Chris@16: #else Chris@16: typename ptr_container_detail::make_lazy< Chris@16: boost::result_of, Void>::type Chris@16: #endif Chris@16: operator()( const Void* r ) const Chris@16: { Chris@16: BOOST_STATIC_ASSERT(boost::is_void::value); Chris@16: BOOST_ASSERT( r != 0 ); Chris@16: return fun( * static_cast( r ) ); Chris@16: } Chris@16: Chris@16: template< class Void > Chris@16: #ifdef BOOST_NO_SFINAE Chris@16: Result Chris@16: #else Chris@16: typename ptr_container_detail::make_lazy< Chris@16: boost::result_of, Void>::type Chris@16: #endif Chris@16: operator()( const Void* l, const Void* r ) const Chris@16: { Chris@16: BOOST_STATIC_ASSERT(boost::is_void::value); Chris@16: BOOST_ASSERT( l != 0 && r != 0 ); Chris@16: return fun( * static_cast( l ), * static_cast( r ) ); Chris@16: } Chris@16: }; Chris@16: Chris@16: template< class Arg, class Fun > Chris@16: inline void_ptr_indirect_fun make_void_ptr_indirect_fun( Fun f ) Chris@16: { Chris@16: return void_ptr_indirect_fun( f ); Chris@16: } Chris@16: Chris@16: } // namespace 'boost' Chris@16: Chris@16: #endif