96 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			96 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | //----------------------------------------------------------------------------- | ||
|  | // boost variant/static_visitor.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_STATIC_VISITOR_HPP | ||
|  | #define BOOST_VARIANT_STATIC_VISITOR_HPP | ||
|  | 
 | ||
|  | #include <boost/config.hpp> | ||
|  | #include <boost/detail/workaround.hpp> | ||
|  | 
 | ||
|  | #include <boost/mpl/if.hpp> | ||
|  | #include <boost/type_traits/is_base_and_derived.hpp> | ||
|  | 
 | ||
|  | #include <boost/type_traits/integral_constant.hpp> | ||
|  | #include <boost/mpl/aux_/lambda_support.hpp> | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | 
 | ||
|  | ////////////////////////////////////////////////////////////////////////// | ||
|  | // class template static_visitor | ||
|  | // | ||
|  | // An empty base class that typedefs the return type of a deriving static | ||
|  | // visitor. The class is analogous to std::unary_function in this role. | ||
|  | // | ||
|  | 
 | ||
|  | namespace detail { | ||
|  | 
 | ||
|  |     struct is_static_visitor_tag { }; | ||
|  | 
 | ||
|  |     typedef void static_visitor_default_return; | ||
|  | 
 | ||
|  | } // namespace detail | ||
|  | 
 | ||
|  | template <typename R = ::boost::detail::static_visitor_default_return> | ||
|  | class static_visitor | ||
|  |     : public detail::is_static_visitor_tag | ||
|  | { | ||
|  | public: // typedefs | ||
|  | 
 | ||
|  |     typedef R result_type; | ||
|  | 
 | ||
|  | protected: // for use as base class only | ||
|  | #if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) && !defined(BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS) | ||
|  |     static_visitor() = default; | ||
|  |     ~static_visitor() = default; | ||
|  | #else | ||
|  |     static_visitor()  BOOST_NOEXCEPT { } | ||
|  |     ~static_visitor()  BOOST_NOEXCEPT { } | ||
|  | #endif | ||
|  | }; | ||
|  | 
 | ||
|  | ////////////////////////////////////////////////////////////////////////// | ||
|  | // metafunction is_static_visitor | ||
|  | // | ||
|  | // Value metafunction indicates whether the specified type derives from | ||
|  | // static_visitor<...>. | ||
|  | // | ||
|  | // NOTE #1: This metafunction does NOT check whether the specified type | ||
|  | //  fulfills the requirements of the StaticVisitor concept. | ||
|  | // | ||
|  | // NOTE #2: This template never needs to be specialized! | ||
|  | // | ||
|  | 
 | ||
|  | namespace detail { | ||
|  | 
 | ||
|  | template <typename T> | ||
|  | struct is_static_visitor_impl | ||
|  | { | ||
|  |     BOOST_STATIC_CONSTANT(bool, value =  | ||
|  |         (::boost::is_base_and_derived<  | ||
|  |             detail::is_static_visitor_tag, | ||
|  |             T | ||
|  |         >::value)); | ||
|  | }; | ||
|  | 
 | ||
|  | } // namespace detail | ||
|  | 
 | ||
|  | template< typename T > struct is_static_visitor | ||
|  | 	: public ::boost::integral_constant<bool,(::boost::detail::is_static_visitor_impl<T>::value)> | ||
|  | { | ||
|  | public: | ||
|  |     BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_static_visitor,(T)) | ||
|  | }; | ||
|  | 
 | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | #endif // BOOST_VARIANT_STATIC_VISITOR_HPP |