williamr@2
|
1 |
//-----------------------------------------------------------------------------
|
williamr@2
|
2 |
// boost variant/detail/variant_io.hpp header file
|
williamr@2
|
3 |
// See http://www.boost.org for updates, documentation, and revision history.
|
williamr@2
|
4 |
//-----------------------------------------------------------------------------
|
williamr@2
|
5 |
//
|
williamr@2
|
6 |
// Copyright (c) 2002-2003
|
williamr@2
|
7 |
// Eric Friedman, Itay Maman
|
williamr@2
|
8 |
//
|
williamr@2
|
9 |
// Distributed under the Boost Software License, Version 1.0. (See
|
williamr@2
|
10 |
// accompanying file LICENSE_1_0.txt or copy at
|
williamr@2
|
11 |
// http://www.boost.org/LICENSE_1_0.txt)
|
williamr@2
|
12 |
|
williamr@2
|
13 |
#ifndef BOOST_VARIANT_DETAIL_VARIANT_IO_HPP
|
williamr@2
|
14 |
#define BOOST_VARIANT_DETAIL_VARIANT_IO_HPP
|
williamr@2
|
15 |
|
williamr@2
|
16 |
#include <iosfwd> // for std::basic_ostream forward declare
|
williamr@2
|
17 |
|
williamr@2
|
18 |
#include "boost/variant/variant_fwd.hpp"
|
williamr@2
|
19 |
|
williamr@2
|
20 |
#include "boost/detail/templated_streams.hpp"
|
williamr@2
|
21 |
#include "boost/variant/static_visitor.hpp"
|
williamr@2
|
22 |
|
williamr@2
|
23 |
namespace boost {
|
williamr@2
|
24 |
|
williamr@2
|
25 |
///////////////////////////////////////////////////////////////////////////////
|
williamr@2
|
26 |
// function template operator<<
|
williamr@2
|
27 |
//
|
williamr@2
|
28 |
// Outputs the content of the given variant to the given ostream.
|
williamr@2
|
29 |
//
|
williamr@2
|
30 |
|
williamr@2
|
31 |
// forward declare (allows output of embedded variant< variant< ... >, ... >)
|
williamr@2
|
32 |
template <
|
williamr@2
|
33 |
BOOST_TEMPLATED_STREAM_ARGS(E,T)
|
williamr@2
|
34 |
BOOST_TEMPLATED_STREAM_COMMA
|
williamr@2
|
35 |
BOOST_VARIANT_ENUM_PARAMS(typename U)
|
williamr@2
|
36 |
>
|
williamr@2
|
37 |
inline BOOST_TEMPLATED_STREAM(ostream, E,T)& operator<<(
|
williamr@2
|
38 |
BOOST_TEMPLATED_STREAM(ostream, E,T)& out
|
williamr@2
|
39 |
, const variant< BOOST_VARIANT_ENUM_PARAMS(U) >& rhs
|
williamr@2
|
40 |
);
|
williamr@2
|
41 |
|
williamr@2
|
42 |
namespace detail { namespace variant {
|
williamr@2
|
43 |
|
williamr@2
|
44 |
template <typename OStream>
|
williamr@2
|
45 |
class printer
|
williamr@2
|
46 |
: public boost::static_visitor<>
|
williamr@2
|
47 |
{
|
williamr@2
|
48 |
private: // representation
|
williamr@2
|
49 |
|
williamr@2
|
50 |
OStream& out_;
|
williamr@2
|
51 |
|
williamr@2
|
52 |
public: // structors
|
williamr@2
|
53 |
|
williamr@2
|
54 |
explicit printer(OStream& out)
|
williamr@2
|
55 |
: out_( out )
|
williamr@2
|
56 |
{
|
williamr@2
|
57 |
}
|
williamr@2
|
58 |
|
williamr@2
|
59 |
public: // visitor interface
|
williamr@2
|
60 |
|
williamr@2
|
61 |
template <typename T>
|
williamr@2
|
62 |
void operator()(const T& operand) const
|
williamr@2
|
63 |
{
|
williamr@2
|
64 |
out_ << operand;
|
williamr@2
|
65 |
}
|
williamr@2
|
66 |
|
williamr@2
|
67 |
};
|
williamr@2
|
68 |
|
williamr@2
|
69 |
}} // namespace detail::variant
|
williamr@2
|
70 |
|
williamr@2
|
71 |
template <
|
williamr@2
|
72 |
BOOST_TEMPLATED_STREAM_ARGS(E,T)
|
williamr@2
|
73 |
BOOST_TEMPLATED_STREAM_COMMA
|
williamr@2
|
74 |
BOOST_VARIANT_ENUM_PARAMS(typename U)
|
williamr@2
|
75 |
>
|
williamr@2
|
76 |
inline BOOST_TEMPLATED_STREAM(ostream, E,T)& operator<<(
|
williamr@2
|
77 |
BOOST_TEMPLATED_STREAM(ostream, E,T)& out
|
williamr@2
|
78 |
, const variant< BOOST_VARIANT_ENUM_PARAMS(U) >& rhs
|
williamr@2
|
79 |
)
|
williamr@2
|
80 |
{
|
williamr@2
|
81 |
detail::variant::printer<
|
williamr@2
|
82 |
BOOST_TEMPLATED_STREAM(ostream, E,T)
|
williamr@2
|
83 |
> visitor(out);
|
williamr@2
|
84 |
|
williamr@2
|
85 |
rhs.apply_visitor(visitor);
|
williamr@2
|
86 |
|
williamr@2
|
87 |
return out;
|
williamr@2
|
88 |
}
|
williamr@2
|
89 |
|
williamr@2
|
90 |
} // namespace boost
|
williamr@2
|
91 |
|
williamr@2
|
92 |
#endif // BOOST_VARIANT_DETAIL_VARIANT_IO_HPP
|