ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/cf.schmorp.de/dclient/src/backend/adt/rtti_util.cpp
Revision: 1.1
Committed: Sun Oct 17 08:14:59 2010 UTC (16 years ago) by sf-pippijn
Branch: MAIN
CVS Tags: HEAD
Log Message:
initial import

File Contents

# Content
1 #include "adt/rtti_util.h"
2
3 #include <stdexcept>
4
5 enum builtin_type
6 {
7 NO_BUILTIN,
8 CHAR,
9 SCHAR,
10 UCHAR,
11 SSHORT,
12 USHORT,
13 SINT,
14 UINT,
15 SLONG,
16 ULONG,
17 FLOAT,
18 DOUBLE
19 };
20
21 static builtin_type
22 classify_builtin (std::type_info const &ti)
23 {
24 if (ti == typeid ( char)) return CHAR;
25 if (ti == typeid ( signed char)) return SCHAR;
26 if (ti == typeid (unsigned char)) return UCHAR;
27 if (ti == typeid ( signed short)) return SSHORT;
28 if (ti == typeid (unsigned short)) return USHORT;
29 if (ti == typeid ( signed int)) return SINT;
30 if (ti == typeid (unsigned int)) return UINT;
31 if (ti == typeid ( signed long)) return SLONG;
32 if (ti == typeid (unsigned long)) return ULONG;
33 if (ti == typeid ( float)) return FLOAT;
34 if (ti == typeid ( double)) return DOUBLE;
35 return NO_BUILTIN;
36 }
37
38
39 bool
40 is_integral (std::type_info const &ti)
41 {
42 switch (classify_builtin (ti))
43 {
44 case CHAR :
45 case SCHAR :
46 case UCHAR :
47 case SSHORT:
48 case USHORT:
49 case SINT :
50 case UINT :
51 case SLONG :
52 case ULONG :
53 return true;
54 case FLOAT :
55 case DOUBLE:
56 case NO_BUILTIN:
57 return false;
58 }
59 }
60
61 bool
62 is_signed (std::type_info const &ti)
63 {
64 switch (classify_builtin (ti))
65 {
66 case CHAR :
67 return true; // FIXME: maybe not
68 case UCHAR :
69 case USHORT:
70 case UINT :
71 case ULONG :
72 return false;
73 case SCHAR :
74 case SSHORT:
75 case SINT :
76 case SLONG :
77 return true;
78 case FLOAT :
79 case DOUBLE:
80 case NO_BUILTIN:
81 return false;
82 }
83 }
84
85 bool
86 is_floating_point (std::type_info const &ti)
87 {
88 switch (classify_builtin (ti))
89 {
90 case CHAR :
91 case SCHAR :
92 case UCHAR :
93 case SSHORT:
94 case USHORT:
95 case SINT :
96 case UINT :
97 case SLONG :
98 case ULONG :
99 return false;
100 case FLOAT :
101 case DOUBLE:
102 return true;
103 case NO_BUILTIN:
104 return false;
105 }
106 }
107
108 template<typename T>
109 T
110 runtime_cast (void const *ptr, std::type_info const &ti)
111 {
112 switch (classify_builtin (ti))
113 {
114 case CHAR : return *( char const *)ptr;
115 case SCHAR : return *( signed char const *)ptr;
116 case UCHAR : return *(unsigned char const *)ptr;
117 case SSHORT: return *( signed short const *)ptr;
118 case USHORT: return *(unsigned short const *)ptr;
119 case SINT : return *( signed int const *)ptr;
120 case UINT : return *(unsigned int const *)ptr;
121 case SLONG : return *( signed long const *)ptr;
122 case ULONG : return *(unsigned long const *)ptr;
123 case FLOAT : return *( float const *)ptr;
124 case DOUBLE: return *( double const *)ptr;
125 case NO_BUILTIN: break;
126 }
127 throw std::runtime_error ("impossible cast");
128 }
129
130 template double runtime_cast (void const *ptr, std::type_info const &ti);
131 template signed long runtime_cast (void const *ptr, std::type_info const &ti);
132 template unsigned long runtime_cast (void const *ptr, std::type_info const &ti);