annotate DEPENDENCIES/generic/include/boost/ptr_container/indirect_fun.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 //
Chris@16 2 // Boost.Pointer Container
Chris@16 3 //
Chris@16 4 // Copyright Thorsten Ottosen 2003-2007. Use, modification and
Chris@16 5 // distribution is subject to the Boost Software License, Version
Chris@16 6 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 7 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 8 //
Chris@16 9 // For more information, see http://www.boost.org/libs/ptr_container/
Chris@16 10 //
Chris@16 11
Chris@16 12 #ifndef BOOST_PTR_CONTAINER_INDIRECT_FUN_HPP
Chris@16 13 #define BOOST_PTR_CONTAINER_INDIRECT_FUN_HPP
Chris@16 14
Chris@16 15 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
Chris@16 16 #pragma once
Chris@16 17 #endif
Chris@16 18
Chris@16 19 #include <boost/config.hpp>
Chris@16 20
Chris@16 21 #ifdef BOOST_NO_SFINAE
Chris@16 22 #else
Chris@16 23 #include <boost/utility/result_of.hpp>
Chris@16 24 #include <boost/pointee.hpp>
Chris@16 25 #endif // BOOST_NO_SFINAE
Chris@16 26
Chris@16 27 #include <boost/assert.hpp>
Chris@16 28 #include <boost/static_assert.hpp>
Chris@16 29 #include <boost/type_traits/is_void.hpp>
Chris@16 30 #include <functional>
Chris@16 31
Chris@16 32
Chris@16 33 namespace boost
Chris@16 34 {
Chris@16 35
Chris@16 36 namespace ptr_container_detail
Chris@16 37 {
Chris@16 38 template <typename Type, typename Dummy>
Chris@16 39 struct make_lazy
Chris@16 40 {
Chris@16 41 typedef typename Type::type type;
Chris@16 42 };
Chris@16 43 }
Chris@16 44
Chris@16 45 template
Chris@16 46 <
Chris@16 47 class Fun
Chris@16 48 #ifdef BOOST_NO_SFINAE
Chris@16 49 , class Result = bool
Chris@16 50 #endif
Chris@16 51 >
Chris@16 52 class indirect_fun
Chris@16 53 {
Chris@16 54 Fun fun;
Chris@16 55 public:
Chris@16 56 indirect_fun() : fun(Fun())
Chris@16 57 { }
Chris@16 58
Chris@16 59 indirect_fun( Fun f ) : fun(f)
Chris@16 60 { }
Chris@16 61
Chris@16 62 template< class T >
Chris@16 63 #ifdef BOOST_NO_SFINAE
Chris@16 64 Result
Chris@16 65 #else
Chris@16 66 typename boost::result_of< const Fun( typename pointee<T>::type& ) >::type
Chris@16 67 #endif
Chris@16 68 operator()( const T& r ) const
Chris@16 69 {
Chris@16 70 return fun( *r );
Chris@16 71 }
Chris@16 72
Chris@16 73 template< class T, class U >
Chris@16 74 #ifdef BOOST_NO_SFINAE
Chris@16 75 Result
Chris@16 76 #else
Chris@16 77 typename boost::result_of< const Fun( typename pointee<T>::type&,
Chris@16 78 typename pointee<U>::type& ) >::type
Chris@16 79 #endif
Chris@16 80 operator()( const T& r, const U& r2 ) const
Chris@16 81 {
Chris@16 82 return fun( *r, *r2 );
Chris@16 83 }
Chris@16 84 };
Chris@16 85
Chris@16 86 template< class Fun >
Chris@16 87 inline indirect_fun<Fun> make_indirect_fun( Fun f )
Chris@16 88 {
Chris@16 89 return indirect_fun<Fun>( f );
Chris@16 90 }
Chris@16 91
Chris@16 92
Chris@16 93 template
Chris@16 94 <
Chris@16 95 class Fun,
Chris@16 96 class Arg1,
Chris@16 97 class Arg2 = Arg1
Chris@16 98 #ifdef BOOST_NO_SFINAE
Chris@16 99 , class Result = bool
Chris@16 100 #endif
Chris@16 101 >
Chris@16 102 class void_ptr_indirect_fun
Chris@16 103 {
Chris@16 104 Fun fun;
Chris@16 105
Chris@16 106 public:
Chris@16 107
Chris@16 108 void_ptr_indirect_fun() : fun(Fun())
Chris@16 109 { }
Chris@16 110
Chris@16 111 void_ptr_indirect_fun( Fun f ) : fun(f)
Chris@16 112 { }
Chris@16 113
Chris@16 114 template< class Void >
Chris@16 115 #ifdef BOOST_NO_SFINAE
Chris@16 116 Result
Chris@16 117 #else
Chris@16 118 typename ptr_container_detail::make_lazy<
Chris@16 119 boost::result_of<const Fun(const Arg1&)>, Void>::type
Chris@16 120 #endif
Chris@16 121 operator()( const Void* r ) const
Chris@16 122 {
Chris@16 123 BOOST_STATIC_ASSERT(boost::is_void<Void>::value);
Chris@16 124 BOOST_ASSERT( r != 0 );
Chris@16 125 return fun( * static_cast<const Arg1*>( r ) );
Chris@16 126 }
Chris@16 127
Chris@16 128 template< class Void >
Chris@16 129 #ifdef BOOST_NO_SFINAE
Chris@16 130 Result
Chris@16 131 #else
Chris@16 132 typename ptr_container_detail::make_lazy<
Chris@16 133 boost::result_of<const Fun(const Arg1&, const Arg2&)>, Void>::type
Chris@16 134 #endif
Chris@16 135 operator()( const Void* l, const Void* r ) const
Chris@16 136 {
Chris@16 137 BOOST_STATIC_ASSERT(boost::is_void<Void>::value);
Chris@16 138 BOOST_ASSERT( l != 0 && r != 0 );
Chris@16 139 return fun( * static_cast<const Arg1*>( l ), * static_cast<const Arg2*>( r ) );
Chris@16 140 }
Chris@16 141 };
Chris@16 142
Chris@16 143 template< class Arg, class Fun >
Chris@16 144 inline void_ptr_indirect_fun<Fun,Arg> make_void_ptr_indirect_fun( Fun f )
Chris@16 145 {
Chris@16 146 return void_ptr_indirect_fun<Fun,Arg>( f );
Chris@16 147 }
Chris@16 148
Chris@16 149 } // namespace 'boost'
Chris@16 150
Chris@16 151 #endif