epoc32/include/stdapis/boost/ptr_container/indirect_fun.hpp
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
     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