152 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			152 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								//-----------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								// boost variant/detail/apply_visitor_delayed.hpp header file
							 | 
						||
| 
								 | 
							
								// See http://www.boost.org for updates, documentation, and revision history.
							 | 
						||
| 
								 | 
							
								//-----------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Copyright (c) 2002-2003
							 | 
						||
| 
								 | 
							
								// Eric Friedman
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Distributed under the Boost Software License, Version 1.0. (See
							 | 
						||
| 
								 | 
							
								// accompanying file LICENSE_1_0.txt or copy at
							 | 
						||
| 
								 | 
							
								// http://www.boost.org/LICENSE_1_0.txt)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef BOOST_VARIANT_DETAIL_APPLY_VISITOR_DELAYED_HPP
							 | 
						||
| 
								 | 
							
								#define BOOST_VARIANT_DETAIL_APPLY_VISITOR_DELAYED_HPP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/variant/detail/generic_result_type.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/variant/detail/apply_visitor_unary.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/variant/detail/apply_visitor_binary.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/variant/variant_fwd.hpp> // for BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/variant/detail/has_result_type.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/core/enable_if.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								// function template apply_visitor(visitor)
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Returns a function object, overloaded for unary and binary usage, that
							 | 
						||
| 
								 | 
							
								// visits its arguments using visitor (or a copy of visitor) via
							 | 
						||
| 
								 | 
							
								//  * apply_visitor( visitor, [argument] )
							 | 
						||
| 
								 | 
							
								// under unary invocation, or
							 | 
						||
| 
								 | 
							
								//  * apply_visitor( visitor, [argument1], [argument2] )
							 | 
						||
| 
								 | 
							
								// under binary invocation.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// NOTE: Unlike other apply_visitor forms, the visitor object must be
							 | 
						||
| 
								 | 
							
								//   non-const; this prevents user from giving temporary, to disastrous
							 | 
						||
| 
								 | 
							
								//   effect (i.e., returned function object would have dead reference).
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <typename Visitor>
							 | 
						||
| 
								 | 
							
								class apply_visitor_delayed_t
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								public: // visitor typedefs
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    typedef typename Visitor::result_type
							 | 
						||
| 
								 | 
							
								        result_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								private: // representation
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Visitor& visitor_;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public: // structors
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    explicit apply_visitor_delayed_t(Visitor& visitor) BOOST_NOEXCEPT
							 | 
						||
| 
								 | 
							
								      : visitor_(visitor)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public: // N-ary visitor interface
							 | 
						||
| 
								 | 
							
								    template <typename... Visitables>
							 | 
						||
| 
								 | 
							
								        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type)
							 | 
						||
| 
								 | 
							
								    operator()(Visitables&... visitables) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return apply_visitor(visitor_, visitables...);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#else // !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public: // unary visitor interface
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <typename Visitable>
							 | 
						||
| 
								 | 
							
								        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type)
							 | 
						||
| 
								 | 
							
								    operator()(Visitable& visitable) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return apply_visitor(visitor_, visitable);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public: // binary visitor interface
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <typename Visitable1, typename Visitable2>
							 | 
						||
| 
								 | 
							
								        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type)
							 | 
						||
| 
								 | 
							
								    operator()(Visitable1& visitable1, Visitable2& visitable2) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return apply_visitor(visitor_, visitable1, visitable2);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
								    apply_visitor_delayed_t& operator=(const apply_visitor_delayed_t&);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <typename Visitor>
							 | 
						||
| 
								 | 
							
								inline typename boost::enable_if<
							 | 
						||
| 
								 | 
							
								        boost::detail::variant::has_result_type<Visitor>,
							 | 
						||
| 
								 | 
							
								        apply_visitor_delayed_t<Visitor>
							 | 
						||
| 
								 | 
							
								    >::type apply_visitor(Visitor& visitor)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return apply_visitor_delayed_t<Visitor>(visitor);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if !defined(BOOST_NO_CXX14_DECLTYPE_AUTO) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276) \
							 | 
						||
| 
								 | 
							
								    && !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <typename Visitor>
							 | 
						||
| 
								 | 
							
								class apply_visitor_delayed_cpp14_t
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								private: // representation
							 | 
						||
| 
								 | 
							
								    Visitor& visitor_;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public: // structors
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    explicit apply_visitor_delayed_cpp14_t(Visitor& visitor) BOOST_NOEXCEPT
							 | 
						||
| 
								 | 
							
								      : visitor_(visitor)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public: // N-ary visitor interface
							 | 
						||
| 
								 | 
							
								    template <typename... Visitables>
							 | 
						||
| 
								 | 
							
								    decltype(auto) operator()(Visitables&... visitables) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return apply_visitor(visitor_, visitables...);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
								    apply_visitor_delayed_cpp14_t& operator=(const apply_visitor_delayed_cpp14_t&);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <typename Visitor>
							 | 
						||
| 
								 | 
							
								inline  typename boost::disable_if<
							 | 
						||
| 
								 | 
							
								        boost::detail::variant::has_result_type<Visitor>,
							 | 
						||
| 
								 | 
							
								        apply_visitor_delayed_cpp14_t<Visitor>
							 | 
						||
| 
								 | 
							
								    >::type apply_visitor(Visitor& visitor)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return apply_visitor_delayed_cpp14_t<Visitor>(visitor);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // !defined(BOOST_NO_CXX14_DECLTYPE_AUTO) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276)
							 | 
						||
| 
								 | 
							
								            // && !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								} // namespace boost
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // BOOST_VARIANT_DETAIL_APPLY_VISITOR_DELAYED_HPP
							 |