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