30 TDataType* TDataType::fgBuiltins[kNumDataTypes] = {0};
36 TDataType::TDataType(TypedefInfo_t *info) : TDictionary(),
37 fTypeNameIdx(-1), fTypeNameLen(0)
42 R__LOCKGUARD(gInterpreterMutex);
43 SetName(gCling->TypedefInfo_Name(fInfo));
44 SetTitle(gCling->TypedefInfo_Title(fInfo));
45 SetType(gCling->TypedefInfo_TrueName(fInfo));
46 fProperty = gCling->TypedefInfo_Property(fInfo);
47 fSize = gCling->TypedefInfo_Size(fInfo);
49 SetTitle(
"Builtin basic type");
59 TDataType::TDataType(
const char *typenam) : fInfo(0), fProperty(kIsFundamental),
60 fTypeNameIdx(-1), fTypeNameLen(0)
64 SetTitle(
"Builtin basic type");
66 SetType(fName.Data());
72 TDataType::TDataType(
const TDataType& dt) :
74 fInfo(gCling->TypedefInfo_FactoryCopy(dt.fInfo)),
77 fProperty(dt.fProperty),
78 fTrueName(dt.fTrueName),
79 fTypeNameIdx(dt.fTypeNameIdx), fTypeNameLen(dt.fTypeNameLen)
86 TDataType& TDataType::operator=(
const TDataType& dt)
89 TDictionary::operator=(dt);
90 gCling->TypedefInfo_Delete(fInfo);
91 fInfo=gCling->TypedefInfo_FactoryCopy(dt.fInfo);
94 fProperty=dt.fProperty;
95 fTrueName=dt.fTrueName;
96 fTypeNameIdx=dt.fTypeNameIdx;
97 fTypeNameLen=dt.fTypeNameLen;
105 TDataType::~TDataType()
107 gCling->TypedefInfo_Delete(fInfo);
113 const char *TDataType::GetTypeName(EDataType type)
116 case 1:
return "Char_t";
117 case 2:
return "Short_t";
118 case 3:
return "Int_t";
119 case 4:
return "Long_t";
120 case 5:
return "Float_t";
121 case 6:
return "Int_t";
122 case 7:
return "char*";
123 case 8:
return "Double_t";
124 case 9:
return "Double32_t";
125 case 11:
return "UChar_t";
126 case 12:
return "UShort_t";
127 case 13:
return "UInt_t";
128 case 14:
return "ULong_t";
129 case 15:
return "UInt_t";
130 case 16:
return "Long64_t";
131 case 17:
return "ULong64_t";
132 case 18:
return "Bool_t";
133 case 19:
return "Float16_t";
134 case kVoid_t:
return "void";
135 case kDataTypeAliasUnsigned_t:
return "UInt_t";
136 case kDataTypeAliasSignedChar_t:
return "SignedChar_t";
137 case kOther_t:
return "";
138 case kNoType_t:
return "";
139 case kchar:
return "Char_t";
149 TString TDataType::GetTypeName()
152 return fTrueName(fTypeNameIdx, fTypeNameLen);
156 (
const_cast<TDataType*
>(
this))->CheckInfo();
157 TString typeName = gInterpreter->TypeName(fTrueName.Data());
158 fTypeNameIdx = fTrueName.Index(typeName);
159 if (fTypeNameIdx == -1) {
160 Error(
"GetTypeName",
"Cannot find type name %s in true name %s!",
161 typeName.Data(), fTrueName.Data());
164 fTypeNameLen = typeName.Length();
165 return fTrueName(fTypeNameIdx, fTypeNameLen);
167 if (fType != kOther_t)
return fName.Data();
175 const char *TDataType::GetFullTypeName()
const
178 (
const_cast<TDataType*
>(
this))->CheckInfo();
181 if (fType != kOther_t)
return fName;
189 EDataType TDataType::GetType(
const std::type_info &typeinfo)
191 EDataType retType = kOther_t;
193 if (!strcmp(
typeid(
unsigned int).name(), typeinfo.name())) {
195 }
else if (!strcmp(
typeid(
int).name(), typeinfo.name())) {
197 }
else if (!strcmp(
typeid(ULong_t).name(), typeinfo.name())) {
199 }
else if (!strcmp(
typeid(Long_t).name(), typeinfo.name())) {
201 }
else if (!strcmp(
typeid(ULong64_t).name(), typeinfo.name())) {
202 retType = kULong64_t;
203 }
else if (!strcmp(
typeid(Long64_t).name(), typeinfo.name())) {
205 }
else if (!strcmp(
typeid(
unsigned short).name(), typeinfo.name())) {
207 }
else if (!strcmp(
typeid(
short).name(), typeinfo.name())) {
209 }
else if (!strcmp(
typeid(
unsigned char).name(), typeinfo.name())) {
211 }
else if (!strcmp(
typeid(
char).name(), typeinfo.name())) {
213 }
else if (!strcmp(
typeid(Bool_t).name(), typeinfo.name())) {
215 }
else if (!strcmp(
typeid(
float).name(), typeinfo.name())) {
217 }
else if (!strcmp(
typeid(Float16_t).name(), typeinfo.name())) {
218 retType = kFloat16_t;
219 }
else if (!strcmp(
typeid(
double).name(), typeinfo.name())) {
221 }
else if (!strcmp(
typeid(Double32_t).name(), typeinfo.name())) {
222 retType = kDouble32_t;
223 }
else if (!strcmp(
typeid(
char*).name(), typeinfo.name())) {
225 }
else if (!strcmp(
typeid(
signed char).name(), typeinfo.name())) {
226 retType = kDataTypeAliasSignedChar_t;
235 const char *TDataType::AsString(
void *buf)
const
237 TTHREAD_TLS_DECL_ARG(TString, line ,81);
241 (
const_cast<TDataType*
>(
this))->CheckInfo();
248 if (!strcmp(
"unsigned int", name))
249 line.Form(
"%u", *(
unsigned int *)buf);
250 else if (!strcmp(
"unsigned", name))
251 line.Form(
"%u", *(
unsigned int *)buf);
252 else if (!strcmp(
"int", name))
253 line.Form(
"%d", *(
int *)buf);
254 else if (!strcmp(
"unsigned long", name))
255 line.Form(
"%lu", *(ULong_t *)buf);
256 else if (!strcmp(
"long", name))
257 line.Form(
"%ld", *(Long_t *)buf);
258 else if (!strcmp(
"unsigned long long", name))
259 line.Form(
"%llu", *(ULong64_t *)buf);
260 else if (!strcmp(
"ULong64_t", name))
261 line.Form(
"%llu", *(ULong64_t *)buf);
262 else if (!strcmp(
"long long", name))
263 line.Form(
"%lld", *(Long64_t *)buf);
264 else if (!strcmp(
"Long64_t", name))
265 line.Form(
"%lld", *(Long64_t *)buf);
266 else if (!strcmp(
"unsigned short", name))
267 line.Form(
"%hu", *(
unsigned short *)buf);
268 else if (!strcmp(
"short", name))
269 line.Form(
"%hd", *(
short *)buf);
270 else if (!strcmp(
"bool", name))
271 line.Form(
"%s", *(Bool_t *)buf ?
"true" :
"false");
272 else if (!strcmp(
"unsigned char", name) || !strcmp(
"char", name) ) {
274 }
else if (!strcmp(
"float", name))
275 line.Form(
"%g", *(
float *)buf);
276 else if (!strcmp(
"double", name))
277 line.Form(
"%g", *(
double *)buf);
278 else if (!strcmp(
"char*", name))
279 line.Form(
"%s", *(
char**)buf);
287 Long_t TDataType::Property()
const
289 if (fInfo) (
const_cast<TDataType*
>(
this))->CheckInfo();
296 void TDataType::SetType(
const char *name)
304 }
else if (!strcmp(
"unsigned int", name)) {
306 fSize =
sizeof(UInt_t);
307 }
else if (!strcmp(
"unsigned", name)) {
309 fSize =
sizeof(UInt_t);
310 }
else if (!strcmp(
"int", name)) {
312 fSize =
sizeof(Int_t);
313 }
else if (!strcmp(
"unsigned long", name)) {
315 fSize =
sizeof(ULong_t);
316 }
else if (!strcmp(
"long", name)) {
318 fSize =
sizeof(Long_t);
319 }
else if (!strcmp(
"unsigned long long", name) || !strcmp(
"ULong64_t",name)) {
321 fSize =
sizeof(ULong64_t);
322 }
else if (!strcmp(
"long long", name) || !strcmp(
"Long64_t",name)) {
324 fSize =
sizeof(Long64_t);
325 }
else if (!strcmp(
"unsigned short", name)) {
327 fSize =
sizeof(UShort_t);
328 }
else if (!strcmp(
"short", name)) {
330 fSize =
sizeof(Short_t);
331 }
else if (!strcmp(
"unsigned char", name)) {
333 fSize =
sizeof(UChar_t);
334 }
else if (!strcmp(
"char", name)) {
336 fSize =
sizeof(Char_t);
337 }
else if (!strcmp(
"bool", name)) {
339 fSize =
sizeof(Bool_t);
340 }
else if (!strcmp(
"float", name)) {
342 fSize =
sizeof(Float_t);
343 }
else if (!strcmp(
"double", name)) {
345 fSize =
sizeof(Double_t);
346 }
else if (!strcmp(
"signed char", name)) {
348 fSize =
sizeof(Char_t);
351 if (!strcmp(
"Float16_t", fName.Data())) {
354 if (!strcmp(
"Double32_t", fName.Data())) {
357 if (!strcmp(
"char*",fName.Data())) {
366 Int_t TDataType::Size()
const
368 if (fInfo) (
const_cast<TDataType*
>(
this))->CheckInfo();
375 void TDataType::CheckInfo()
385 R__LOCKGUARD(gInterpreterMutex);
387 if (!gCling->TypedefInfo_IsValid(fInfo) ||
388 strcmp(gCling->TypedefInfo_Name(fInfo),fName.Data())!=0) {
394 gCling->TypedefInfo_Init(fInfo, fName.Data());
396 if (!gCling->TypedefInfo_IsValid(fInfo))
return;
398 SetTitle(gCling->TypedefInfo_Title(fInfo));
399 SetType(gCling->TypedefInfo_TrueName(fInfo));
400 fProperty = gCling->TypedefInfo_Property(fInfo);
401 fSize = gCling->TypedefInfo_Size(fInfo);
408 void TDataType::AddBuiltins(TCollection* types)
410 if (fgBuiltins[kChar_t] == 0) {
412 fgBuiltins[kChar_t] =
new TDataType(
"char");
413 fgBuiltins[kUChar_t] =
new TDataType(
"unsigned char");
414 fgBuiltins[kShort_t] =
new TDataType(
"short");
415 fgBuiltins[kUShort_t] =
new TDataType(
"unsigned short");
416 fgBuiltins[kInt_t] =
new TDataType(
"int");
417 fgBuiltins[kUInt_t] =
new TDataType(
"unsigned int");
418 fgBuiltins[kLong_t] =
new TDataType(
"long");
419 fgBuiltins[kULong_t] =
new TDataType(
"unsigned long");
420 fgBuiltins[kLong64_t] =
new TDataType(
"long long");
421 fgBuiltins[kULong64_t] =
new TDataType(
"unsigned long long");
422 fgBuiltins[kFloat_t] =
new TDataType(
"float");
423 fgBuiltins[kDouble_t] =
new TDataType(
"double");
424 fgBuiltins[kVoid_t] =
new TDataType(
"void");
425 fgBuiltins[kBool_t] =
new TDataType(
"bool");
426 fgBuiltins[kCharStar] =
new TDataType(
"char*");
428 fgBuiltins[kDataTypeAliasUnsigned_t] =
new TDataType(
"unsigned");
429 fgBuiltins[kDataTypeAliasSignedChar_t] =
new TDataType(
"signed char");
432 for (Int_t i = 0; i < (Int_t)kNumDataTypes; ++i) {
433 if (fgBuiltins[i]) types->Add(fgBuiltins[i]);
440 TDataType* TDataType::GetDataType(EDataType type)
442 if (type == kOther_t)
return 0;
443 return fgBuiltins[(int)type];