epoc32/include/stdapis/boost/variant/detail/apply_visitor_delayed.hpp
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:27:01 +0100
branchSymbian2
changeset 3 e1b950c65cb4
permissions -rw-r--r--
Attempt to represent the S^2->S^3 header reorganisation as a series of "hg rename" operations
williamr@2
     1
//-----------------------------------------------------------------------------
williamr@2
     2
// boost variant/detail/apply_visitor_delayed.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_DETAIL_APPLY_VISITOR_DELAYED_HPP
williamr@2
    14
#define BOOST_VARIANT_DETAIL_APPLY_VISITOR_DELAYED_HPP
williamr@2
    15
williamr@2
    16
#include "boost/variant/detail/generic_result_type.hpp"
williamr@2
    17
williamr@2
    18
#include "boost/variant/detail/apply_visitor_unary.hpp"
williamr@2
    19
#include "boost/variant/detail/apply_visitor_binary.hpp"
williamr@2
    20
williamr@2
    21
namespace boost {
williamr@2
    22
williamr@2
    23
//////////////////////////////////////////////////////////////////////////
williamr@2
    24
// function template apply_visitor(visitor)
williamr@2
    25
//
williamr@2
    26
// Returns a function object, overloaded for unary and binary usage, that
williamr@2
    27
// visits its arguments using visitor (or a copy of visitor) via
williamr@2
    28
//  * apply_visitor( visitor, [argument] )
williamr@2
    29
// under unary invocation, or
williamr@2
    30
//  * apply_visitor( visitor, [argument1], [argument2] )
williamr@2
    31
// under binary invocation.
williamr@2
    32
//
williamr@2
    33
// NOTE: Unlike other apply_visitor forms, the visitor object must be
williamr@2
    34
//   non-const; this prevents user from giving temporary, to disastrous
williamr@2
    35
//   effect (i.e., returned function object would have dead reference).
williamr@2
    36
//
williamr@2
    37
williamr@2
    38
template <typename Visitor>
williamr@2
    39
class apply_visitor_delayed_t
williamr@2
    40
{
williamr@2
    41
public: // visitor typedefs
williamr@2
    42
williamr@2
    43
    typedef typename Visitor::result_type
williamr@2
    44
        result_type;
williamr@2
    45
williamr@2
    46
private: // representation
williamr@2
    47
williamr@2
    48
    Visitor& visitor_;
williamr@2
    49
williamr@2
    50
public: // structors
williamr@2
    51
williamr@2
    52
    explicit apply_visitor_delayed_t(Visitor& visitor)
williamr@2
    53
      : visitor_(visitor)
williamr@2
    54
    {
williamr@2
    55
    }
williamr@2
    56
williamr@2
    57
public: // unary visitor interface
williamr@2
    58
williamr@2
    59
    template <typename Visitable>
williamr@2
    60
        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type)
williamr@2
    61
    operator()(Visitable& visitable)
williamr@2
    62
    {
williamr@2
    63
        return apply_visitor(visitor_, visitable);
williamr@2
    64
    }
williamr@2
    65
williamr@2
    66
public: // binary visitor interface
williamr@2
    67
williamr@2
    68
    template <typename Visitable1, typename Visitable2>
williamr@2
    69
        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type)
williamr@2
    70
    operator()(Visitable1& visitable1, Visitable2& visitable2)
williamr@2
    71
    {
williamr@2
    72
        return apply_visitor(visitor_, visitable1, visitable2);
williamr@2
    73
    }
williamr@2
    74
williamr@2
    75
};
williamr@2
    76
williamr@2
    77
template <typename Visitor>
williamr@2
    78
inline apply_visitor_delayed_t<Visitor> apply_visitor(Visitor& visitor)
williamr@2
    79
{
williamr@2
    80
    return apply_visitor_delayed_t<Visitor>(visitor);
williamr@2
    81
}
williamr@2
    82
williamr@2
    83
} // namespace boost
williamr@2
    84
williamr@2
    85
#endif // BOOST_VARIANT_DETAIL_APPLY_VISITOR_DELAYED_HPP