L4Re Operating System Framework
Interface and Usage Documentation
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
basic_ostream
Go to the documentation of this file.
1// vi:set ft=cpp: -*- Mode: C++ -*-
6/*
7 * (c) 2009 Alexander Warg <warg@os.inf.tu-dresden.de>
8 * economic rights: Technische Universität Dresden (Germany)
9 *
10 * License: see LICENSE.spdx (in this directory or the directories above)
11 */
12#pragma once
13
14namespace L4 {
15
23 {
24 public:
25 IOModifier(int x) : mod(x) {}
26 bool operator == (IOModifier o) { return mod == o.mod; }
27 bool operator != (IOModifier o) { return mod != o.mod; }
28 int mod;
29 };
30
35 class IOBackend
36 {
37 public:
38 typedef int Mode;
39
40 protected:
41 friend class BasicOStream;
42
43 IOBackend()
44 : int_mode(10)
45 {}
46
47 virtual ~IOBackend() {}
48
49 virtual void write(char const *str, unsigned len) = 0;
50
51 private:
52 void write(IOModifier m);
53 void write(long long int c, int len);
54 void write(long long unsigned c, int len);
55 void write(long long unsigned c, unsigned char base = 10,
56 unsigned char len = 0, char pad = ' ');
57
58 Mode mode() const
59 { return int_mode; }
60
61 void mode(Mode m)
62 { int_mode = m; }
63
64 int int_mode;
65 };
66
71 class BasicOStream
72 {
73 public:
74 BasicOStream(IOBackend *b)
75 : iob(b)
76 {}
77
78 void write(char const *str, unsigned len)
79 {
80 if (iob)
81 iob->write(str, len);
82 }
83
84 void write(long long int c, int len)
85 {
86 if (iob)
87 iob->write(c, len);
88 }
89
90 void write(long long unsigned c, unsigned char base = 10,
91 unsigned char len = 0, char pad = ' ')
92 {
93 if (iob)
94 iob->write(c, base, len, pad);
95 }
96
97 void write(long long unsigned c, int len)
98 {
99 if (iob)
100 iob->write(c, len);
101 }
102
103 void write(IOModifier m)
104 {
105 if (iob)
106 iob->write(m);
107 }
108
109 IOBackend::Mode be_mode() const
110 {
111 if (iob)
112 return iob->mode();
113 return 0;
114 }
115
116 void be_mode(IOBackend::Mode m)
117 {
118 if (iob)
119 iob->mode(m);
120 }
121
122 private:
123 IOBackend *iob;
124 };
125
130 class IONumFmt
131 {
132 public:
133 IONumFmt(unsigned long long n, unsigned char base = 10,
134 unsigned char len = 0, char pad = ' ')
135 : n(n), base(base), len(len), pad(pad)
136 {}
137
138 BasicOStream &print(BasicOStream &o) const;
139
140 private:
141 unsigned long long n;
142 unsigned char base, len;
143 char pad;
144 };
145
146 inline IONumFmt n_hex(unsigned long long n) { return IONumFmt(n, 16); }
147
151 extern IOModifier const hex;
152
156 extern IOModifier const dec;
157
158 inline
159 BasicOStream &IONumFmt::print(BasicOStream &o) const
160 {
161 o.write(n, base, len, pad);
162 return o;
163 }
164}
165
166
167// Implementation
168
169inline
170L4::BasicOStream &
171operator << (L4::BasicOStream &s, char const * const str)
172{
173 if (!str)
174 {
175 s.write("(NULL)", 6);
176 return s;
177 }
178
179 unsigned l = 0;
180 for (; str[l] != 0; l++)
181 ;
182 s.write(str, l);
183 return s;
184}
185
186inline
187L4::BasicOStream &
188operator << (L4::BasicOStream &s, signed short u)
189{
190 s.write(static_cast<long long signed>(u), -1);
191 return s;
192}
193
194inline
195L4::BasicOStream &
196operator << (L4::BasicOStream &s, signed u)
197{
198 s.write(static_cast<long long signed>(u), -1);
199 return s;
200}
201
202inline
203L4::BasicOStream &
204operator << (L4::BasicOStream &s, signed long u)
205{
206 s.write(static_cast<long long signed>(u), -1);
207 return s;
208}
209
210inline
211L4::BasicOStream &
212operator << (L4::BasicOStream &s, signed long long u)
213{
214 s.write(u, -1);
215 return s;
216}
217
218inline
219L4::BasicOStream &
220operator << (L4::BasicOStream &s, unsigned short u)
221{
222 s.write(static_cast<long long unsigned>(u), -1);
223 return s;
224}
225
226inline
227L4::BasicOStream &
228operator << (L4::BasicOStream &s, unsigned u)
229{
230 s.write(static_cast<long long unsigned>(u), -1);
231 return s;
232}
233
234inline
235L4::BasicOStream &
236operator << (L4::BasicOStream &s, unsigned long u)
237{
238 s.write(static_cast<long long unsigned>(u), -1);
239 return s;
240}
241
242inline
243L4::BasicOStream &
244operator << (L4::BasicOStream &s, unsigned long long u)
245{
246 s.write(u, -1);
247 return s;
248}
249
250inline
251L4::BasicOStream &
252operator << (L4::BasicOStream &s, void const *u)
253{
254 long unsigned x = reinterpret_cast<long unsigned>(u);
255 L4::IOBackend::Mode mode = s.be_mode();
256 s.write(L4::hex);
257 s.write(static_cast<long long unsigned>(x), -1);
258 s.be_mode(mode);
259 return s;
260}
261
262inline
263L4::BasicOStream &
264operator << (L4::BasicOStream &s, L4::IOModifier m)
265{
266 s.write(m);
267 return s;
268}
269
270inline
271L4::BasicOStream &
272operator << (L4::BasicOStream &s, char c)
273{
274 s.write(&c, 1);
275 return s;
276}
277
278inline
279L4::BasicOStream &
280operator << (L4::BasicOStream &o, L4::IONumFmt const &n)
281{ return n.print(o); }
Modifier class for the IO stream.
Definition basic_ostream:23
L4 low-level kernel interface.
IOModifier const dec
Modifies the stream to print numbers as decimal values.
IOModifier const hex
Modifies the stream to print numbers as hexadecimal values.