williamr@2: //----------------------------------------------------------------------------- williamr@2: // boost variant/detail/apply_visitor_unary.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_UNARY_HPP williamr@2: #define BOOST_VARIANT_DETAIL_APPLY_VISITOR_UNARY_HPP williamr@2: williamr@2: #include "boost/config.hpp" williamr@2: #include "boost/detail/workaround.hpp" williamr@2: #include "boost/variant/detail/generic_result_type.hpp" williamr@2: williamr@2: #include "boost/utility/enable_if.hpp" williamr@2: williamr@2: namespace boost { williamr@2: williamr@2: ////////////////////////////////////////////////////////////////////////// williamr@2: // function template apply_visitor(visitor, visitable) williamr@2: // williamr@2: // Visits visitable with visitor. williamr@2: // williamr@2: williamr@2: // williamr@2: // nonconst-visitor version: williamr@2: // williamr@2: williamr@2: #if !BOOST_WORKAROUND(__EDG__, BOOST_TESTED_AT(302)) williamr@2: williamr@2: # define BOOST_VARIANT_AUX_APPLY_VISITOR_NON_CONST_RESULT_TYPE(V) \ williamr@2: BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(typename V::result_type) \ williamr@2: /**/ williamr@2: williamr@2: #else // EDG-based compilers williamr@2: williamr@2: # define BOOST_VARIANT_AUX_APPLY_VISITOR_NON_CONST_RESULT_TYPE(V) \ williamr@2: typename enable_if< \ williamr@2: mpl::not_< is_const< V > > \ williamr@2: , BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(typename V::result_type) \ williamr@2: >::type \ williamr@2: /**/ williamr@2: williamr@2: #endif // EDG-based compilers workaround williamr@2: williamr@2: template <typename Visitor, typename Visitable> williamr@2: inline williamr@2: BOOST_VARIANT_AUX_APPLY_VISITOR_NON_CONST_RESULT_TYPE(Visitor) williamr@2: apply_visitor(Visitor& visitor, Visitable& visitable) williamr@2: { williamr@2: return visitable.apply_visitor(visitor); williamr@2: } williamr@2: williamr@2: #undef BOOST_VARIANT_AUX_APPLY_VISITOR_NON_CONST_RESULT_TYPE williamr@2: williamr@2: // williamr@2: // const-visitor version: williamr@2: // williamr@2: williamr@2: #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) williamr@2: williamr@2: template <typename Visitor, typename Visitable> williamr@2: inline williamr@2: BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(typename Visitor::result_type) williamr@2: apply_visitor(const Visitor& visitor, Visitable& visitable) williamr@2: { williamr@2: return visitable.apply_visitor(visitor); williamr@2: } williamr@2: williamr@2: #endif // MSVC7 and below exclusion williamr@2: williamr@2: } // namespace boost williamr@2: williamr@2: #endif // BOOST_VARIANT_DETAIL_APPLY_VISITOR_UNARY_HPP