Ne.app NeANT
The Ne.app NeANT User module of the NeANT distribution.
any.cpp
Go to the documentation of this file.
1
29// expand _TEST_EXPORT macros
30#define _RWSTD_TEST_SRC
31
32#include <rw_any.h>
33#include <rw_printf.h> // for rw_sprintfa()
34
35#include <stdlib.h> // for free()
36#include <string.h> // for memset()
37
38
39#ifndef _RWSTD_NO_BOOL
40
42 : str_ (0), tid_ (t_bool)
43{
44 // using memset instead of default-initialization in the ctor
45 // initializer list here and in all other ctors to work around
46 // a SunPro -xarch=v9 bug (PR #28328) that causes the following:
47 // Warning (Anachronism): Assigning int to __BIT_BLAST_16_16.
48 // Error: Cannot cast from int to __BIT_BLAST_16_16
49
50 memset (&val_, 0, sizeof val_);
51 val_.bool_ = value;
52}
53
54#endif // _RWSTD_NO_BOOL
55
57 : str_ (0), tid_ (t_char)
58{
59 memset (&val_, 0, sizeof val_);
60 val_.char_ = value;
61}
62
63
65 : str_ (0), tid_ (t_schar)
66{
67 memset (&val_, 0, sizeof val_);
68 val_.schar_ = value;
69}
70
71
73 : str_ (0), tid_ (t_uchar)
74{
75 memset (&val_, 0, sizeof val_);
76 val_.uchar_ = value;
77}
78
79
81 : str_ (0), tid_ (t_sshrt)
82{
83 memset (&val_, 0, sizeof val_);
84 val_.sshrt_ = value;
85}
86
87
88rw_any_t::rw_any_t (unsigned short value)
89 : str_ (0), tid_ (t_ushrt)
90{
91 memset (&val_, 0, sizeof val_);
92 val_.ushrt_ = value;
93}
94
95
97 : str_ (0), tid_ (t_sint)
98{
99 memset (&val_, 0, sizeof val_);
100 val_.sint_ = value;
101}
102
103
105 : str_ (0), tid_ (t_uint)
106{
107 memset (&val_, 0, sizeof val_);
108 val_.uint_ = value;
109}
110
111
113 : str_ (0), tid_ (t_slong)
114{
115 memset (&val_, 0, sizeof val_);
116 val_.slong_ = value;
117}
118
119
121 : str_ (0), tid_ (t_ulong)
122{
123 memset (&val_, 0, sizeof val_);
124 val_.ulong_ = value;
125}
126
127
128#ifdef _RWSTD_LONG_LONG
129
131 : str_ (0), tid_ (t_sllong)
132{
133 memset (&val_, 0, sizeof val_);
134 val_.sllong_ = value;
135}
136
137
139 : str_ (0), tid_ (t_ullong)
140{
141 memset (&val_, 0, sizeof val_);
142 val_.ullong_ = value;
143}
144
145#endif // _RWSTD_LONG_LONG
146
147
149 : str_ (0), tid_ (t_flt)
150{
151 memset (&val_, 0, sizeof val_);
152 val_.flt_ = value;
153}
154
155
157 : str_ (0), tid_ (t_dbl)
158{
159 memset (&val_, 0, sizeof val_);
160 val_.dbl_ = value;
161}
162
163
164#ifndef _RWSTD_NO_LONG_DOUBLE
165
167 : str_ (0), tid_ (t_ldbl)
168{
169 memset (&val_, 0, sizeof val_);
170 val_.ldbl_ = value;
171}
172
173#endif // _RWSTD_NO_LONG_DOUBLE
174
175
177 : str_ (0), tid_ (t_pvoid)
178{
179 memset (&val_, 0, sizeof val_);
180 val_.pvoid_ = value;
181}
182
184 : str_ (0), tid_ (t_c_pvoid)
185{
186 memset (&val_, 0, sizeof val_);
187 val_.pvoid_ = value;
188}
189
190rw_any_t::rw_any_t (volatile void* value)
191 : str_ (0), tid_ (t_v_pvoid)
192{
193 memset (&val_, 0, sizeof val_);
194 val_.pvoid_ = value;
195}
196
197rw_any_t::rw_any_t (const volatile void* value)
198 : str_ (0), tid_ (t_cv_pvoid)
199{
200 memset (&val_, 0, sizeof val_);
201 val_.pvoid_ = value;
202}
203
204
206 : str_ (0), tid_ (t_str)
207{
208 memset (&val_, 0, sizeof val_);
209 val_.pvoid_ = value;
210}
211
213 : str_ (0), tid_ (t_c_str)
214{
215 memset (&val_, 0, sizeof val_);
216 val_.pvoid_ = value;
217}
218
219rw_any_t::rw_any_t (volatile char* value)
220 : str_ (0), tid_ (t_v_str)
221{
222 memset (&val_, 0, sizeof val_);
223 val_.pvoid_ = value;
224}
225
226rw_any_t::rw_any_t (const volatile char* value)
227 : str_ (0), tid_ (t_cv_str)
228{
229 memset (&val_, 0, sizeof val_);
230 val_.pvoid_ = value;
231}
232
233#ifndef _RWSTD_NO_NATIVE_WCHAR_T
234
236 : str_ (0), tid_ (t_wchar)
237{
238 memset (&val_, 0, sizeof val_);
239 val_.wchar_ = value;
240}
241
242#endif // _RWSTD_NO_NATIVE_WCHAR_T
243
244
245#ifndef _RWSTD_NO_WCHAR_T
246
248 : str_ (0), tid_ (t_wstr)
249{
250 memset (&val_, 0, sizeof val_);
251 val_.pvoid_ = value;
252}
253
254rw_any_t::rw_any_t (const wchar_t* value)
255 : str_ (0), tid_ (t_c_wstr)
256{
257 memset (&val_, 0, sizeof val_);
258 val_.pvoid_ = value;
259}
260
261rw_any_t::rw_any_t (volatile wchar_t* value)
262 : str_ (0), tid_ (t_v_wstr)
263{
264 memset (&val_, 0, sizeof val_);
265 val_.pvoid_ = value;
266}
267
268rw_any_t::rw_any_t (const volatile wchar_t* value)
269 : str_ (0), tid_ (t_cv_wstr)
270{
271 memset (&val_, 0, sizeof val_);
272 val_.pvoid_ = value;
273}
274
275#endif // _RWSTD_NO_WCHAR_T
276
277
279 : val_ (rhs.val_), str_ (0), tid_ (rhs.tid_)
280{
281}
282
283
285{
286 // free string allocated by tostr() (via a call to sprintfa())
287 free (str_);
288
289 val_ = rhs.val_;
290 str_ = 0;
291 tid_ = rhs.tid_;
292
293 return *this;
294}
295
296
298{
299 // free string allocated by tostr() (via a call to sprintfa())
300 free (str_);
301
302 memset (&val_, 0, sizeof val_);
303
304 str_ = 0;
305 tid_ = type_id_t ();
306}
307
308
309const char*
311{
312 static const char* const names[] = {
313 "<no type>",
314 "bool", "signed char", "unsigned char", "char",
315 "short", "unsigned short", "int", "unsigned int",
316 "long", "unsigned long",
317 "long long", "unsigned long long",
318 "float", "double", "long double",
319 "wchar_t",
320 "void*", "const void*", "volatile void*", "const volatile void*",
321 "char*", "const char*", "volatile char*", "const volatile char*",
322 "wchar_t*", "const wchar_t*", "volatile wchar_t*",
323 "const volatile wchar_t*"
324 };
325
326 // the liftime of the returned string must extend
327 // to the end of the program
328 return names [tid_];
329}
330
331
332const char*
333rw_any_t::tostr (const char *fmt /* = 0 */)
334{
335 // free the previously allocated string
336 free (str_);
337 str_ = 0;
338
339 switch (tid_) {
340 case t_none:
341 return 0;
342
343 case t_bool:
344 return val_.bool_ ? "true" : "false";
345
346 case t_char:
347 if (0 == fmt)
348 fmt = "%c";
349 str_ = rw_sprintfa (fmt, val_.char_);
350 break;
351
352 case t_schar:
353 if (0 == fmt)
354 fmt = "%hhi";
355 str_ = rw_sprintfa (fmt, val_.schar_);
356 break;
357
358 case t_uchar:
359 if (0 == fmt)
360 fmt = "%hhu";
361 str_ = rw_sprintfa (fmt, val_.uchar_);
362 break;
363
364 case t_sshrt:
365 if (0 == fmt)
366 fmt = "%hi";
367 str_ = rw_sprintfa (fmt, val_.sshrt_);
368 break;
369
370 case t_ushrt:
371 if (0 == fmt)
372 fmt = "%hu";
373 str_ = rw_sprintfa (fmt, val_.ushrt_);
374 break;
375
376 case t_sint:
377 if (0 == fmt)
378 fmt = "%i";
379 str_ = rw_sprintfa (fmt, val_.sint_);
380 break;
381
382 case t_uint:
383 if (0 == fmt)
384 fmt = "%u";
385 str_ = rw_sprintfa (fmt, val_.uint_);
386 break;
387
388 case t_slong:
389 if (0 == fmt)
390 fmt = "%li";
391 str_ = rw_sprintfa (fmt, val_.slong_);
392 break;
393
394 case t_ulong:
395 if (0 == fmt)
396 fmt = "%lu";
397 str_ = rw_sprintfa (fmt, val_.ulong_);
398 break;
399
400#ifdef _RWSTD_LONG_LONG
401
402 case t_sllong:
403 if (0 == fmt)
404 fmt = "%lli";
405 str_ = rw_sprintfa (fmt, val_.sllong_);
406 break;
407
408 case t_ullong:
409 if (0 == fmt)
410 fmt = "%llu";
411 str_ = rw_sprintfa (fmt, val_.ullong_);
412 break;
413
414#endif // _RWSTD_LONG_LONG
415
416 case t_flt:
417 if (0 == fmt)
418 fmt = "%g";
419 str_ = rw_sprintfa (fmt, val_.flt_);
420 break;
421
422 case t_dbl:
423 if (0 == fmt)
424 fmt = "%g";
425 str_ = rw_sprintfa (fmt, val_.dbl_);
426 break;
427
428#ifndef _RWSTD_NO_LONG_DOUBLE
429
430 case t_ldbl:
431 if (0 == fmt)
432 fmt = "%Lg";
433 str_ = rw_sprintfa (fmt, val_.ldbl_);
434 break;
435
436#endif // _RWSTD_NO_LONG_DOUBLE
437
438 case t_pvoid:
439 case t_c_pvoid:
440 case t_v_pvoid:
441 case t_cv_pvoid:
442 if (0 == fmt)
443 fmt = "%p";
444 str_ = rw_sprintfa (fmt, val_.pvoid_);
445 break;
446
447#ifndef _RWSTD_NO_NATIVE_WCHAR_T
448
449 case t_wchar:
450 if (0 == fmt)
451 fmt = "%lc";
452 str_ = rw_sprintfa (fmt, val_.wchar_);
453 break;
454
455#endif // _RWSTD_NO_NATIVE_WCHAR_T
456
457 case t_str:
458 case t_c_str:
459 case t_v_str:
460 case t_cv_str:
461 if (0 == fmt)
462 fmt = "%s";
463 str_ = rw_sprintfa (fmt, val_.pvoid_);
464 break;
465
466#ifndef _RWSTD_NO_WCHAR_T
467
468 case t_wstr:
469 case t_c_wstr:
470 case t_v_wstr:
471 case t_cv_wstr:
472 if (0 == fmt)
473 fmt = "%ls";
474 str_ = rw_sprintfa (fmt, val_.pvoid_);
475 break;
476
477#endif // _RWSTD_NO_WCHAR_T
478
479 }
480
481 return str_;
482}
#define rhs
Definition 17.names.cpp:536
T value(const T &val)
#define _RWSTD_LONG_LONG
const char * tostr(const char *=0)
Definition any.cpp:333
const char * type_name() const
Definition any.cpp:310
@ t_cv_pvoid
Definition rw_any.h:107
@ t_flt
Definition rw_any.h:105
@ t_dbl
Definition rw_any.h:105
@ t_v_str
Definition rw_any.h:108
@ t_pvoid
Definition rw_any.h:107
@ t_v_pvoid
Definition rw_any.h:107
@ t_schar
Definition rw_any.h:102
@ t_cv_str
Definition rw_any.h:108
@ t_c_str
Definition rw_any.h:108
@ t_sint
Definition rw_any.h:103
@ t_uchar
Definition rw_any.h:102
@ t_ushrt
Definition rw_any.h:103
@ t_c_wstr
Definition rw_any.h:109
@ t_wstr
Definition rw_any.h:109
@ t_c_pvoid
Definition rw_any.h:107
@ t_ldbl
Definition rw_any.h:105
@ t_ulong
Definition rw_any.h:103
@ t_sllong
Definition rw_any.h:104
@ t_bool
Definition rw_any.h:102
@ t_uint
Definition rw_any.h:103
@ t_wchar
Definition rw_any.h:106
@ t_str
Definition rw_any.h:108
@ t_sshrt
Definition rw_any.h:103
@ t_ullong
Definition rw_any.h:104
@ t_char
Definition rw_any.h:102
@ t_none
Definition rw_any.h:101
@ t_slong
Definition rw_any.h:103
@ t_v_wstr
Definition rw_any.h:109
@ t_cv_wstr
Definition rw_any.h:109
rw_any_t(bool)
Definition any.cpp:41
~rw_any_t()
Definition any.cpp:297
rw_any_t & operator=(const rw_any_t &)
Definition any.cpp:284
_TEST_EXPORT char * rw_sprintfa(const char *fmt,...)
Definition printf.cpp:3258