00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef Fennel_StandardTypeDescriptor_Included
00025 #define Fennel_StandardTypeDescriptor_Included
00026
00027 #include "fennel/tuple/StoredTypeDescriptor.h"
00028 #include "fennel/tuple/StoredTypeDescriptorFactory.h"
00029
00030 FENNEL_BEGIN_NAMESPACE
00031
00043 enum StandardTypeDescriptorOrdinal
00044 {
00045 STANDARD_TYPE_MIN = 1,
00046 STANDARD_TYPE_INT_8 = 1,
00047 STANDARD_TYPE_UINT_8 = 2,
00048 STANDARD_TYPE_INT_16 = 3,
00049 STANDARD_TYPE_UINT_16 = 4,
00050 STANDARD_TYPE_INT_32 = 5,
00051 STANDARD_TYPE_UINT_32 = 6,
00052 STANDARD_TYPE_INT_64 = 7,
00053 STANDARD_TYPE_UINT_64 = 8,
00054 STANDARD_TYPE_BOOL = 9,
00055 STANDARD_TYPE_REAL = 10,
00056 STANDARD_TYPE_DOUBLE = 11,
00057 STANDARD_TYPE_CHAR = 12,
00058 STANDARD_TYPE_VARCHAR = 13,
00059 STANDARD_TYPE_BINARY = 14,
00060 STANDARD_TYPE_VARBINARY = 15,
00061 STANDARD_TYPE_END_NO_UNICODE = 16,
00062 STANDARD_TYPE_UNICODE_CHAR = 16,
00063 STANDARD_TYPE_UNICODE_VARCHAR = 17,
00064 STANDARD_TYPE_END,
00065
00069 STANDARD_TYPE_RECORDNUM = STANDARD_TYPE_INT_64,
00070
00071 EXTENSION_TYPE_MIN = 1000,
00072 };
00073
00078 class FENNEL_TUPLE_EXPORT StandardTypeDescriptor
00079 {
00080 public:
00081 static inline char const * const
00082 toString(StandardTypeDescriptorOrdinal st)
00083 {
00084 switch (st) {
00085 case STANDARD_TYPE_INT_8:
00086 return "s1";
00087 case STANDARD_TYPE_UINT_8:
00088 return "u1";
00089 case STANDARD_TYPE_INT_16:
00090 return "s2";
00091 case STANDARD_TYPE_UINT_16:
00092 return "u2";
00093 case STANDARD_TYPE_INT_32:
00094 return "s4";
00095 case STANDARD_TYPE_UINT_32:
00096 return "u4";
00097 case STANDARD_TYPE_INT_64:
00098 return "s8";
00099 case STANDARD_TYPE_UINT_64:
00100 return "u8";
00101 case STANDARD_TYPE_BOOL:
00102 return "bo";
00103 case STANDARD_TYPE_REAL:
00104 return "r";
00105 case STANDARD_TYPE_DOUBLE:
00106 return "d";
00107 case STANDARD_TYPE_CHAR:
00108 return "c";
00109 case STANDARD_TYPE_VARCHAR:
00110 return "vc";
00111 case STANDARD_TYPE_BINARY:
00112 return "b";
00113 case STANDARD_TYPE_VARBINARY:
00114 return "vb";
00115 case STANDARD_TYPE_UNICODE_CHAR:
00116 return "U";
00117 case STANDARD_TYPE_UNICODE_VARCHAR:
00118 return "vU";
00119 default:
00120 permAssert(false);
00121 }
00122 }
00123
00124 static inline StandardTypeDescriptorOrdinal
00125 fromString(char const * const str)
00126 {
00127
00128 switch (*str) {
00129 case 's':
00130 switch (*(str + 1)) {
00131 case '1':
00132 return STANDARD_TYPE_INT_8;
00133 case '2':
00134 return STANDARD_TYPE_INT_16;
00135 case '4':
00136 return STANDARD_TYPE_INT_32;
00137 case '8':
00138 return STANDARD_TYPE_INT_64;
00139 default:
00140 break;
00141 }
00142 break;
00143 case 'u':
00144 switch (*(str + 1)) {
00145 case '1':
00146 return STANDARD_TYPE_UINT_8;
00147 case '2':
00148 return STANDARD_TYPE_UINT_16;
00149 case '4':
00150 return STANDARD_TYPE_UINT_32;
00151 case '8':
00152 return STANDARD_TYPE_UINT_64;
00153 default:
00154 break;
00155 }
00156 break;
00157 case 'r':
00158 return STANDARD_TYPE_REAL;
00159 case 'd':
00160 return STANDARD_TYPE_DOUBLE;
00161 case 'c':
00162 return STANDARD_TYPE_CHAR;
00163 case 'U':
00164 return STANDARD_TYPE_UNICODE_CHAR;
00165 case 'v':
00166 switch (*(str + 1)) {
00167 case 'c':
00168 return STANDARD_TYPE_VARCHAR;
00169 case 'b':
00170 return STANDARD_TYPE_VARBINARY;
00171 case 'U':
00172 return STANDARD_TYPE_UNICODE_VARCHAR;
00173 default:
00174 break;
00175 }
00176 case 'b':
00177 switch (*(str + 1)) {
00178 case 'o':
00179 return STANDARD_TYPE_BOOL;
00180 case 0:
00181 return STANDARD_TYPE_BINARY;
00182 default:
00183 break;
00184 }
00185 }
00186
00187 permAssert(false);
00188 }
00189
00190 static inline bool
00191 isNative(StandardTypeDescriptorOrdinal st)
00192 {
00193 if (st <= STANDARD_TYPE_DOUBLE) {
00194 return true;
00195 }
00196 return false;
00197 }
00198
00199
00200 static inline bool
00201 isNativeNotBool(StandardTypeDescriptorOrdinal st)
00202 {
00203 if (st <= STANDARD_TYPE_DOUBLE && st != STANDARD_TYPE_BOOL) {
00204 return true;
00205 }
00206 return false;
00207 }
00208
00213 static inline bool
00214 isIntegralNative(StandardTypeDescriptorOrdinal st)
00215 {
00216 if (st <= STANDARD_TYPE_BOOL) {
00217 return true;
00218 }
00219 return false;
00220 }
00221
00226 static inline bool
00227 isExact(StandardTypeDescriptorOrdinal st)
00228 {
00229 if (st <= STANDARD_TYPE_UINT_64) {
00230 return true;
00231 }
00232 return false;
00233 }
00234
00235
00236 static inline bool
00237 isApprox(StandardTypeDescriptorOrdinal st)
00238 {
00239 if (st == STANDARD_TYPE_REAL ||
00240 st == STANDARD_TYPE_DOUBLE) {
00241 return true;
00242 }
00243 return false;
00244 }
00245
00246 static inline bool
00247 isArray(StandardTypeDescriptorOrdinal st)
00248 {
00249 if (st >= STANDARD_TYPE_CHAR &&
00250 st <= STANDARD_TYPE_UNICODE_VARCHAR) {
00251 return true;
00252 }
00253 return false;
00254 }
00255
00256 static inline bool
00257 isVariableLenArray(StandardTypeDescriptorOrdinal st)
00258 {
00259 if (st == STANDARD_TYPE_VARCHAR ||
00260 st == STANDARD_TYPE_VARBINARY ||
00261 st == STANDARD_TYPE_UNICODE_VARCHAR) {
00262 return true;
00263 }
00264 return false;
00265 }
00266
00267 static inline bool
00268 isFixedLenArray(StandardTypeDescriptorOrdinal st)
00269 {
00270 if (st == STANDARD_TYPE_CHAR ||
00271 st == STANDARD_TYPE_BINARY ||
00272 st == STANDARD_TYPE_UNICODE_CHAR) {
00273 return true;
00274 }
00275 return false;
00276 }
00277
00278 static inline bool
00279 isTextArray(StandardTypeDescriptorOrdinal st)
00280 {
00281 if (st == STANDARD_TYPE_CHAR ||
00282 st == STANDARD_TYPE_VARCHAR ||
00283 st == STANDARD_TYPE_UNICODE_CHAR ||
00284 st == STANDARD_TYPE_UNICODE_VARCHAR) {
00285 return true;
00286 }
00287 return false;
00288 }
00289
00290 static inline bool
00291 isBinaryArray(StandardTypeDescriptorOrdinal st)
00292 {
00293 if (st == STANDARD_TYPE_VARBINARY ||
00294 st == STANDARD_TYPE_BINARY) {
00295 return true;
00296 }
00297 return false;
00298 }
00299
00300 private:
00301 explicit
00302 StandardTypeDescriptor();
00303 };
00304
00305
00311 class FENNEL_TUPLE_EXPORT StandardTypeDescriptorFactory
00312 : public StoredTypeDescriptorFactory
00313 {
00314 public:
00315 explicit StandardTypeDescriptorFactory();
00316 virtual StoredTypeDescriptor const &newDataType(
00317 StoredTypeDescriptor::Ordinal iTypeOrdinal) const;
00318 };
00319
00320 FENNEL_END_NAMESPACE
00321
00322 #endif
00323
00324