1// Copyright (C) 2005, Fernando Luis Cacciola Carballal.
2//
3// Use, modification, and distribution is subject to the Boost Software
4// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
5// http://www.boost.org/LICENSE_1_0.txt)
6//
7// See http://www.boost.org/libs/optional for documentation.
8//
9// You are welcome to contact the author at:
10// fernando_cacciola@hotmail.com
11//
12#ifndef BOOST_OPTIONAL_OPTIONAL_IO_FLC_19NOV2002_HPP
13#define BOOST_OPTIONAL_OPTIONAL_IO_FLC_19NOV2002_HPP
14
15#ifndef BOOST_NO_IOSTREAM
16#include <istream>
17#include <ostream>
18
19#include "boost/none.hpp"
20#include "boost/optional/optional.hpp"
21
22
23namespace boost
24{
25
26template<class CharType, class CharTrait>
27inline
28std::basic_ostream<CharType, CharTrait>&
29operator<<(std::basic_ostream<CharType, CharTrait>& out, none_t)
30{
31 if (out.good())
32 {
33 out << "--";
34 }
35
36 return out;
37}
38
39template<class CharType, class CharTrait, class T>
40inline
41std::basic_ostream<CharType, CharTrait>&
42operator<<(std::basic_ostream<CharType, CharTrait>& out, optional<T> const& v)
43{
44 if (out.good())
45 {
46 if (!v)
47 out << "--" ;
48 else out << ' ' << *v ;
49 }
50
51 return out;
52}
53
54template<class CharType, class CharTrait, class T>
55inline
56std::basic_istream<CharType, CharTrait>&
57operator>>(std::basic_istream<CharType, CharTrait>& in, optional<T>& v)
58{
59 if (in.good())
60 {
61 int d = in.get();
62 if (d == ' ')
63 {
64 T x;
65 in >> x;
66#ifndef BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
67 v = boost::move(x);
68#else
69 v = x;
70#endif
71 }
72 else
73 {
74 if (d == '-')
75 {
76 d = in.get();
77
78 if (d == '-')
79 {
80 v = none;
81 return in;
82 }
83 }
84
85 in.setstate( std::ios::failbit );
86 }
87 }
88
89 return in;
90}
91
92} // namespace boost
93
94#endif // BOOST_NO_IOSTREAM
95#endif
96

source code of boost/libs/optional/include/boost/optional/optional_io.hpp