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

# User Rev Content
1 sf-pippijn 1.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);