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