Chris@16: //----------------------------------------------------------------------------- Chris@16: // boost variant/visitor_ptr.hpp header file Chris@16: // See http://www.boost.org for updates, documentation, and revision history. Chris@16: //----------------------------------------------------------------------------- Chris@16: // Chris@16: // Copyright (c) 2002-2003 Chris@16: // Eric Friedman Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_VARIANT_VISITOR_PTR_HPP Chris@16: #define BOOST_VARIANT_VISITOR_PTR_HPP Chris@16: Chris@16: #include "boost/variant/bad_visit.hpp" Chris@16: #include "boost/variant/static_visitor.hpp" Chris@16: Chris@16: #include "boost/mpl/eval_if.hpp" Chris@16: #include "boost/mpl/identity.hpp" Chris@16: #include "boost/throw_exception.hpp" Chris@16: #include "boost/type_traits/add_reference.hpp" Chris@16: #include "boost/type_traits/is_reference.hpp" Chris@16: #include "boost/type_traits/is_void.hpp" Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: ////////////////////////////////////////////////////////////////////////// Chris@16: // function template visitor_ptr Chris@16: // Chris@16: // Adapts a function pointer for use as visitor capable of handling Chris@16: // values of a single type. Throws bad_visit if inappropriately applied. Chris@16: // Chris@16: template Chris@16: class visitor_ptr_t Chris@16: : public static_visitor Chris@16: { Chris@16: private: // representation Chris@16: Chris@16: typedef R (*visitor_t)(T); Chris@16: Chris@16: visitor_t visitor_; Chris@16: Chris@16: public: // typedefs Chris@16: Chris@16: typedef R result_type; Chris@16: Chris@16: private: // private typedefs Chris@16: Chris@16: typedef typename mpl::eval_if< Chris@16: is_reference Chris@16: , mpl::identity Chris@16: , add_reference Chris@16: >::type argument_fwd_type; Chris@16: Chris@16: public: // structors Chris@16: Chris@101: explicit visitor_ptr_t(visitor_t visitor) BOOST_NOEXCEPT Chris@16: : visitor_(visitor) Chris@16: { Chris@16: } Chris@16: Chris@16: public: // static visitor interfaces Chris@16: Chris@16: template Chris@16: result_type operator()(const U&) const Chris@16: { Chris@16: boost::throw_exception(bad_visit()); Chris@16: } Chris@16: Chris@16: #if !defined(BOOST_NO_VOID_RETURNS) Chris@16: Chris@16: public: // static visitor interfaces, cont. Chris@16: Chris@16: result_type operator()(argument_fwd_type operand) const Chris@16: { Chris@16: return visitor_(operand); Chris@16: } Chris@16: Chris@16: #else // defined(BOOST_NO_VOID_RETURNS) Chris@16: Chris@16: private: // helpers, for static visitor interfaces (below) Chris@16: Chris@16: result_type execute_impl(argument_fwd_type operand, mpl::false_) const Chris@16: { Chris@16: return visitor_(operand); Chris@16: } Chris@16: Chris@16: BOOST_VARIANT_AUX_RETURN_VOID_TYPE Chris@16: execute_impl(argument_fwd_type operand, mpl::true_) const Chris@16: { Chris@16: visitor_(operand); Chris@16: BOOST_VARIANT_AUX_RETURN_VOID; Chris@16: } Chris@16: Chris@16: public: // static visitor interfaces, cont. Chris@16: Chris@16: BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type) Chris@16: operator()(argument_fwd_type operand) const Chris@16: { Chris@16: typedef typename is_void::type has_void_result; Chris@16: return execute_impl(operand, has_void_result()); Chris@16: } Chris@16: Chris@16: #endif // BOOST_NO_VOID_RETURNS workaround Chris@16: Chris@16: }; Chris@16: Chris@16: template Chris@16: inline visitor_ptr_t visitor_ptr(R (*visitor)(T)) Chris@16: { Chris@16: return visitor_ptr_t(visitor); Chris@16: } Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #endif// BOOST_VISITOR_VISITOR_PTR_HPP