Chris@16: //----------------------------------------------------------------------------- Chris@16: // boost variant/detail/variant_io.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, Itay Maman 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_DETAIL_VARIANT_IO_HPP Chris@16: #define BOOST_VARIANT_DETAIL_VARIANT_IO_HPP Chris@16: Chris@16: #include // for std::basic_ostream forward declare Chris@16: Chris@16: #include "boost/variant/variant_fwd.hpp" Chris@16: Chris@16: #include "boost/detail/templated_streams.hpp" Chris@16: #include "boost/variant/static_visitor.hpp" Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // function template operator<< Chris@16: // Chris@16: // Outputs the content of the given variant to the given ostream. Chris@16: // Chris@16: Chris@16: // forward declare (allows output of embedded variant< variant< ... >, ... >) Chris@16: template < Chris@16: BOOST_TEMPLATED_STREAM_ARGS(E,T) Chris@16: BOOST_TEMPLATED_STREAM_COMMA Chris@16: BOOST_VARIANT_ENUM_PARAMS(typename U) Chris@16: > Chris@16: inline BOOST_TEMPLATED_STREAM(ostream, E,T)& operator<<( Chris@16: BOOST_TEMPLATED_STREAM(ostream, E,T)& out Chris@16: , const variant< BOOST_VARIANT_ENUM_PARAMS(U) >& rhs Chris@16: ); Chris@16: Chris@16: namespace detail { namespace variant { Chris@16: Chris@16: template Chris@16: class printer Chris@16: : public boost::static_visitor<> Chris@16: { Chris@16: private: // representation Chris@16: Chris@16: OStream& out_; Chris@16: Chris@16: public: // structors Chris@16: Chris@16: explicit printer(OStream& out) Chris@16: : out_( out ) Chris@16: { Chris@16: } Chris@16: Chris@16: public: // visitor interface Chris@16: Chris@16: template Chris@16: void operator()(const T& operand) const Chris@16: { Chris@16: out_ << operand; Chris@16: } Chris@16: Chris@16: private: Chris@16: printer& operator=(const printer&); Chris@16: Chris@16: }; Chris@16: Chris@16: }} // namespace detail::variant Chris@16: Chris@16: template < Chris@16: BOOST_TEMPLATED_STREAM_ARGS(E,T) Chris@16: BOOST_TEMPLATED_STREAM_COMMA Chris@16: BOOST_VARIANT_ENUM_PARAMS(typename U) Chris@16: > Chris@16: inline BOOST_TEMPLATED_STREAM(ostream, E,T)& operator<<( Chris@16: BOOST_TEMPLATED_STREAM(ostream, E,T)& out Chris@16: , const variant< BOOST_VARIANT_ENUM_PARAMS(U) >& rhs Chris@16: ) Chris@16: { Chris@16: detail::variant::printer< Chris@16: BOOST_TEMPLATED_STREAM(ostream, E,T) Chris@16: > visitor(out); Chris@16: Chris@16: rhs.apply_visitor(visitor); Chris@16: Chris@16: return out; Chris@16: } Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #endif // BOOST_VARIANT_DETAIL_VARIANT_IO_HPP