//----------------------------------------------------------------------------- // boost variant/detail/variant_io.hpp header file // See http://www.boost.org for updates, documentation, and revision history. //----------------------------------------------------------------------------- // // Copyright (c) 2002-2003 // Eric Friedman, Itay Maman // // 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_DETAIL_VARIANT_IO_HPP #define BOOST_VARIANT_DETAIL_VARIANT_IO_HPP #include // for std::basic_ostream forward declare #include "boost/variant/variant_fwd.hpp" #include "boost/detail/templated_streams.hpp" #include "boost/variant/static_visitor.hpp" namespace boost { /////////////////////////////////////////////////////////////////////////////// // function template operator<< // // Outputs the content of the given variant to the given ostream. // // forward declare (allows output of embedded variant< variant< ... >, ... >) template < BOOST_TEMPLATED_STREAM_ARGS(E,T) BOOST_TEMPLATED_STREAM_COMMA BOOST_VARIANT_ENUM_PARAMS(typename U) > inline BOOST_TEMPLATED_STREAM(ostream, E,T)& operator<<( BOOST_TEMPLATED_STREAM(ostream, E,T)& out , const variant< BOOST_VARIANT_ENUM_PARAMS(U) >& rhs ); namespace detail { namespace variant { template class printer : public boost::static_visitor<> { private: // representation OStream& out_; public: // structors explicit printer(OStream& out) : out_( out ) { } public: // visitor interface template void operator()(const T& operand) const { out_ << operand; } }; }} // namespace detail::variant template < BOOST_TEMPLATED_STREAM_ARGS(E,T) BOOST_TEMPLATED_STREAM_COMMA BOOST_VARIANT_ENUM_PARAMS(typename U) > inline BOOST_TEMPLATED_STREAM(ostream, E,T)& operator<<( BOOST_TEMPLATED_STREAM(ostream, E,T)& out , const variant< BOOST_VARIANT_ENUM_PARAMS(U) >& rhs ) { detail::variant::printer< BOOST_TEMPLATED_STREAM(ostream, E,T) > visitor(out); rhs.apply_visitor(visitor); return out; } } // namespace boost #endif // BOOST_VARIANT_DETAIL_VARIANT_IO_HPP