Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
GenVectorIO.h
Go to the documentation of this file.
1// @(#)root/mathcore:$Id$
2// Authors: W. Brown, M. Fischler, L. Moneta 2005
3
4/**********************************************************************
5 * *
6 * Copyright (c) 2005 , LCG ROOT MathLib Team (FNAL component) *
7 * *
8 * *
9 **********************************************************************/
10
11// Support templates (class and function) for stream i/o of vectors
12// This is a utuility to allow for control, via manipulators, of the
13// form of
14//
15// Created by: W. E. Brown and M. Fischler at Tue Jun 21 2005
16//
17// Last update: Tue Jun 21 2005
18//
19#ifndef ROOT_MathX_GenVectorX_GenVectorIO
20#define ROOT_MathX_GenVectorX_GenVectorIO 1
21
23
24#include <cctype>
25#include <iostream>
26
27#if !defined(ROOT_MATH_SYCL) && !defined(ROOT_MATH_CUDA)
28
29namespace ROOT {
30namespace ROOT_MATH_ARCH {
31
32namespace detail {
33
34// -------- Manipulator support ----------
35
42
43inline int ios_data(int k)
44{
45 static int const ios_data[4] = {
46 std::ios::xalloc() // open
47 ,
48 std::ios::xalloc() // sep
49 ,
50 std::ios::xalloc() // close
51 ,
52 std::ios::xalloc() // bitforbit
53 };
54
55 return ios_data[k];
56
57} // ios_data()
58
59template <class char_t, class traits_t>
60inline char_t get_manip(std::basic_ios<char_t, traits_t> &ios, manip_t m)
61{
62 char_t ch = static_cast<char_t>(ios.iword(ios_data(m)));
63 if (ch)
64 return ch;
65
66 switch (m) {
67 default: return ios.widen('?');
68 case open: return ios.widen('(');
69 case close: return ios.widen(')');
70 case sep: return ios.widen(',');
71 case bitforbit: return ch;
72 }
73
74} // get_manip<>()
75
76template <class char_t, class traits_t>
77inline void set_manip(std::basic_ios<char_t, traits_t> &ios, manip_t m, char_t ch)
78{
79 ios.iword(ios_data(m)) = static_cast<long>(ch);
80
81} // set_manip<>()
82
83template <class char_t>
85public:
86 explicit manipulator(manip_t m, char_t ch = 0) : fMan(m), fChar(ch) {}
87
88 template <class traits_t>
89 void set(std::basic_ios<char_t, traits_t> &ios) const
90 {
92 }
93
94private:
96 char_t fChar;
97
98}; // manipulator<>
99
100template <class char_t, class traits_t>
101inline std::basic_istream<char_t, traits_t> &require_delim(std::basic_istream<char_t, traits_t> &is, manip_t m)
102{
103 char_t delim = get_manip(is, m);
104 if (std::isspace(delim))
105 return is;
106
107 char_t ch;
108 is >> ch;
109 if (ch != delim)
110 is.setstate(std::ios::failbit);
111
112 return is;
113
114} // require_delim<>()
115
116template <class char_t, class traits_t>
117inline std::basic_ostream<char_t, traits_t> &
118operator<<(std::basic_ostream<char_t, traits_t> &os, detail::manipulator<char_t> const &manip)
119
120{
121 manip.set(os);
122 return os;
123
124} // op<< <>()
125
126template <class char_t, class traits_t>
127inline std::basic_istream<char_t, traits_t> &
128operator>>(std::basic_istream<char_t, traits_t> &is, detail::manipulator<char_t> const &manip)
129
130{
131 manip.set(is);
132 return is;
133
134} // op>> <>()
135
136} // namespace detail
137
138// --------- Functions that allow a user to control vector I/O ----------
139
140template <class char_t>
142{
144
145} // set_open<>()
146
147template <class char_t>
149{
151
152} // set_separator<>()
153
154template <class char_t>
156{
158
159} // set_close<>()
160
161template <class char_t, class traits_t>
162inline std::basic_ios<char_t, traits_t> &human_readable(std::basic_ios<char_t, traits_t> &ios)
163{
164 ios.iword(ios_data(detail::bitforbit)) = 0L;
165 return ios;
166
167} // human_readable<>()
168
169template <class char_t, class traits_t>
170inline std::basic_ios<char_t, traits_t> &machine_readable(std::basic_ios<char_t, traits_t> &ios)
171{
172 ios.iword(ios_data(detail::bitforbit)) = 1L;
173 return ios;
174
175} // machine_readable<>()
176
177} // namespace ROOT_MATH_ARCH
178} // namespace ROOT
179
180#endif
181
182#endif // ROOT_MathX_GenVectorX_GenVectorIO
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
void set(std::basic_ios< char_t, traits_t > &ios) const
Definition GenVectorIO.h:89
std::basic_istream< char_t, traits_t > & require_delim(std::basic_istream< char_t, traits_t > &is, manip_t m)
char_t get_manip(std::basic_ios< char_t, traits_t > &ios, manip_t m)
Definition GenVectorIO.h:60
void set_manip(std::basic_ios< char_t, traits_t > &ios, manip_t m, char_t ch)
Definition GenVectorIO.h:77
std::basic_istream< char_t, traits_t > & operator>>(std::basic_istream< char_t, traits_t > &is, detail::manipulator< char_t > const &manip)
std::basic_ostream< char_t, traits_t > & operator<<(std::basic_ostream< char_t, traits_t > &os, detail::manipulator< char_t > const &manip)
detail::manipulator< char_t > set_close(char_t ch)
detail::manipulator< char_t > set_open(char_t ch)
std::basic_ios< char_t, traits_t > & machine_readable(std::basic_ios< char_t, traits_t > &ios)
detail::manipulator< char_t > set_separator(char_t ch)
std::basic_ios< char_t, traits_t > & human_readable(std::basic_ios< char_t, traits_t > &ios)
TMarker m
Definition textangle.C:8