//----------------------------------------------------------------------------- | |
// 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 <iosfwd> // 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 <typename OStream> | |
class printer | |
: public boost::static_visitor<> | |
{ | |
private: // representation | |
OStream& out_; | |
public: // structors | |
explicit printer(OStream& out) | |
: out_( out ) | |
{ | |
} | |
public: // visitor interface | |
template <typename T> | |
void operator()(const T& operand) const | |
{ | |
out_ << operand; | |
} | |
private: | |
printer& operator=(const printer&); | |
}; | |
}} // 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 |