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