epoc32/include/stdapis/boost/variant/visitor_ptr.hpp
author William Roberts <williamr@symbian.org>
Tue, 16 Mar 2010 16:12:26 +0000
branchSymbian2
changeset 2 2fe1408b6811
permissions -rw-r--r--
Final list of Symbian^2 public API header files
williamr@2
     1
//-----------------------------------------------------------------------------
williamr@2
     2
// boost variant/visitor_ptr.hpp header file
williamr@2
     3
// See http://www.boost.org for updates, documentation, and revision history.
williamr@2
     4
//-----------------------------------------------------------------------------
williamr@2
     5
//
williamr@2
     6
// Copyright (c) 2002-2003
williamr@2
     7
// Eric Friedman
williamr@2
     8
//
williamr@2
     9
// Distributed under the Boost Software License, Version 1.0. (See
williamr@2
    10
// accompanying file LICENSE_1_0.txt or copy at
williamr@2
    11
// http://www.boost.org/LICENSE_1_0.txt)
williamr@2
    12
williamr@2
    13
#ifndef BOOST_VARIANT_VISITOR_PTR_HPP
williamr@2
    14
#define BOOST_VARIANT_VISITOR_PTR_HPP
williamr@2
    15
williamr@2
    16
#include "boost/variant/bad_visit.hpp"
williamr@2
    17
#include "boost/variant/static_visitor.hpp"
williamr@2
    18
williamr@2
    19
#include "boost/mpl/eval_if.hpp"
williamr@2
    20
#include "boost/mpl/identity.hpp"
williamr@2
    21
#include "boost/type_traits/add_reference.hpp"
williamr@2
    22
#include "boost/type_traits/is_reference.hpp"
williamr@2
    23
#include "boost/type_traits/is_void.hpp"
williamr@2
    24
williamr@2
    25
namespace boost {
williamr@2
    26
williamr@2
    27
//////////////////////////////////////////////////////////////////////////
williamr@2
    28
// function template visitor_ptr
williamr@2
    29
//
williamr@2
    30
// Adapts a function pointer for use as visitor capable of handling
williamr@2
    31
// values of a single type. Throws bad_visit if inappropriately applied.
williamr@2
    32
//
williamr@2
    33
template <typename T, typename R>
williamr@2
    34
class visitor_ptr_t
williamr@2
    35
    : public static_visitor<R>
williamr@2
    36
{
williamr@2
    37
private: // representation
williamr@2
    38
williamr@2
    39
    typedef R (*visitor_t)(T);
williamr@2
    40
williamr@2
    41
    visitor_t visitor_;
williamr@2
    42
williamr@2
    43
public: // typedefs
williamr@2
    44
williamr@2
    45
    typedef R result_type;
williamr@2
    46
williamr@2
    47
private: // private typedefs
williamr@2
    48
williamr@2
    49
    typedef typename mpl::eval_if<
williamr@2
    50
          is_reference<T>
williamr@2
    51
        , mpl::identity<T>
williamr@2
    52
        , add_reference<const T>
williamr@2
    53
        >::type argument_fwd_type;
williamr@2
    54
williamr@2
    55
public: // structors
williamr@2
    56
williamr@2
    57
    explicit visitor_ptr_t(visitor_t visitor)
williamr@2
    58
      : visitor_(visitor)
williamr@2
    59
    {
williamr@2
    60
    }
williamr@2
    61
williamr@2
    62
public: // static visitor interfaces
williamr@2
    63
williamr@2
    64
    template <typename U>
williamr@2
    65
    result_type operator()(const U&) const
williamr@2
    66
    {
williamr@2
    67
        throw bad_visit();
williamr@2
    68
    }
williamr@2
    69
williamr@2
    70
#if !defined(BOOST_NO_VOID_RETURNS)
williamr@2
    71
williamr@2
    72
public: // static visitor interfaces, cont.
williamr@2
    73
williamr@2
    74
    result_type operator()(argument_fwd_type operand) const
williamr@2
    75
    {
williamr@2
    76
        return visitor_(operand);
williamr@2
    77
    }
williamr@2
    78
williamr@2
    79
#else // defined(BOOST_NO_VOID_RETURNS)
williamr@2
    80
williamr@2
    81
private: // helpers, for static visitor interfaces (below)
williamr@2
    82
williamr@2
    83
    result_type execute_impl(argument_fwd_type operand, mpl::false_) const
williamr@2
    84
    {
williamr@2
    85
        return visitor_(operand);
williamr@2
    86
    }
williamr@2
    87
williamr@2
    88
        BOOST_VARIANT_AUX_RETURN_VOID_TYPE
williamr@2
    89
    execute_impl(argument_fwd_type operand, mpl::true_) const
williamr@2
    90
    {
williamr@2
    91
        visitor_(operand);
williamr@2
    92
        BOOST_VARIANT_AUX_RETURN_VOID;
williamr@2
    93
    }
williamr@2
    94
williamr@2
    95
public: // static visitor interfaces, cont.
williamr@2
    96
williamr@2
    97
        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type)
williamr@2
    98
    operator()(argument_fwd_type operand) const
williamr@2
    99
    {
williamr@2
   100
        typedef typename is_void<result_type>::type has_void_result;
williamr@2
   101
        return execute_impl(operand, has_void_result());
williamr@2
   102
    }
williamr@2
   103
williamr@2
   104
#endif // BOOST_NO_VOID_RETURNS workaround
williamr@2
   105
williamr@2
   106
};
williamr@2
   107
williamr@2
   108
template <typename R, typename T>
williamr@2
   109
inline visitor_ptr_t<T,R> visitor_ptr(R (*visitor)(T))
williamr@2
   110
{
williamr@2
   111
    return visitor_ptr_t<T,R>(visitor);
williamr@2
   112
}
williamr@2
   113
williamr@2
   114
} // namespace boost
williamr@2
   115
williamr@2
   116
#endif// BOOST_VISITOR_VISITOR_PTR_HPP