138#include <nlohmann/json.hpp>
165 Bool_t usearraylen = (arraylen > (isloop ? 0 : 1));
167 if (usearrayindx && (arraylen > 0)) {
172 ::Error(
"TArrayIndexProducer",
"Problem with JSON coding of element %s type %d", elem->
GetName(),
180 for (
int dim = 0; dim < elem->
GetArrayDim(); dim++)
183 }
else if (usearraylen) {
191 fIndicies.Set(fMaxIndex.GetSize());
207 for (
int dim = 0; dim < member->
GetArrayDim(); dim++) {
282 while ((cnt >= 0) && (cnt <
fIndicies.GetSize())) {
296 nlohmann::json *
ExtractNode(nlohmann::json *topnode,
bool next =
true)
300 nlohmann::json *subnode = &((*((nlohmann::json *)topnode))[
fIndicies[0]]);
301 for (
int k = 1; k <
fIndicies.GetSize(); ++k)
324 return &(prnt->at(
fIndx++));
327 nlohmann::json *
json = &(prnt->at(
fIndx));
362 std::unique_ptr<TArrayIndexProducer>
fIndx;
404 if (map_convert_type) {
405 if (!
json->is_object())
return -1;
408 for (
auto it =
json->begin(); it !=
json->end(); ++it) {
409 if ((strlen(map_convert_type)==0) || (it.key().compare(map_convert_type) != 0)) sz++;
415 if (
json->is_array())
419 if (
json->is_object() && (
json->count(
"$arr") == 1))
420 return json->at(
"len").get<
int>();
427 auto res = std::stoi(
fValues.back());
438 auto indx = std::make_unique<TArrayIndexProducer>(
fElem, -1,
"");
441 if (!indx->IsArray() || (indx->NumDimensions() < 2))
451 fStlRead = std::make_unique<StlRead>();
453 if (map_convert == 2) {
454 if (!
fNode->is_object()) {
455 ::Error(
"TJSONStackObj::AssignStl",
"when reading %s expecting JSON object", cl->
GetName());
459 fStlRead->fTypeTag = typename_tag && (strlen(typename_tag) > 0) ? typename_tag :
nullptr;
461 if (!
fNode->is_array() && !(
fNode->is_object() && (
fNode->count(
"$arr") == 1))) {
462 ::Error(
"TJSONStackObj::AssignStl",
"when reading %s expecting JSON array", cl->
GetName());
494 char *loc = setlocale(LC_NUMERIC,
nullptr);
495 if (loc && (strcmp(loc,
"C") != 0)) {
497 setlocale(LC_NUMERIC,
"C");
536 TClass *clActual =
nullptr;
537 void *ptr = (
void *)obj;
559 int srcsize = (
int) strlen(
json);
561 buf.resize(srcsize + 500);
563 int tgtsize = buf.length();
680 ::Error(
"TBufferJSON::ConvertToJSON",
"Unknown class (probably missing dictionary).");
684 const void *actualStart = obj;
685 if (clActual && (clActual != cl)) {
690 clActual =
const_cast<TClass *
>(cl);
693 if (member_name && actualStart) {
698 while ((rdata =
dynamic_cast<TRealData *
>(iter())) !=
nullptr) {
700 if (member && strcmp(member->
GetName(), member_name) == 0)
712 arraylen = *((
int *)((
char *)actualStart + idata->
GetThisOffset()));
718 ptr = *((
char **)ptr);
755 Error(
"StoreObject",
"Can not store object into TBuffer for reading");
811 const char *objbuf =
json.Data();
814 unsigned long objcrc = R__crc32(0,
nullptr, 0);
815 objcrc = R__crc32(objcrc, (
const unsigned char *)objbuf, objlen);
818 Int_t buflen = 10 + objlen + 8;
822 char *buffer = (
char *)
malloc(buflen);
826 char *bufcur = buffer;
842 memcpy(dummy, bufcur - 6, 6);
845 unsigned long ziplen = R__memcompress(bufcur - 6, objlen + 6, (
char *)objbuf, objlen);
847 memcpy(bufcur - 6, dummy, 6);
849 bufcur += (ziplen - 6);
851 *bufcur++ = objcrc & 0xff;
852 *bufcur++ = (objcrc >> 8) & 0xff;
853 *bufcur++ = (objcrc >> 16) & 0xff;
854 *bufcur++ = (objcrc >> 24) & 0xff;
856 *bufcur++ = objlen & 0xff;
857 *bufcur++ = (objlen >> 8) & 0xff;
858 *bufcur++ = (objlen >> 16) & 0xff;
859 *bufcur++ = (objlen >> 24) & 0xff;
861 ofs.write(buffer, bufcur - buffer);
870 return json.Length();
891 const char *objbuf =
json.Data();
894 unsigned long objcrc = R__crc32(0,
nullptr, 0);
895 objcrc = R__crc32(objcrc, (
const unsigned char *)objbuf, objlen);
898 Int_t buflen = 10 + objlen + 8;
902 char *buffer = (
char *)
malloc(buflen);
906 char *bufcur = buffer;
922 memcpy(dummy, bufcur - 6, 6);
925 unsigned long ziplen = R__memcompress(bufcur - 6, objlen + 6, (
char *)objbuf, objlen);
927 memcpy(bufcur - 6, dummy, 6);
929 bufcur += (ziplen - 6);
931 *bufcur++ = objcrc & 0xff;
932 *bufcur++ = (objcrc >> 8) & 0xff;
933 *bufcur++ = (objcrc >> 16) & 0xff;
934 *bufcur++ = (objcrc >> 24) & 0xff;
936 *bufcur++ = objlen & 0xff;
937 *bufcur++ = (objlen >> 8) & 0xff;
938 *bufcur++ = (objlen >> 16) & 0xff;
939 *bufcur++ = (objlen >> 24) & 0xff;
941 ofs.write(buffer, bufcur - buffer);
950 return json.Length();
972 return (
TObject *)(((
char *)obj) + delta);
997 nlohmann::json docu = nlohmann::json::parse(json_str);
999 if (docu.is_null() || (!docu.is_object() && !docu.is_array()))
1002 TClass *objClass =
nullptr;
1028 TClass *resClass =
const_cast<TClass *
>(expectedClass);
1032 if (!res || !resClass)
1035 if (resClass == expectedClass)
1040 ::Error(
"TBufferJSON::ConvertFromJSONChecked",
"expected class %s is not base for read class %s",
1046 return (
char *)res -
offset;
1071 return (tid ==
kCharStar) ?
"\"\"" :
"null";
1086 char *ppp = (
char *)ptr;
1132 ppp += shift * unitSize;
1134 }
while (!indx.
IsDone());
1145 memberClass->
Streamer((
void *)ptr, *
this);
1154 if (arr && (arr->
GetSize() > 0)) {
1157 if (
Stack()->fValues.size() > 1) {
1158 Warning(
"TBufferJSON",
"When streaming TArray, more than 1 object in the stack, use second item");
1163 }
else if (memberClass && !strcmp(memberClass->
GetName(),
"string")) {
1165 memberClass->
Streamer((
void *)ptr, *
this);
1172 if (!memberClass || (member->
GetArrayDim() > 0) || (arraylen > 0))
1173 return "<not supported>";
1184 next->fLevel = inclevel;
1186 next->fNode = (nlohmann::json *)readnode;
1187 }
else if (
fStack.size() > 0) {
1188 auto prev =
Stack();
1189 next->fLevel += prev->fLevel;
1190 next->fMemberPtr = prev->fMemberPtr;
1192 fStack.emplace_back(next);
1204 return fStack.size() > 0 ?
fStack.back().get() :
nullptr;
1219 if (strlen(line1) > 0) {
1221 if (
Stack()->fLevel > 0)
1237 stack->fMemberPtr = &stack->fMemberCnt;
1256 stack->fMemberCnt = 0;
1268 const char *elem_name =
nullptr;
1271 switch (special_kind) {
1273 if (base_class)
return;
1275 if (strcmp(elem_name,
"fLineStyle") == 0)
1276 if ((strcmp(elem->
GetTypeName(),
"TString") == 0) && (strcmp(elem->
GetFullName(),
"fLineStyle[30]") == 0)) {
1278 if (st1->IsStreamerInfo() && st1->fInfo && (strcmp(st1->fInfo->GetName(),
"TStyle") == 0))
1279 elem_name =
"fLineStyles";
1306 if (
json->count(elem_name) != 1) {
1307 Error(
"JsonStartElement",
"Missing JSON structure for element %s", elem_name);
1314 Error(
"JsonStartElement",
"Missing array when reading TArray class for element %s", elem->
GetName());
1316 if ((
gDebug > 1) && base_class)
1317 Info(
"JsonStartElement",
"Reading baseclass %s from element %s", base_class->
GetName(), elem_name);
1366 if (isstd && !strcmp(cl->
GetName(),
"string"))
1383 Info(
"JsonWriteObject",
"Object %p class %s check_map %s", obj, cl ? cl->
GetName() :
"null",
1384 check_map ?
"true" :
"false");
1388 TString fObjectOutput, *fPrevOutput{
nullptr};
1401 }
else if ((special_kind <= 0) || (special_kind >
json_TArray)) {
1414 Error(
"JsonWriteObject",
"Cannot stream class %s without dictionary", cl->
GetName());
1425 if (special_kind <= 0) {
1443 }
else if (map_convert == 2) {
1449 fValue.Form(
"{\"$ref\":%u}", (
unsigned)(refid - 1));
1471 Info(
"JsonWriteObject",
"Starting object %p write for class: %s", obj, cl->
GetName());
1478 (
const_cast<TClass *
>(cl))->Streamer((
void *)obj, *
this);
1481 Info(
"JsonWriteObject",
"Done object %p write for class: %s", obj, cl->
GetName());
1484 if (stack->
fValues.size() != 1)
1485 Error(
"JsonWriteObject",
"Problem when writing array");
1488 if (stack->
fValues.size() > 2)
1489 Error(
"JsonWriteObject",
"Problem when writing TString or std::string");
1493 }
else if ((special_kind > 0) && (special_kind <
ROOT::kSTLend)) {
1496 if (map_convert == 2) {
1502 const char *separ = (
fCompact < 2) ?
", " :
",";
1503 const char *semi = (
fCompact < 2) ?
": " :
":";
1527 }
else if (stack->
fValues.empty()) {
1530 Error(
"JsonWriteObject",
"With empty stack fValue!=0");
1536 bool trivial_format =
false;
1541 TClass *value_class = proxy ? proxy->GetValueClass() :
nullptr;
1543 trivial_format =
false;
1545 trivial_format =
true;
1548 if (trivial_format) {
1551 if (
fValue.Length() == 0) {
1552 Error(
"JsonWriteObject",
"Empty value when it should contain something");
1557 const char *separ =
"[";
1562 if ((
size * 2 == (
int) stack->
fValues.size() - 1) && (map_convert > 0)) {
1566 if (pairtype.
Index(
"unordered_map<") == 0)
1567 pairtype.
Replace(0, 14,
"pair<");
1568 else if (pairtype.
Index(
"unordered_multimap<") == 0)
1569 pairtype.
Replace(0, 19,
"pair<");
1570 else if (pairtype.
Index(
"multimap<") == 0)
1571 pairtype.
Replace(0, 9,
"pair<");
1572 else if (pairtype.
Index(
"map<") == 0)
1573 pairtype.
Replace(0, 4,
"pair<");
1585 fValue.Append(
"\"$pair\"");
1589 fValue.Append(
"\"first\"");
1593 fValue.Append(
"\"second\"");
1616 if ((special_kind == 0) && (!stack->
fValues.empty() || (
fValue.Length() > 0))) {
1618 Info(
"JsonWriteObject",
"Create blob value for class %s", cl->
GetName());
1623 const char *separ =
"[";
1625 for (
auto &elem: stack->
fValues) {
1631 if (
fValue.Length() > 0) {
1644 if ((special_kind <= 0))
1652 if ((special_kind <= 0) || (special_kind >
json_TArray))
1654 else if (fObjectOutput.
Length() != 0)
1655 Error(
"JsonWriteObject",
"Non-empty object output for special class %s", cl->
GetName());
1675 auto map =
dynamic_cast<TMap *
>(col);
1676 auto lst =
dynamic_cast<TList *
>(col);
1686 auto lnk = lst->FirstLink();
1697 sopt.
Append(lnk->GetAddOption());
1708 while (
auto obj = iter()) {
1729 while (
auto obj = iter()) {
1758 TList *lst =
nullptr;
1762 lst =
dynamic_cast<TList *
>(col);
1764 map =
dynamic_cast<TMap *
>(col);
1770 std::string
name =
json->at(
"name");
1773 nlohmann::json &arr =
json->at(
"arr");
1774 int size = arr.size();
1776 for (
int n = 0;
n <
size; ++
n) {
1777 nlohmann::json *subelem = &arr.at(
n);
1780 subelem = &subelem->at(
"first");
1784 TClass *readClass =
nullptr, *objClass =
nullptr;
1785 void *subobj =
nullptr;
1793 Error(
"JsonReadCollection",
1794 "Cannot detect class name for TClonesArray - typename tag not configured");
1798 Error(
"JsonReadCollection",
"TClonesArray size %d smaller than required %d", clones->
GetSize(),
size);
1813 if (!subobj || !readClass) {
1816 Error(
"JsonReadCollection",
"Try to add object %s not derived from TObject", readClass->
GetName());
1825 readClass =
nullptr;
1830 if (!subobj2 || !readClass) {
1833 Error(
"JsonReadCollection",
"Try to add object %s not derived from TObject", readClass->
GetName());
1837 map->Add(tobj,
static_cast<TObject *
>(subobj2));
1839 auto &elem =
json->at(
"opt").at(
n);
1843 lst->
Add(tobj, elem.get<std::string>().c_str());
1857 *readClass =
nullptr;
1865 if (
json->is_null())
1871 if (
json->is_object() && (
json->size() == 1) && (
json->find(
"$ref") !=
json->end())) {
1872 unsigned refid =
json->at(
"$ref").get<
unsigned>();
1874 void *ref_obj =
nullptr;
1875 TClass *ref_cl =
nullptr;
1879 if (!ref_obj || !ref_cl) {
1880 Error(
"JsonReadObject",
"Fail to find object for reference %u", refid);
1885 *readClass = ref_cl;
1888 Info(
"JsonReadObject",
"Extract object reference %u %p cl:%s expects:%s", refid, ref_obj, ref_cl->
GetName(),
1889 (objClass ? objClass->
GetName() :
"---"));
1897 obj = objClass->
New();
1900 Info(
"JsonReadObject",
"Read string from %s",
json->dump().c_str());
1903 *((std::string *)obj) =
json->get<std::string>();
1905 *((
TString *)obj) =
json->get<std::string>().c_str();
1908 *readClass =
const_cast<TClass *
>(objClass);
1915 if (isBase && (!obj || !objClass)) {
1916 Error(
"JsonReadObject",
"No object when reading base class");
1920 Int_t map_convert = 0;
1923 map_convert =
json->is_object() ? 2 : 1;
1926 Error(
"JsonReadObject",
"Cannot stream class %s without dictionary", objClass->
GetName());
1936 TClass *jsonClass =
nullptr;
1937 Int_t jsonClassVersion = 0;
1941 jsonClass =
const_cast<TClass *
>(objClass);
1944 obj = jsonClass->
New();
1951 Error(
"JsonReadObject",
"Not array when expecting such %s",
json->dump().c_str());
1954 Info(
"JsonReadObject",
"Reading special kind %d %s ptr %p", special_kind, objClass->
GetName(), obj);
1956 }
else if (isBase) {
1959 jsonClass =
const_cast<TClass *
>(objClass);
1962 Info(
"JsonReadObject",
"Reading baseclass %s ptr %p", objClass->
GetName(), obj);
1969 Error(
"JsonReadObject",
"Cannot find class %s", clname.c_str());
1972 jsonClass =
const_cast<TClass *
>(objClass);
1984 if (objClass && (jsonClass != objClass)) {
1987 Error(
"JsonReadObject",
"Not possible to read %s and casting to %s pointer as the two classes are unrelated",
1990 Error(
"JsonReadObject",
"Reading %s and casting to %s pointer is currently not supported",
1999 obj = jsonClass->
New();
2002 Info(
"JsonReadObject",
"Reading object of class %s refid %u ptr %p", jsonClass->
GetName(),
fJsonrCnt, obj);
2036 Info(
"JsonReadObject",
"Calling streamer of class %s", jsonClass->
GetName());
2038 if (isBase && (special_kind == 0))
2039 Error(
"JsonReadObject",
"Should not be used for reading of base class %s", jsonClass->
GetName());
2042 jsonClass->
Streamer((
void *)obj, *
this);
2054 Info(
"JsonReadObject",
"Reading object of class %s done", jsonClass->
GetName());
2057 *readClass = jsonClass;
2068 nlohmann::json *
json = node ? (nlohmann::json *)node :
Stack()->
fNode;
2070 UInt_t uid =
json->at(
"fUniqueID").get<
unsigned>();
2071 UInt_t bits =
json->at(
"fBits").get<
unsigned>();
2079 if (tobj_fbits_offset > 0) {
2080 UInt_t *fbits = (
UInt_t *) ((
char* ) tobj + tobj_fbits_offset);
2111 Info(
"WorkWithClass",
"Class: %s", cl->
GetName());
2130 stack->
fInfo = sinfo;
2149 Info(
"DecrementLevel",
" Perform post-processing elem: %s", stack->
fElem->
GetName());
2158 Error(
"DecrementLevel",
" Mismatch of streamer info");
2163 Info(
"DecrementLevel",
"Class: %s done", (info ? info->
GetClass()->
GetName() :
"custom"));
2182 Info(
"SetStreamerElementNumber",
"Element name %s", elem->
GetName());
2196 Error(
"WorkWithElement",
"stack is empty");
2201 Info(
"WorkWithElement",
" Start element %s type %d typename %s", elem ? elem->
GetName() :
"---",
2209 Info(
"WorkWithElement",
" Perform post-processing elem: %s", stack->
fElem->
GetName());
2219 Error(
"WorkWithElement",
"Lost of stack");
2225 Error(
"WorkWithElement",
"Problem in Inc/Dec level");
2232 Error(
"WorkWithElement",
"streamer info returns elem = nullptr");
2239 stack->
fElem = elem;
2249 stack->
fIndx = std::make_unique<TArrayIndexProducer>(elem, -1,
fArraySepar.Data());
2327 if (!
name || (strlen(
name) == 0)) {
2328 Error(
"ClassMember",
"Invalid member name");
2336 if (strcmp(typeName,
"raw:data") == 0)
2346 if (strcmp(
name, typeName) == 0) {
2354 if (tname[tname.
Length() - 1] ==
'*') {
2360 Error(
"ClassMember",
"Invalid class specifier %s", typeName);
2384 }
else if ((typ_id > 0) && (typ_id < 20)) {
2400 Error(
"ClassMember",
"Invalid combination name = %s type = %s",
name, typeName);
2425 if (!elem && !obj_cl)
2452 isTArray = (strncmp(
"TArray", typname, 6) == 0);
2455 if (isTString || isSTLstring) {
2459 Info(
"PerformPostProcessing",
"reformat string value = '%s'",
fValue.Data());
2462 }
else if (isOffsetPArray) {
2467 }
else if ((stack->
fValues.size() == 1) && (stack->
fValues[0] ==
"1")) {
2470 Error(
"PerformPostProcessing",
"Wrong values for kOffsetP element %s", (elem ? elem->
GetName() :
"---"));
2474 }
else if (isTObject || isTRef) {
2483 if (cnt < 2 || cnt > 3) {
2485 Error(
"PerformPostProcessing",
"When storing TObject/TRef, strange number of items %d", cnt);
2494 auto tbits = std::atol((stack->
fValues.size() > 1) ? stack->
fValues[1].c_str() :
fValue.Data());
2507 }
else if (isTArray) {
2512 if (elem && elem->
IsBase() && (
fValue.Length() == 0)) {
2517 if (!stack->
fValues.empty()) {
2520 for (
auto &blob: stack->
fValues) {
2526 if (
fValue.Length() == 0) {
2562 if (!cl &&
Stack()->fClVersion) {
2568 Info(
"ReadVersion",
"Result: %d Class: %s", res, (cl ? cl->
GetName() :
"---"));
2587 Info(
"ReadObjectAny",
"From current JSON node");
2603 Info(
"WriteObjectClass",
"Class %s", (actualClass ? actualClass->
GetName() :
" null"));
2724template <
typename T>
2727 Info(
"ReadArray",
"Not implemented");
2728 return value ? 1 : 0;
2838template <
typename T>
2841 if (!arr || (arrsize <= 0))
2845 Info(
"ReadFastArray",
"Reading array sz %d from JSON %s", arrsize,
json->dump().substr(0, 30).c_str());
2848 TArrayI &indx = indexes->GetIndices();
2850 if (indexes->TotalLength() != arrsize)
2851 Error(
"ReadFastArray",
"Mismatch %d-dim array sizes %d %d", lastdim + 1, arrsize, (
int)indexes->TotalLength());
2852 for (
int cnt = 0; cnt < arrsize; ++cnt) {
2853 nlohmann::json *elem = &(
json->at(indx[0]));
2854 for (
int k = 1; k < lastdim; ++k)
2855 elem = &((*elem)[indx[k]]);
2856 arr[cnt] = (asstring && elem->is_string()) ? elem->get<std::string>()[indx[lastdim]] : (*elem)[indx[lastdim]].get<T>();
2857 indexes->NextSeparator();
2859 }
else if (asstring &&
json->is_string()) {
2860 std::string str =
json->get<std::string>();
2861 for (
int cnt = 0; cnt < arrsize; ++cnt)
2862 arr[cnt] = (cnt < (
int)str.length()) ? str[cnt] : 0;
2863 }
else if (
json->is_object() && (
json->count(
"$arr") == 1)) {
2864 if (
json->at(
"len").get<
int>() != arrsize)
2865 Error(
"ReadFastArray",
"Mismatch compressed array size %d %d", arrsize,
json->at(
"len").get<
int>());
2867 for (
int cnt = 0; cnt < arrsize; ++cnt)
2870 if (
json->count(
"b") == 1) {
2871 auto base64 =
json->at(
"b").get<std::string>();
2873 int offset = (
json->count(
"o") == 1) ?
json->at(
"o").get<
int>() : 0;
2878 if (arrsize * (
long)
sizeof(T) < (
offset + decode.Length())) {
2879 Error(
"ReadFastArray",
"Base64 data %ld larger than target array size %ld", (
long) decode.Length() +
offset, (
long) (arrsize*
sizeof(T)));
2880 }
else if ((
sizeof(T) > 1) && (decode.Length() %
sizeof(T) != 0)) {
2881 Error(
"ReadFastArray",
"Base64 data size %ld not matches with element size %ld", (
long) decode.Length(), (
long)
sizeof(T));
2883 memcpy((
char *) arr +
offset, decode.Data(), decode.Length());
2889 std::string
idname =
"", pname, vname, nname;
2890 while (p < arrsize) {
2891 pname = std::string(
"p") +
idname;
2892 if (
json->count(pname) == 1)
2893 p =
json->at(pname).get<
int>();
2894 vname = std::string(
"v") +
idname;
2895 if (
json->count(vname) != 1)
2897 nlohmann::json &
v =
json->at(vname);
2899 for (
unsigned sub = 0; sub <
v.size(); ++sub)
2900 arr[p++] =
v[sub].get<T>();
2902 nname = std::string(
"n") +
idname;
2903 unsigned ncopy = (
json->count(nname) == 1) ?
json->at(nname).get<
unsigned>() : 1;
2904 for (
unsigned sub = 0; sub < ncopy; ++sub)
2905 arr[p++] =
v.get<T>();
2907 idname = std::to_string(++
id);
2910 if ((
int)
json->size() != arrsize)
2911 Error(
"ReadFastArray",
"Mismatch array sizes %d %d", arrsize, (
int)
json->size());
2912 for (
int cnt = 0; cnt < arrsize; ++cnt)
2913 arr[cnt] =
json->at(cnt).get<T>();
3039 Info(
"ReadFastArray",
"void* n:%d cl:%s",
n, cl->
GetName());
3048 int objectSize = cl->
Size();
3049 char *obj = (
char *)start;
3052 nlohmann::json *topnode = stack->
fNode, *subnode = topnode;
3054 subnode = stack->
fIndx->ExtractNode(topnode);
3061 for (
Int_t j = 0; j <
n; j++, obj += objectSize) {
3069 stack->
fNode = topnode;
3079 Info(
"ReadFastArray",
"void** n:%d cl:%s prealloc:%s",
n, cl->
GetName(), (isPreAlloc ?
"true" :
"false"));
3095 nlohmann::json *topnode = stack->
fNode, *subnode = topnode;
3097 subnode = stack->
fIndx->ExtractNode(topnode);
3101 for (
Int_t j = 0; j <
n; j++) {
3106 void *old = start[j];
3112 start[j] = (
const_cast<TClass *
>(cl))->New();
3117 stack->
fNode = topnode;
3120template <
typename T>
3125 if (!is_base64 && ((
fArrayCompact == 0) || (arrsize < 6))) {
3127 for (
Int_t indx = 0; indx < arrsize; indx++) {
3133 }
else if (is_base64 && !arrsize) {
3138 Int_t aindx(0), bindx(arrsize);
3139 while ((aindx < arrsize) && (vname[aindx] == 0))
3141 while ((aindx < bindx) && (vname[bindx - 1] == 0))
3146 if ((aindx *
sizeof(T) < 5) && (aindx < bindx))
3149 if ((aindx > 0) && (aindx < bindx))
3153 fValue.Append(
"\"b\":\"");
3159 }
else if (aindx < bindx) {
3161 Int_t p(aindx), suffixcnt(-1), lastp(0);
3163 if (vname[p] == 0) {
3167 Int_t p0(p++), pp(0), nsame(1);
3173 for (; p <= bindx; ++p) {
3174 if ((p < bindx) && (vname[p] == vname[p - 1])) {
3178 if (vname[p - 1] == 0) {
3183 }
else if (nsame > 5) {
3196 if (++suffixcnt > 0)
3197 suffix.
Form(
"%d", suffixcnt);
3202 if ((nsame > 1) || (pp - p0 == 1)) {
3208 for (
Int_t indx = p0; indx < pp; indx++) {
3344template <
typename T>
3353 const Int_t maxElements = std::numeric_limits<Int_t>::max();
3354 if (arrsize > maxElements) {
3355 Fatal(
"JsonWriteFastArray",
"Array larger than 2^31 elements cannot be stored in JSON");
3373 if (++cnt == indexes.
GetSize()) {
3374 (*this.*method)((arr + shift),
len, typname);
3380 (*this.*method)(arr, arrsize, typname);
3401 Bool_t need_blob =
false;
3406 }
else if (has_zero || !isprint(
c[i])) {
3412 if (need_blob && (
n >= 1000) && (!
Stack()->fElem || (
Stack()->fElem->GetArrayDim() < 2)))
3520 Info(
"WriteFastArray",
"void *start cl:%s n:%lld", cl ? cl->
GetName() :
"---",
n);
3534 char *obj = (
char *)start;
3574 Info(
"WriteFastArray",
"void **startp cl:%s n:%lld", cl->
GetName(),
n);
3603 start[j] = (
const_cast<TClass *
>(cl))->New();
3629 Info(
"StreamObject",
"Class: %s", (cl ? cl->
GetName() :
"none"));
3640template <
typename T>
3659 if (!
Stack()->fValues.empty())
3694 if (!
Stack()->fValues.empty())
3746 if (
json->is_null())
3747 val = std::numeric_limits<Float_t>::quiet_NaN();
3751 }
catch (nlohmann::detail::type_error &
e) {
3752 auto aux =
json->get<std::string>();
3753 if (aux ==
"nanf") {
3754 val = std::numeric_limits<Float_t>::quiet_NaN();
3755 }
else if (aux ==
"inff") {
3756 val = std::numeric_limits<Float_t>::infinity();
3757 }
else if (aux ==
"-inff") {
3758 val = -std::numeric_limits<Float_t>::infinity();
3760 Error(
"ReadFloat",
"%s '%s'",
e.what(), aux.c_str());
3761 val = std::numeric_limits<Float_t>::quiet_NaN();
3772 if (
json->is_null())
3773 val = std::numeric_limits<Double_t>::quiet_NaN();
3777 }
catch (nlohmann::detail::type_error &
e) {
3778 auto aux =
json->get<std::string>();
3780 val = std::numeric_limits<Double_t>::quiet_NaN();
3781 }
else if (aux ==
"inf") {
3782 val = std::numeric_limits<Double_t>::infinity();
3783 }
else if (aux ==
"-inf") {
3784 val = -std::numeric_limits<Double_t>::infinity();
3786 Error(
"ReadDouble",
"%s '%s'",
e.what(), aux.c_str());
3787 val = std::numeric_limits<Double_t>::quiet_NaN();
3797 Error(
"ReadCharP",
"Not implemented");
3831 std::size_t nch = str.length();
3833 s =
new char[nch + 1];
3834 memcpy(s, str.c_str(), nch);
4052 if (std::isinf(
value)) {
4056 fValue.Append((
value < 0.) ?
"\"-inff\"" :
"\"inff\"");
4057 }
else if (std::isnan(
value)) {
4061 fValue.Append(
"\"nanf\"");
4074 if (std::isinf(
value)) {
4078 fValue.Append((
value < 0.) ?
"\"-inf\"" :
"\"inf\"");
4079 }
else if (std::isnan(
value)) {
4083 fValue.Append(
"\"nan\"");
4166 case 0:
n =
len;
break;
4167 case '\n':
fValue.Append(
"\\n");
break;
4168 case '\t':
fValue.Append(
"\\t");
break;
4169 case '\"':
fValue.Append(
"\\\"");
break;
4170 case '\\':
fValue.Append(
"\\\\");
break;
4171 case '\b':
fValue.Append(
"\\b");
break;
4172 case '\f':
fValue.Append(
"\\f");
break;
4173 case '\r':
fValue.Append(
"\\r");
break;
4174 case '/':
fValue.Append(
"\\/");
break;
4178 }
else if (
c < 0x80) {
4180 }
else if ((
n <
len - 1) && ((
c & 0xe0) == 0xc0) && ((
value[
n+1] & 0xc0) == 0x80)) {
4181 unsigned code = ((unsigned)
value[
n+1] & 0x3f) | (((
unsigned)
c & 0x1f) << 6);
4184 }
else if ((
n <
len - 2) && ((
c & 0xf0) == 0xe0) && ((
value[
n+1] & 0xc0) == 0x80) && ((
value[
n+2] & 0xc0) == 0x80)) {
4185 unsigned code = ((unsigned)
value[
n+2] & 0x3f) | (((
unsigned)
value[
n+1] & 0x3f) << 6) | (((unsigned)
c & 0x0f) << 12);
4188 }
else if ((
n <
len - 3) && ((
c & 0xf8) == 0xf0) && ((
value[
n+1] & 0xc0) == 0x80) && ((
value[
n+2] & 0xc0) == 0x80) && ((
value[
n+3] & 0xc0) == 0x80)) {
4189 unsigned code = ((unsigned)
value[
n+3] & 0x3f) | (((
unsigned)
value[
n+2] & 0x3f) << 6) | (((unsigned)
value[
n+1] & 0x3f) << 12) | (((
unsigned)
c & 0x07) << 18);
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
bool Bool_t
Boolean (0=false, 1=true) (bool)
unsigned short UShort_t
Unsigned Short integer 2 bytes (unsigned short)
int Int_t
Signed integer 4 bytes (int)
long Longptr_t
Integer large enough to hold a pointer (platform-dependent)
short Version_t
Class version identifier (short)
unsigned char UChar_t
Unsigned Character 1 byte (unsigned char)
char Char_t
Character 1 byte (char)
unsigned long ULong_t
Unsigned long integer 4 bytes (unsigned long). Size depends on architecture.
long Long_t
Signed long integer 4 bytes (long). Size depends on architecture.
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int)
float Float_t
Float 4 bytes (float)
short Short_t
Signed Short integer 2 bytes (short)
double Double_t
Double 8 bytes.
long long Long64_t
Portable signed long integer 8 bytes.
unsigned long long ULong64_t
Portable unsigned long integer 8 bytes.
if(isa< VarDecl >(D)||isa< FieldDecl >(D)||isa< EnumConstantDecl >(D))
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h offset
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
Option_t Option_t TPoint TPoint const char mode
Array of integers (32 bits per element).
JSON array separators for multi-dimensional JSON arrays It fully reproduces array dimensions as in or...
TArrayI & GetIndices()
return array with current index
nlohmann::json * ExtractNode(nlohmann::json *topnode, bool next=true)
Int_t NumDimensions() const
returns number of array dimensions
Int_t TotalLength() const
returns total number of elements in array
TArrayIndexProducer(TDataMember *member, Int_t extradim, const char *separ)
const char * NextSeparator()
increment indexes and returns intermediate or last separator
TArrayIndexProducer(TStreamerElement *elem, Int_t arraylen, const char *separ)
Abstract array base class.
virtual void Streamer(TBuffer &)
static TString Decode(const char *data)
Decode a base64 string date into a generic TString.
static TString Encode(const char *data)
Transform data into a null terminated base64 string.
void InitMap() override
Create the fMap container and initialize them with the null object.
void MapObject(const TObject *obj, UInt_t offset=1) override
Add object to the fMap container.
Long64_t GetObjectTag(const void *obj)
Returns tag for specified object from objects map (if exists) Returns 0 if object not included into o...
void GetMappedObject(UInt_t tag, void *&ptr, TClass *&ClassPtr) const override
Retrieve the object stored in the buffer's object map at 'tag' Set ptr and ClassPtr respectively to t...
Int_t WriteObjectAny(const void *obj, const TClass *ptrClass, Bool_t cacheReuse=kTRUE) override
Write object to I/O buffer.
void ReadULong(ULong_t &l) final
Reads ULong_t value from buffer.
void JsonWriteBasic(Char_t value)
converts Char_t to string and add to json value buffer
void WriteShort(Short_t s) final
Writes Short_t value to buffer.
void JsonWriteCollection(TCollection *obj, const TClass *objClass)
store content of ROOT collection
TString fSemicolon
! depending from compression level, " : " or ":"
Int_t fCompact
! 0 - no any compression, 1 - no spaces in the begin, 2 - no new lines, 3 - no spaces at all
void ReadULong64(ULong64_t &l) final
Reads ULong64_t value from buffer.
void WriteStdString(const std::string *s) final
Writes a std::string.
void JsonWriteFastArray(const T *arr, Long64_t arrsize, const char *typname, void(TBufferJSON::*method)(const T *, Int_t, const char *))
Template method to write array of arbitrary dimensions Different methods can be used for store last a...
void * ReadObjectAny(const TClass *clCast) final
Read object from buffer. Only used from TBuffer.
static TObject * ConvertFromJSON(const char *str)
Read TObject-based class from JSON, produced by ConvertToJSON() method.
void ClassBegin(const TClass *, Version_t=-1) final
Should be called in the beginning of custom class streamer.
Int_t JsonReadArray(T *value)
Read static array from JSON - not used.
void IncrementLevel(TVirtualStreamerInfo *) final
Function is called from TStreamerInfo WriteBuffer and ReadBuffer functions and indent new level in js...
void WriteLong(Long_t l) final
Writes Long_t value to buffer.
TString fValue
! buffer for current value
void WriteUInt(UInt_t i) final
Writes UInt_t value to buffer.
void ReadFloat(Float_t &f) final
Reads Float_t value from buffer.
static TString ConvertToJSON(const TObject *obj, Int_t compact=0, const char *member_name=nullptr)
Converts object, inherited from TObject class, to JSON string Lower digit of compact parameter define...
void WriteCharStar(char *s) final
Writes a char*.
void PerformPostProcessing(TJSONStackObj *stack, const TClass *obj_cl=nullptr)
Function is converts TObject and TString structures to more compact representation.
void ReadShort(Short_t &s) final
Reads Short_t value from buffer.
void JsonReadFastArray(T *arr, Int_t arrsize, bool asstring=false)
Template method to read array from the JSON.
TString StoreObject(const void *obj, const TClass *cl)
Store provided object as JSON structure Allows to configure different TBufferJSON properties before c...
std::deque< std::unique_ptr< TJSONStackObj > > fStack
! hierarchy of currently streamed element
void ReadChar(Char_t &c) final
Reads Char_t value from buffer.
static Int_t ExportToFile(const char *filename, const TObject *obj, const char *option=nullptr)
Convert object into JSON and store in text file Returns size of the produce file Used in TObject::Sav...
TString fNumericLocale
! stored value of setlocale(LC_NUMERIC), which should be recovered at the end
void SetTypeversionTag(const char *tag=nullptr)
Configures _typeversion tag in JSON One can specify name of the JSON tag like "_typeversion" or "$tv"...
TString fTypeVersionTag
! JSON member used to store class version, default empty
void ReadCharStar(char *&s) final
Reads a char* string.
UInt_t WriteVersion(const TClass *cl, Bool_t useBcnt=kFALSE) final
Ignored in TBufferJSON.
void ReadUShort(UShort_t &s) final
Reads UShort_t value from buffer.
TJSONStackObj * PushStack(Int_t inclevel=0, void *readnode=nullptr)
add new level to the structures stack
TBufferJSON(TBuffer::EMode mode=TBuffer::kWrite)
Creates buffer object to serialize data into json.
void JsonDisablePostprocessing()
disable post-processing of the code
void WorkWithElement(TStreamerElement *elem, Int_t)
This is call-back from streamer which indicates that class member will be streamed Name of element us...
void ReadCharP(Char_t *c) final
Reads array of characters from buffer.
void ReadUChar(UChar_t &c) final
Reads UChar_t value from buffer.
void WriteUShort(UShort_t s) final
Writes UShort_t value to buffer.
unsigned fJsonrCnt
! counter for all objects, used for referencing
Int_t fArrayCompact
! 0 - no array compression, 1 - exclude leading/trailing zeros, 2 - check value repetition
void ReadFastArray(Bool_t *b, Int_t n) final
read array of Bool_t from buffer
void JsonReadBasic(T &value)
Template function to read basic value from JSON.
void JsonReadCollection(TCollection *obj, const TClass *objClass)
read content of ROOT collection
void JsonPushValue()
If value exists, push in the current stack for post-processing.
@ kStoreInfNaN
explicitly store special float numbers as strings ("inf", "nan")
@ kBase64
all binary arrays will be compressed with base64 coding, supported by JSROOT
@ kSkipTypeInfo
do not store typenames in JSON
@ kNoSpaces
no new lines plus remove all spaces around "," and ":" symbols
@ kMapAsObject
store std::map, std::unordered_map as JSON object
@ kSameSuppression
zero suppression plus compress many similar values together
void WriteULong(ULong_t l) final
Writes ULong_t value to buffer.
void SetTypenameTag(const char *tag="_typename")
Configures _typename tag in JSON structures By default "_typename" field in JSON structures used to s...
TVirtualStreamerInfo * GetInfo() final
Return current streamer info element.
~TBufferJSON() override
destroy buffer
void JsonStartElement(const TStreamerElement *elem, const TClass *base_class)
Start new class member in JSON structures.
void DecrementLevel(TVirtualStreamerInfo *) final
Function is called from TStreamerInfo WriteBuffer and ReadBuffer functions and decrease level in json...
void WriteFloat(Float_t f) final
Writes Float_t value to buffer.
Bool_t IsSkipClassInfo(const TClass *cl) const
Returns true if class info will be skipped from JSON.
void ReadLong(Long_t &l) final
Reads Long_t value from buffer.
void WriteClass(const TClass *cl) final
suppressed function of TBuffer
TClass * ReadClass(const TClass *cl=nullptr, UInt_t *objTag=nullptr) final
suppressed function of TBuffer
static TString zipJSON(const char *json)
zip JSON string and convert into base64 string to be used with JSROOT unzipJSON() function Main appli...
void ClassMember(const char *name, const char *typeName=nullptr, Int_t arrsize1=-1, Int_t arrsize2=-1) final
Method indicates name and typename of class member, which should be now streamed in custom streamer F...
TString * fOutput
! current output buffer for json code
TString fTypeNameTag
! JSON member used for storing class name, when empty - no class name will be stored
static void * ConvertFromJSONAny(const char *str, TClass **cl=nullptr)
Read object from JSON In class pointer (if specified) read class is returned One must specify expecte...
void ReadUInt(UInt_t &i) final
Reads UInt_t value from buffer.
void ReadLong64(Long64_t &l) final
Reads Long64_t value from buffer.
Bool_t fStoreInfNaN
! when true, store inf and nan as string, this is not portable for other JSON readers
Version_t ReadVersion(UInt_t *start=nullptr, UInt_t *bcnt=nullptr, const TClass *cl=nullptr) final
read version value from buffer
static void * ConvertFromJSONChecked(const char *str, const TClass *expectedClass)
Read objects from JSON, one can reuse existing object.
Int_t ReadStaticArray(Bool_t *b) final
Read array of Bool_t from buffer.
void WriteBool(Bool_t b) final
Writes Bool_t value to buffer.
void SetStreamerElementNumber(TStreamerElement *elem, Int_t comp_type) final
Function is called from TStreamerInfo WriteBuffer and ReadBuffer functions and add/verify next elemen...
void WriteDouble(Double_t d) final
Writes Double_t value to buffer.
TString JsonWriteMember(const void *ptr, TDataMember *member, TClass *memberClass, Int_t arraylen)
Convert single data member to JSON structures Note; if data member described by 'member'is pointer,...
void ReadInt(Int_t &i) final
Reads Int_t value from buffer.
std::vector< const TClass * > fSkipClasses
! list of classes, which class info is not stored
void WriteCharP(const Char_t *c) final
Writes array of characters to buffer.
TString fArraySepar
! depending from compression level, ", " or ","
void SetSkipClassInfo(const TClass *cl)
Specify class which typename will not be stored in JSON Several classes can be configured To exclude ...
Int_t ReadArray(Bool_t *&b) final
Read array of Bool_t from buffer.
void WriteFastArray(const Bool_t *b, Long64_t n) final
Write array of Bool_t to buffer.
void AppendOutput(const char *line0, const char *line1=nullptr)
Append two string to the output JSON, normally separate by line break.
TString fOutBuffer
! main output buffer for json code
TJSONStackObj * PopStack()
remove one level from stack
void JsonWriteArrayCompress(const T *vname, Int_t arrsize, const char *typname)
void WriteInt(Int_t i) final
Writes Int_t value to buffer.
void WriteArray(const Bool_t *b, Int_t n) final
Write array of Bool_t to buffer.
void ReadBaseClass(void *start, TStreamerBase *elem) final
Read data of base class.
void ReadFastArrayString(Char_t *c, Int_t n) final
read array of Char_t from buffer
TJSONStackObj * JsonStartObjectWrite(const TClass *obj_class, TStreamerInfo *info=nullptr)
Start object element with typeinfo.
void ReadStdString(std::string *s) final
Reads a std::string.
void ReadDouble(Double_t &d) final
Reads Double_t value from buffer.
void ClassEnd(const TClass *) final
Should be called at the end of custom streamer See TBufferJSON::ClassBegin for more details.
Int_t JsonSpecialClass(const TClass *cl) const
return non-zero value when class has special handling in JSON it is TCollection (-130),...
void SkipObjectAny() final
Skip any kind of object from buffer.
void SetCompact(int level)
Set level of space/newline/array compression Lower digit of compact parameter define formatting rules...
Bool_t fMapAsObject
! when true, std::map will be converted into JSON object
void WriteUChar(UChar_t c) final
Writes UChar_t value to buffer.
void WriteTString(const TString &s) final
Writes a TString.
void JsonWriteConstChar(const char *value, Int_t len=-1, const char *=nullptr)
writes string value, processing all kind of special characters
void * RestoreObject(const char *str, TClass **cl)
Read object from JSON In class pointer (if specified) read class is returned One must specify expecte...
void WriteObjectClass(const void *actualObjStart, const TClass *actualClass, Bool_t cacheReuse) final
Write object to buffer. Only used from TBuffer.
void StreamObject(void *obj, const TClass *cl, const TClass *onFileClass=nullptr) final
stream object to/from buffer
void WriteLong64(Long64_t l) final
Writes Long64_t value to buffer.
void WriteFastArrayString(const Char_t *c, Long64_t n) final
Write array of Char_t to buffer.
void JsonReadTObjectMembers(TObject *obj, void *node=nullptr)
Read TObject data members from JSON.
void WriteULong64(ULong64_t l) final
Writes ULong64_t value to buffer.
void ReadBool(Bool_t &b) final
Reads Bool_t value from buffer.
void WriteChar(Char_t c) final
Writes Char_t value to buffer.
void JsonWriteObject(const void *obj, const TClass *objClass, Bool_t check_map=kTRUE)
Write object to buffer If object was written before, only pointer will be stored If check_map==kFALSE...
void * JsonReadObject(void *obj, const TClass *objClass=nullptr, TClass **readClass=nullptr)
Read object from current JSON node.
void WorkWithClass(TStreamerInfo *info, const TClass *cl=nullptr)
Prepares buffer to stream data of specified class.
void ReadTString(TString &s) final
Reads a TString.
static const char * ConvertFloat(Float_t v, char *buf, unsigned len, Bool_t not_optimize=kFALSE)
convert float to string with configured format
TBufferText()
Default constructor.
static const char * ConvertDouble(Double_t v, char *buf, unsigned len, Bool_t not_optimize=kFALSE)
convert float to string with configured format
virtual void ReadBaseClass(void *start, TStreamerBase *elem)
Read data of base class.
TClass instances represent classes, structs and namespaces in the ROOT type system.
void Streamer(void *obj, TBuffer &b, const TClass *onfile_class=nullptr) const
ROOT::ESTLType GetCollectionType() const
Return the 'type' of the STL the TClass is representing.
void * New(ENewType defConstructor=kClassNew, Bool_t quiet=kFALSE) const
Return a pointer to a newly allocated object of this class.
Bool_t HasDictionary() const
Check whether a class has a dictionary or not.
void Destructor(void *obj, Bool_t dtorOnly=kFALSE)
Explicitly call destructor for object.
Longptr_t GetDataMemberOffset(const char *membername) const
return offset for member name.
TList * GetListOfRealData() const
Int_t Size() const
Return size of object of this class.
Bool_t IsTObject() const
Return kTRUE is the class inherits from TObject.
Int_t GetBaseClassOffset(const TClass *toBase, void *address=nullptr, bool isDerivedObject=true)
TVirtualCollectionProxy * GetCollectionProxy() const
Return the proxy describing the collection (if any).
Version_t GetClassVersion() const
TClass * GetActualClass(const void *object) const
Return a pointer to the real class of the object.
TRealData * GetRealData(const char *name) const
Return pointer to TRealData element with name "name".
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
An array of clone (identical) objects.
TClass * GetClass() const
void SetClass(const char *classname, Int_t size=1000)
see TClonesArray::SetClass(const TClass*)
TObject * ConstructedAt(Int_t idx)
Get an object at index 'idx' that is guaranteed to have been constructed.
Collection abstract base class.
void SetName(const char *name)
const char * GetName() const override
Return name of this collection.
virtual void Add(TObject *obj)=0
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
All ROOT classes may have RTTI (run time type identification) support added.
Int_t GetMaxIndex(Int_t dim) const
Return maximum index for array dimension "dim".
const char * GetTrueTypeName() const
Get the desugared type name of this data member, including const and volatile qualifiers.
Int_t GetArrayDim() const
Return number of array dimensions.
Int_t GetUnitSize() const
Get the sizeof the underlying type of the data member (i.e.
Bool_t IsBasic() const
Return true if data member is a basic type, e.g. char, int, long...
Int_t IsSTLContainer()
The return type is defined in TDictionary (kVector, kList, etc.)
Bool_t IsaPointer() const
Return true if data member is a pointer.
TDataType * GetDataType() const
const char * GetTypeName() const
const char * GetArrayIndex() const
If the data member is pointer and has a valid array size in its comments GetArrayIndex returns a stri...
Basic data type descriptor (datatype information is obtained from CINT).
Int_t Size() const
Get size of basic typedef'ed type.
nlohmann::json * GetStlNode()
Bool_t AssignStl(TClass *cl, Int_t map_convert, const char *typename_tag)
Bool_t fIsPostProcessed
! indicate that value is written
Bool_t IsStreamerInfo() const
void PushValue(TString &v)
~TJSONStackObj() override
Bool_t IsStreamerElement() const
std::unique_ptr< TArrayIndexProducer > MakeReadIndexes()
int fMemberCnt
! count number of object members, normally _typename is first member
nlohmann::json * fNode
! JSON node, used for reading
int * fMemberPtr
! pointer on members counter, can be inherit from parent stack objects
std::vector< std::string > fValues
! raw values
Bool_t fAccObjects
! if true, accumulate whole objects in values
std::unique_ptr< StlRead > fStlRead
! custom structure for stl container reading
Version_t fClVersion
! keep actual class version, workaround for ReadVersion in custom streamer
void PushIntValue(Int_t v)
Int_t fLevel
! indent level
std::unique_ptr< TArrayIndexProducer > fIndx
! producer of ndim indexes
TStreamerElement * fElem
! element in streamer info
Int_t IsJsonArray(nlohmann::json *json=nullptr, const char *map_convert_type=nullptr)
checks if specified JSON node is array (compressed or not compressed) returns length of array (or -1 ...
Bool_t fIsObjStarted
! indicate that object writing started, should be closed in postprocess
Bool_t fBase64
! enable base64 coding when writing array
const char * NextMemberSeparator()
returns separator for data members
void Add(TObject *obj) override
TMap implements an associative array of (key,value) pairs using a THashTable for efficient retrieval ...
const char * GetName() const override
Returns name of object.
const char * GetTitle() const override
Returns title of object.
Int_t IndexOf(const TObject *obj) const override
Mother of all ROOT objects.
@ kIsOnHeap
object is on heap
@ kNotDeleted
object has not been deleted
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message.
virtual void SetUniqueID(UInt_t uid)
Set the unique object id.
TObject()
TObject constructor.
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
The TRealData class manages the effective list of all data members for a given class.
TDataMember * GetDataMember() const
Long_t GetThisOffset() const
TClass * GetClassPointer() const override
Returns a pointer to the TClass of this element.
Describe one element (data member) to be Streamed.
virtual const char * GetFullName() const
Return element name including dimensions, if any Note that this function stores the name into a stati...
virtual TClass * GetClassPointer() const
Returns a pointer to the TClass of this element and updates fClassObject.
virtual void SetArrayDim(Int_t dim)
Set number of array dimensions.
Int_t GetArrayDim() const
Int_t GetArrayLength() const
Int_t GetMaxIndex(Int_t i) const
const char * GetTypeName() const
virtual Bool_t IsBase() const
Return kTRUE if the element represent a base class.
virtual void SetMaxIndex(Int_t dim, Int_t max)
set maximum index for array with dimension dim
Describes a persistent version of a class.
Int_t GetClassVersion() const override
TClass * GetClass() const override
TObjArray * GetElements() const override
Int_t Atoi() const
Return integer value of string.
TString & Replace(Ssiz_t pos, Ssiz_t n, const char *s)
const char * Data() const
void Resize(Ssiz_t n)
Resize the string. Truncate or add blanks as necessary.
TString & Append(const char *cs)
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Abstract Interface class describing Streamer information for one class.
static Bool_t CanDelete()
static function returning true if ReadBuffer can delete object
virtual TClass * GetClass() const =0
bool IsStdClass(const char *type)
return true if the class belongs to the std namespace
@ kZLIB
Use ZLIB compression.
@ kDefaultZLIB
Compression level reserved for ZLIB compression algorithm (fastest compression)
const char * fTypeTag
! type tag used for std::map stored as JSON object
nlohmann::json fValue
! temporary value reading std::map as JSON
Bool_t fFirst
! is first or second element is used in the pair
nlohmann::json * GetStlNode(nlohmann::json *prnt)
nlohmann::json::iterator fIter
! iterator for std::map stored as JSON object
Int_t fIndx
! index of object in STL container
Int_t fMap
! special iterator over STL map::key members