PageRenderTime 24ms CodeModel.GetById 12ms app.highlight 8ms RepoModel.GetById 2ms app.codeStats 0ms

/Src/Dependencies/Boost/boost/variant/visitor_ptr.hpp

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