williamr@2: //----------------------------------------------------------------------------- williamr@2: // boost variant/detail/apply_visitor_delayed.hpp header file williamr@2: // See http://www.boost.org for updates, documentation, and revision history. williamr@2: //----------------------------------------------------------------------------- williamr@2: // williamr@2: // Copyright (c) 2002-2003 williamr@2: // Eric Friedman williamr@2: // williamr@2: // Distributed under the Boost Software License, Version 1.0. (See williamr@2: // accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: williamr@2: #ifndef BOOST_VARIANT_DETAIL_APPLY_VISITOR_DELAYED_HPP williamr@2: #define BOOST_VARIANT_DETAIL_APPLY_VISITOR_DELAYED_HPP williamr@2: williamr@2: #include "boost/variant/detail/generic_result_type.hpp" williamr@2: williamr@2: #include "boost/variant/detail/apply_visitor_unary.hpp" williamr@2: #include "boost/variant/detail/apply_visitor_binary.hpp" williamr@2: williamr@2: namespace boost { williamr@2: williamr@2: ////////////////////////////////////////////////////////////////////////// williamr@2: // function template apply_visitor(visitor) williamr@2: // williamr@2: // Returns a function object, overloaded for unary and binary usage, that williamr@2: // visits its arguments using visitor (or a copy of visitor) via williamr@2: // * apply_visitor( visitor, [argument] ) williamr@2: // under unary invocation, or williamr@2: // * apply_visitor( visitor, [argument1], [argument2] ) williamr@2: // under binary invocation. williamr@2: // williamr@2: // NOTE: Unlike other apply_visitor forms, the visitor object must be williamr@2: // non-const; this prevents user from giving temporary, to disastrous williamr@2: // effect (i.e., returned function object would have dead reference). williamr@2: // williamr@2: williamr@2: template williamr@2: class apply_visitor_delayed_t williamr@2: { williamr@2: public: // visitor typedefs williamr@2: williamr@2: typedef typename Visitor::result_type williamr@2: result_type; williamr@2: williamr@2: private: // representation williamr@2: williamr@2: Visitor& visitor_; williamr@2: williamr@2: public: // structors williamr@2: williamr@2: explicit apply_visitor_delayed_t(Visitor& visitor) williamr@2: : visitor_(visitor) williamr@2: { williamr@2: } williamr@2: williamr@2: public: // unary visitor interface williamr@2: williamr@2: template williamr@2: BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type) williamr@2: operator()(Visitable& visitable) williamr@2: { williamr@2: return apply_visitor(visitor_, visitable); williamr@2: } williamr@2: williamr@2: public: // binary visitor interface williamr@2: williamr@2: template williamr@2: BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type) williamr@2: operator()(Visitable1& visitable1, Visitable2& visitable2) williamr@2: { williamr@2: return apply_visitor(visitor_, visitable1, visitable2); williamr@2: } williamr@2: williamr@2: }; williamr@2: williamr@2: template williamr@2: inline apply_visitor_delayed_t apply_visitor(Visitor& visitor) williamr@2: { williamr@2: return apply_visitor_delayed_t(visitor); williamr@2: } williamr@2: williamr@2: } // namespace boost williamr@2: williamr@2: #endif // BOOST_VARIANT_DETAIL_APPLY_VISITOR_DELAYED_HPP