ossrv_pub/boost_apis/boost/ptr_container/indirect_fun.hpp
changeset 0 e4d67989cc36
equal deleted inserted replaced
-1:000000000000 0:e4d67989cc36
       
     1 //
       
     2 // Boost.Pointer Container
       
     3 //
       
     4 //  Copyright Thorsten Ottosen 2003-2005. Use, modification and
       
     5 //  distribution is subject to the Boost Software License, Version
       
     6 //  1.0. (See accompanying file LICENSE_1_0.txt or copy at
       
     7 //  http://www.boost.org/LICENSE_1_0.txt)
       
     8 //
       
     9 // For more information, see http://www.boost.org/libs/ptr_container/
       
    10 //
       
    11 
       
    12 #ifndef BOOST_PTR_CONTAINER_INDIRECT_FUN_HPP
       
    13 #define BOOST_PTR_CONTAINER_INDIRECT_FUN_HPP
       
    14 
       
    15 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
       
    16     #pragma once
       
    17 #endif
       
    18 
       
    19 #include <boost/config.hpp>
       
    20 
       
    21 #ifdef BOOST_NO_SFINAE
       
    22 #else
       
    23 #include <boost/utility/result_of.hpp>
       
    24 #include <boost/pointee.hpp>
       
    25 #endif // BOOST_NO_SFINAE
       
    26 
       
    27 #include <boost/assert.hpp>
       
    28 #include <functional>
       
    29 
       
    30 
       
    31 namespace boost
       
    32 {
       
    33 
       
    34 
       
    35     template
       
    36     < 
       
    37               class Fun
       
    38 #ifdef BOOST_NO_SFINAE
       
    39             , class Result = bool
       
    40 #endif        
       
    41     >
       
    42     class indirect_fun
       
    43     {
       
    44         Fun fun;
       
    45     public:
       
    46         indirect_fun() : fun(Fun())
       
    47         { }
       
    48         
       
    49         indirect_fun( Fun f ) : fun(f)
       
    50         { }
       
    51     
       
    52         template< class T >
       
    53 #ifdef BOOST_NO_SFINAE
       
    54         Result    
       
    55 #else            
       
    56         BOOST_DEDUCED_TYPENAME result_of< Fun( BOOST_DEDUCED_TYPENAME pointee<T>::type ) >::type 
       
    57 #endif            
       
    58         operator()( const T& r ) const
       
    59         { 
       
    60             return fun( *r );
       
    61         }
       
    62     
       
    63         template< class T, class U >
       
    64 #ifdef BOOST_NO_SFINAE
       
    65         Result    
       
    66 #else                        
       
    67         BOOST_DEDUCED_TYPENAME result_of< Fun( BOOST_DEDUCED_TYPENAME pointee<T>::type, 
       
    68                                                BOOST_DEDUCED_TYPENAME pointee<U>::type ) >::type
       
    69 #endif            
       
    70         operator()( const T& r, const U& r2 ) const
       
    71         { 
       
    72             return fun( *r, *r2 ); 
       
    73         }
       
    74     };
       
    75 
       
    76     template< class Fun >
       
    77     inline indirect_fun<Fun> make_indirect_fun( Fun f )
       
    78     {
       
    79         return indirect_fun<Fun>( f );
       
    80     }
       
    81 
       
    82 
       
    83     template
       
    84     < 
       
    85         class Fun, 
       
    86         class Arg1, 
       
    87         class Arg2 = Arg1 
       
    88 #ifdef BOOST_NO_SFINAE
       
    89       , class Result = bool   
       
    90 #endif           
       
    91     >
       
    92     class void_ptr_indirect_fun
       
    93     {
       
    94         Fun fun;
       
    95     public:
       
    96         
       
    97         void_ptr_indirect_fun() : fun(Fun())
       
    98         { }
       
    99 
       
   100         void_ptr_indirect_fun( Fun f ) : fun(f)
       
   101         { }
       
   102 #ifdef BOOST_NO_SFINAE
       
   103         Result    
       
   104 #else            
       
   105         BOOST_DEDUCED_TYPENAME result_of< Fun( Arg1 ) >::type 
       
   106 #endif            
       
   107         operator()( const void* r ) const
       
   108         { 
       
   109             BOOST_ASSERT( r != 0 );
       
   110             return fun( * static_cast<const Arg1*>( r ) );
       
   111         }
       
   112 
       
   113 #ifdef BOOST_NO_SFINAE
       
   114         Result    
       
   115 #else                    
       
   116         BOOST_DEDUCED_TYPENAME result_of< Fun( Arg1, Arg2 ) >::type 
       
   117 #endif            
       
   118         operator()( const void* l, const void* r ) const
       
   119         { 
       
   120             BOOST_ASSERT( l != 0 && r != 0 );
       
   121             return fun( * static_cast<const Arg1*>( l ), * static_cast<const Arg2*>( r ) );
       
   122         }
       
   123     };
       
   124 
       
   125     template< class Arg, class Fun >
       
   126     inline void_ptr_indirect_fun<Fun,Arg> make_void_ptr_indirect_fun( Fun f )
       
   127     {
       
   128         return void_ptr_indirect_fun<Fun,Arg>( f );
       
   129     }
       
   130      
       
   131 } // namespace 'boost'
       
   132 
       
   133 #endif