comparison DEPENDENCIES/generic/include/boost/fusion/sequence/io/detail/manip.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
comparison
equal deleted inserted replaced
15:663ca0da4350 16:2665513ce2d3
1 /*=============================================================================
2 Copyright (c) 1999-2003 Jeremiah Willcock
3 Copyright (c) 1999-2003 Jaakko Jarvi
4 Copyright (c) 2001-2011 Joel de Guzman
5
6 Distributed under the Boost Software License, Version 1.0. (See accompanying
7 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8 ==============================================================================*/
9 #if !defined(FUSION_MANIP_05052005_1200)
10 #define FUSION_MANIP_05052005_1200
11
12 #include <boost/config.hpp>
13 #include <string>
14 #include <vector>
15 #include <cctype>
16
17 // Tuple I/O manipulators
18
19 #define FUSION_GET_CHAR_TYPE(T) typename T::char_type
20 #define FUSION_GET_TRAITS_TYPE(T) typename T::traits_type
21
22 #if defined (BOOST_NO_TEMPLATED_STREAMS)
23 #define FUSION_STRING_OF_STREAM(Stream) std::string
24 #else
25 #define FUSION_STRING_OF_STREAM(Stream) \
26 std::basic_string< \
27 FUSION_GET_CHAR_TYPE(Stream) \
28 , FUSION_GET_TRAITS_TYPE(Stream) \
29 >
30 #endif
31
32 //$$$ these should be part of the public API$$$
33 //$$$ rename tuple_open, tuple_close and tuple_delimiter to
34 // open, close and delimeter and add these synonyms to the
35 // TR1 tuple module.
36
37 namespace boost { namespace fusion
38 {
39 namespace detail
40 {
41 template <typename Tag>
42 int get_xalloc_index(Tag* = 0)
43 {
44 // each Tag will have a unique index
45 static int index = std::ios::xalloc();
46 return index;
47 }
48
49 template <typename Stream, typename Tag, typename T>
50 struct stream_data
51 {
52 struct arena
53 {
54 ~arena()
55 {
56 for (
57 typename std::vector<T*>::iterator i = data.begin()
58 ; i != data.end()
59 ; ++i)
60 {
61 delete *i;
62 }
63 }
64
65 std::vector<T*> data;
66 };
67
68 static void attach(Stream& stream, T const& data)
69 {
70 static arena ar; // our arena
71 ar.data.push_back(new T(data));
72 stream.pword(get_xalloc_index<Tag>()) = ar.data.back();
73 }
74
75 static T const* get(Stream& stream)
76 {
77 return (T const*)stream.pword(get_xalloc_index<Tag>());
78 }
79 };
80
81 template <typename Tag, typename Stream>
82 class string_ios_manip
83 {
84 public:
85
86 typedef FUSION_STRING_OF_STREAM(Stream) string_type;
87
88 typedef stream_data<Stream, Tag, string_type> stream_data_t;
89
90 string_ios_manip(Stream& str_)
91 : stream(str_)
92 {}
93
94 void
95 set(string_type const& s)
96 {
97 stream_data_t::attach(stream, s);
98 }
99
100 void
101 print(char const* default_) const
102 {
103 // print a delimiter
104 string_type const* p = stream_data_t::get(stream);
105 if (p)
106 stream << *p;
107 else
108 stream << default_;
109 }
110
111 void
112 read(char const* default_) const
113 {
114 // read a delimiter
115 string_type const* p = stream_data_t::get(stream);
116 using namespace std;
117 ws(stream);
118
119 if (p)
120 {
121 typedef typename string_type::const_iterator iterator;
122 for (iterator i = p->begin(); i != p->end(); ++i)
123 check_delim(*i);
124 }
125 else
126 {
127 while (*default_)
128 check_delim(*default_++);
129 }
130 }
131
132 private:
133
134 template <typename Char>
135 void
136 check_delim(Char c) const
137 {
138 if (!isspace(c))
139 {
140 if (stream.get() != c)
141 {
142 stream.unget();
143 stream.setstate(std::ios::failbit);
144 }
145 }
146 }
147
148 Stream& stream;
149
150 private:
151 // silence MSVC warning C4512: assignment operator could not be generated
152 string_ios_manip& operator= (string_ios_manip const&);
153 };
154
155 } // detail
156
157 #if defined (BOOST_NO_TEMPLATED_STREAMS)
158
159 #define STD_TUPLE_DEFINE_MANIPULATOR(name) \
160 namespace detail \
161 { \
162 struct name##_tag; \
163 \
164 struct name##_type \
165 { \
166 typedef std::string string_type; \
167 string_type data; \
168 name##_type(const string_type& d): data(d) {} \
169 }; \
170 \
171 template <typename Stream> \
172 Stream& operator>>(Stream& s, const name##_type& m) \
173 { \
174 string_ios_manip<name##_tag, Stream>(s).set(m.data); \
175 return s; \
176 } \
177 \
178 template <typename Stream> \
179 Stream& operator<<(Stream& s, const name##_type& m) \
180 { \
181 string_ios_manip<name##_tag, Stream>(s).set(m.data); \
182 return s; \
183 } \
184 }
185
186 #define STD_TUPLE_DEFINE_MANIPULATOR_FUNCTIONS(name) \
187 inline detail::name##_type \
188 name(const std::string& s) \
189 { \
190 return detail::name##_type(s); \
191 } \
192 \
193 inline detail::name##_type \
194 name(const char* s) \
195 { \
196 return detail::name##_type(std::string(s)); \
197 } \
198 \
199 inline detail::name##_type \
200 name(char c) \
201 { \
202 return detail::name##_type(std::string(1, c)); \
203 }
204
205 #else // defined(BOOST_NO_TEMPLATED_STREAMS)
206
207 #if defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
208
209 #define STD_TUPLE_DEFINE_MANIPULATOR_FUNCTIONS(name) \
210 template <typename Char, typename Traits> \
211 inline detail::name##_type<Char, Traits> \
212 name(const std::basic_string<Char, Traits>& s) \
213 { \
214 return detail::name##_type<Char, Traits>(s); \
215 } \
216 \
217 inline detail::name##_type<char> \
218 name(char const* s) \
219 { \
220 return detail::name##_type<char>(std::basic_string<char>(s)); \
221 } \
222 \
223 inline detail::name##_type<wchar_t> \
224 name(wchar_t const* s) \
225 { \
226 return detail::name##_type<wchar_t>(std::basic_string<wchar_t>(s)); \
227 } \
228 \
229 inline detail::name##_type<char> \
230 name(char c) \
231 { \
232 return detail::name##_type<char>(std::basic_string<char>(1, c)); \
233 } \
234 \
235 inline detail::name##_type<wchar_t> \
236 name(wchar_t c) \
237 { \
238 return detail::name##_type<wchar_t>(std::basic_string<wchar_t>(1, c)); \
239 }
240
241 #else // defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
242
243 #define STD_TUPLE_DEFINE_MANIPULATOR_FUNCTIONS(name) \
244 template <typename Char, typename Traits> \
245 inline detail::name##_type<Char, Traits> \
246 name(const std::basic_string<Char, Traits>& s) \
247 { \
248 return detail::name##_type<Char, Traits>(s); \
249 } \
250 \
251 template <typename Char> \
252 inline detail::name##_type<Char> \
253 name(Char s[]) \
254 { \
255 return detail::name##_type<Char>(std::basic_string<Char>(s)); \
256 } \
257 \
258 template <typename Char> \
259 inline detail::name##_type<Char> \
260 name(Char const s[]) \
261 { \
262 return detail::name##_type<Char>(std::basic_string<Char>(s)); \
263 } \
264 \
265 template <typename Char> \
266 inline detail::name##_type<Char> \
267 name(Char c) \
268 { \
269 return detail::name##_type<Char>(std::basic_string<Char>(1, c)); \
270 }
271
272 #endif
273
274 #define STD_TUPLE_DEFINE_MANIPULATOR(name) \
275 namespace detail \
276 { \
277 struct name##_tag; \
278 \
279 template <typename Char, typename Traits = std::char_traits<Char> > \
280 struct name##_type \
281 { \
282 typedef std::basic_string<Char, Traits> string_type; \
283 string_type data; \
284 name##_type(const string_type& d): data(d) {} \
285 }; \
286 \
287 template <typename Stream, typename Char, typename Traits> \
288 Stream& operator>>(Stream& s, const name##_type<Char,Traits>& m) \
289 { \
290 string_ios_manip<name##_tag, Stream>(s).set(m.data); \
291 return s; \
292 } \
293 \
294 template <typename Stream, typename Char, typename Traits> \
295 Stream& operator<<(Stream& s, const name##_type<Char,Traits>& m) \
296 { \
297 string_ios_manip<name##_tag, Stream>(s).set(m.data); \
298 return s; \
299 } \
300 } \
301
302 #endif // defined(BOOST_NO_TEMPLATED_STREAMS)
303
304 STD_TUPLE_DEFINE_MANIPULATOR(tuple_open)
305 STD_TUPLE_DEFINE_MANIPULATOR(tuple_close)
306 STD_TUPLE_DEFINE_MANIPULATOR(tuple_delimiter)
307
308 STD_TUPLE_DEFINE_MANIPULATOR_FUNCTIONS(tuple_open)
309 STD_TUPLE_DEFINE_MANIPULATOR_FUNCTIONS(tuple_close)
310 STD_TUPLE_DEFINE_MANIPULATOR_FUNCTIONS(tuple_delimiter)
311
312 #undef STD_TUPLE_DEFINE_MANIPULATOR
313 #undef STD_TUPLE_DEFINE_MANIPULATOR_FUNCTIONS
314 #undef FUSION_STRING_OF_STREAM
315 #undef FUSION_GET_CHAR_TYPE
316 #undef FUSION_GET_TRAITS_TYPE
317
318 }}
319
320 #endif