59template <
typename Char,
typename Traits>
60void eat_whitespace(std::basic_istream<Char, Traits>& stream)
78 template <
typename Container,
typename T>
79 static void push(Container& container,
const T& value)
81 container.push_back(value);
83 template <
typename Container>
84 static void temp_to_output(Container& temp, Container& output)
95 template <
typename Container,
typename T>
96 static void push(Container& container,
const T& value)
98 container.insert(value);
100 template <
typename Container>
101 static void temp_to_output(Container& temp, Container& output)
113 template <
typename Char,
typename Traits,
typename T>
115 std::basic_istream<Char, Traits>& stream, T& value,
116 Char inter_seperator, Char , Char closer)
118 eat_whitespace(stream);
122 std::basic_string<Char, Traits> buffer;
124 while (stream.get(c))
126 if (c == inter_seperator || c == closer)
136 return cast(buffer, value);
140 static bool cast(
const std::string& buffer, std::string& value)
145 template <
typename T>
146 static bool cast(
const std::string& buffer, T& value)
148 std::stringstream buffer_stream(buffer);
149 if (std::numeric_limits<T>::is_specialized)
151 buffer_stream.precision(std::numeric_limits<T>::digits10 + 1);
153 return buffer_stream >> value && (buffer_stream >> std::ws).eof();
163 template <
typename Char,
typename Traits,
typename T,
typename U>
165 std::basic_istream<Char, Traits>& stream, std::pair<T, U>& value,
166 Char inter_seperator, Char intra_seperator, Char closer)
168 if (!value_traits::read<Char>(stream, value.first, intra_seperator, 0, intra_seperator))
174 if (!value_traits::read<Char>(stream, value.second, inter_seperator, 0, closer))
185template <
typename Iterator,
typename Char,
typename Traits>
186std::basic_ostream<Char, Traits>& print_sequence(
187 std::basic_ostream<Char, Traits>& stream, Iterator begin, Iterator end,
188 const Char* opener,
const Char* seperator,
const Char* closer)
190 std::basic_ostringstream<Char, Traits> buffer;
191 buffer.copyfmt(stream);
195 for (Iterator i = begin; i != end; ++i)
205 LASS_ENFORCE_STREAM(stream) << buffer.str();
212template <
typename Char,
typename Traits,
typename Iterator>
213std::basic_ostream<Char, Traits>& print_map(
214 std::basic_ostream<Char, Traits>& stream, Iterator begin, Iterator end,
215 const Char* opener,
const Char* seperator_1,
const Char* seperator_2,
const Char* closer)
217 std::basic_ostringstream<Char, Traits> buffer;
218 buffer.copyfmt(stream);
222 for (Iterator i = begin; i != end; ++i)
226 buffer << seperator_1;
228 buffer << i->first << seperator_2 << i->second;
232 LASS_ENFORCE_STREAM(stream) << buffer.str();
241 typename ContainerTraits,
typename DataTraits,
typename T,
242 typename Char,
typename Traits,
245std::basic_istream<Char, Traits>& read_container(
246 std::basic_istream<Char, Traits>& stream, Container& container,
247 Char opener, Char inter_seperator, Char intra_seperator, Char closer)
253 eat_whitespace(stream);
259 good = DataTraits::read(stream, temp, inter_seperator, intra_seperator, closer);
262 ContainerTraits::push(result, temp);
276 while (good && stream.get(c) && c != closer)
278 if (c == inter_seperator)
281 good = DataTraits::read(stream, temp, inter_seperator, intra_seperator, closer);
284 ContainerTraits::push(result, temp);
296 ContainerTraits::temp_to_output(result, container);
300 stream.clear(std::ios::failbit);
321template <
typename T1,
typename T2,
typename Char,
typename Traits>
322std::basic_ostream<Char, Traits>& operator<<(
323 std::basic_ostream<Char, Traits>& stream,
const std::pair<T1, T2>& x)
325 std::basic_ostringstream<Char, Traits> buffer;
326 buffer.copyfmt(stream);
328 buffer <<
"(" << x.first <<
", " << x.second <<
")";
329 LASS_ENFORCE_STREAM(stream) << buffer.str();
335template <
typename T,
typename Alloc,
typename Char,
typename Traits>
336std::basic_ostream<Char, Traits>& operator<<(
337 std::basic_ostream<Char, Traits>& stream,
const std::vector<T, Alloc>& container)
339 return lass::stde::impl::print_sequence(
340 stream, container.begin(), container.end(),
"[",
", ",
"]");
345template <
typename T,
typename Alloc,
typename Char,
typename Traits>
346std::basic_ostream<Char, Traits>& operator<<(
347 std::basic_ostream<Char, Traits>& stream,
const std::list<T, Alloc>& container)
349 return lass::stde::impl::print_sequence(
350 stream, container.begin(), container.end(),
"[",
", ",
"]");
355template <
typename T,
typename Alloc,
typename Char,
typename Traits>
356std::basic_ostream<Char, Traits>& operator<<(
357 std::basic_ostream<Char, Traits>& stream,
const std::deque<T, Alloc>& container)
359 return lass::stde::impl::print_sequence(
360 stream, container.begin(), container.end(),
"[",
", ",
"]");
365template <
typename Key,
typename Data,
typename Comp,
typename Alloc,
typename Char,
typename Traits>
366std::basic_ostream<Char, Traits>& operator<<(
367 std::basic_ostream<Char, Traits>& stream,
368 const std::map<Key, Data, Comp, Alloc>& container)
370 return lass::stde::impl::print_map<Char>(
371 stream, container.begin(), container.end(),
"{",
", ",
": ",
"}");
376template <
typename Key,
typename Data,
typename Comp,
typename Alloc,
typename Char,
typename Traits>
377std::basic_ostream<Char, Traits>& operator<<(
378 std::basic_ostream<Char, Traits>& stream,
379 const std::multimap<Key, Data, Comp, Alloc>& container)
381 return lass::stde::impl::print_map<Char>(
382 stream, container.begin(), container.end(),
"{",
", ",
": ",
"}");
387template <
typename Key,
typename Comp,
typename Alloc,
typename Char,
typename Traits>
388std::basic_ostream<Char, Traits>& operator<<(
389 std::basic_ostream<Char, Traits>& stream,
390 const std::set<Key, Comp, Alloc>& container)
392 return lass::stde::impl::print_sequence(
393 stream, container.begin(), container.end(),
"{",
", ",
"}");
398template <
typename Key,
typename Comp,
typename Alloc,
typename Char,
typename Traits>
399std::basic_ostream<Char, Traits>& operator<<(
400 std::basic_ostream<Char, Traits>& stream,
401 const std::multiset<Key, Comp, Alloc>& container)
403 return lass::stde::impl::print_sequence(
404 stream, container.begin(), container.end(),
"{",
", ",
"}");
413template <
typename Char,
typename Traits,
typename T1,
typename T2>
414std::basic_istream<Char, Traits>& operator>>(
415 std::basic_istream<Char, Traits>& stream, std::pair<T1, T2>& x)
417 using namespace lass::stde;
424 std::pair<T1, T2> temp;
425 if (impl::pair_traits::read<Char>(stream, temp,
')',
',',
')'))
435 stream.clear(std::ios::failbit);
440 stream.clear(std::ios::failbit);
450template <
typename Char,
typename Traits,
typename T,
typename Alloc>
451std::basic_istream<Char, Traits>& operator>>(
452 std::basic_istream<Char, Traits>& stream, std::vector<T, Alloc>& container)
454 return ::lass::stde::impl::read_container<
455 ::lass::stde::impl::sequence_traits,
456 ::lass::stde::impl::value_traits,
458 stream, container,
'[',
',', 0,
']');
465template <
typename Char,
typename Traits,
typename T,
typename Alloc>
466std::basic_istream<Char, Traits>& operator>>(
467 std::basic_istream<Char, Traits>& stream, std::list<T, Alloc>& container)
469 return ::lass::stde::impl::read_container<
470 ::lass::stde::impl::sequence_traits,
471 ::lass::stde::impl::value_traits,
473 stream, container,
'[',
',', 0,
']');
480template <
typename Char,
typename Traits,
typename T,
typename Alloc>
481std::basic_istream<Char, Traits>& operator>>(
482 std::basic_istream<Char, Traits>& stream, std::deque<T, Alloc>& container)
484 return ::lass::stde::impl::read_container<
485 ::lass::stde::impl::sequence_traits,
486 ::lass::stde::impl::value_traits,
488 stream, container,
'[',
',', 0,
']');
495template <
typename Char,
typename Traits,
typename Key,
typename Data,
typename Comp,
typename Alloc>
496std::basic_istream<Char, Traits>& operator>>(
497 std::basic_istream<Char, Traits>& stream, std::map<Key, Data, Comp, Alloc>& container)
499 return ::lass::stde::impl::read_container<
500 ::lass::stde::impl::set_traits,
501 ::lass::stde::impl::pair_traits,
502 std::pair<Key, Data>, Char>(
503 stream, container,
'{',
',',
':',
'}');
510template <
typename Char,
typename Traits,
typename Key,
typename Data,
typename Comp,
typename Alloc>
511std::basic_istream<Char, Traits>& operator>>(
512 std::basic_istream<Char, Traits>& stream,
513 std::multimap<Key, Data, Comp, Alloc>& container)
515 return ::lass::stde::impl::read_container<
516 ::lass::stde::impl::set_traits,
517 ::lass::stde::impl::pair_traits,
518 std::pair<Key, Data>, Char>(
519 stream, container,
'{',
',',
':',
'}');
526template <
typename Char,
typename Traits,
typename Key,
typename Comp,
typename Alloc>
527std::basic_istream<Char, Traits>& operator>>(
528 std::basic_istream<Char, Traits>& stream, std::set<Key, Comp, Alloc>& container)
530 return ::lass::stde::impl::read_container<
531 ::lass::stde::impl::set_traits,
532 ::lass::stde::impl::value_traits,
534 stream, container,
'{',
',', 0,
'}');
541template <
typename Char,
typename Traits,
typename Key,
typename Comp,
typename Alloc>
542std::basic_istream<Char, Traits>& operator>>(
543 std::basic_istream<Char, Traits>& stream, std::multiset<Key, Comp, Alloc>& container)
545 return ::lass::stde::impl::read_container<
546 ::lass::stde::impl::set_traits,
547 ::lass::stde::impl::value_traits,
549 stream, container,
'{',
',', 0,
'}');
std::basic_string< Char, Traits, Alloc > rstrip(const std::basic_string< Char, Traits, Alloc > &to_be_stripped, const std::basic_string< Char, Traits, Alloc > &to_be_removed)
Return a copy of the string to_be_stripped with trailing characters removed.
lass extensions to the standard library
Library for Assembled Shared Sources.