12 #ifndef ROOT_TBufferJSON
13 #define ROOT_TBufferJSON
23 class TVirtualStreamerInfo;
25 class TStreamerElement;
26 class TMemberStreamer;
30 class TBufferJSON final :
public TBufferText {
44 kZeroSuppression = 10,
45 kSameSuppression = 20,
51 TBufferJSON(TBuffer::EMode mode = TBuffer::kWrite);
52 virtual ~TBufferJSON();
54 void SetCompact(
int level);
55 void SetTypenameTag(
const char *tag =
"_typename");
56 void SetTypeversionTag(
const char *tag =
nullptr);
57 void SetSkipClassInfo(
const TClass *cl);
58 Bool_t IsSkipClassInfo(
const TClass *cl)
const;
60 TString StoreObject(
const void *obj,
const TClass *cl);
61 void *RestoreObject(
const char *str, TClass **cl);
63 static TString ConvertToJSON(
const TObject *obj, Int_t compact = 0,
const char *member_name =
nullptr);
65 ConvertToJSON(
const void *obj,
const TClass *cl, Int_t compact = 0,
const char *member_name =
nullptr);
66 static TString ConvertToJSON(
const void *obj, TDataMember *member, Int_t compact = 0, Int_t arraylen = -1);
68 static Int_t ExportToFile(
const char *filename,
const TObject *obj,
const char *option =
nullptr);
69 static Int_t ExportToFile(
const char *filename,
const void *obj,
const TClass *cl,
const char *option =
nullptr);
71 static TObject *ConvertFromJSON(
const char *str);
72 static void *ConvertFromJSONAny(
const char *str, TClass **cl =
nullptr);
75 static TString ToJSON(
const T *obj, Int_t compact = 0,
const char *member_name =
nullptr)
77 return ConvertToJSON(obj, TClass::GetClass<T>(), compact, member_name);
81 static Bool_t FromJSON(T *&obj,
const char *json)
85 obj = (T *)ConvertFromJSONChecked(json, TClass::GetClass<T>());
86 return obj !=
nullptr;
90 static std::unique_ptr<T> FromJSON(
const std::string &json)
92 T *obj = (T *)ConvertFromJSONChecked(json.c_str(), TClass::GetClass<T>());
93 return std::unique_ptr<T>(obj);
98 TClass *ReadClass(
const TClass *cl =
nullptr, UInt_t *objTag =
nullptr) final;
99 void WriteClass(const TClass *cl) final;
103 Version_t ReadVersion(UInt_t *start =
nullptr, UInt_t *bcnt =
nullptr, const TClass *cl =
nullptr) final;
104 UInt_t WriteVersion(const TClass *cl, Bool_t useBcnt = kFALSE) final;
106 void *ReadObjectAny(const TClass *clCast) final;
107 void SkipObjectAny() final;
110 void IncrementLevel(TVirtualStreamerInfo *) final;
111 void SetStreamerElementNumber(TStreamerElement *elem, Int_t comp_type) final;
112 void DecrementLevel(TVirtualStreamerInfo *) final;
114 void ClassBegin(const TClass *, Version_t = -1) final;
115 void ClassEnd(const TClass *) final;
116 void ClassMember(const
char *name, const
char *typeName =
nullptr, Int_t arrsize1 = -1, Int_t arrsize2 = -1) final;
118 Int_t ReadArray(Bool_t *&b) final;
119 Int_t ReadArray(Char_t *&c) final;
120 Int_t ReadArray(UChar_t *&c) final;
121 Int_t ReadArray(Short_t *&h) final;
122 Int_t ReadArray(UShort_t *&h) final;
123 Int_t ReadArray(Int_t *&i) final;
124 Int_t ReadArray(UInt_t *&i) final;
125 Int_t ReadArray(Long_t *&l) final;
126 Int_t ReadArray(ULong_t *&l) final;
127 Int_t ReadArray(Long64_t *&l) final;
128 Int_t ReadArray(ULong64_t *&l) final;
129 Int_t ReadArray(Float_t *&f) final;
130 Int_t ReadArray(Double_t *&d) final;
132 Int_t ReadStaticArray(Bool_t *b) final;
133 Int_t ReadStaticArray(Char_t *c) final;
134 Int_t ReadStaticArray(UChar_t *c) final;
135 Int_t ReadStaticArray(Short_t *h) final;
136 Int_t ReadStaticArray(UShort_t *h) final;
137 Int_t ReadStaticArray(Int_t *i) final;
138 Int_t ReadStaticArray(UInt_t *i) final;
139 Int_t ReadStaticArray(Long_t *l) final;
140 Int_t ReadStaticArray(ULong_t *l) final;
141 Int_t ReadStaticArray(Long64_t *l) final;
142 Int_t ReadStaticArray(ULong64_t *l) final;
143 Int_t ReadStaticArray(Float_t *f) final;
144 Int_t ReadStaticArray(Double_t *d) final;
146 void ReadFastArray(Bool_t *b, Int_t n) final;
147 void ReadFastArray(Char_t *c, Int_t n) final;
148 void ReadFastArrayString(Char_t *c, Int_t n) final;
149 void ReadFastArray(UChar_t *c, Int_t n) final;
150 void ReadFastArray(Short_t *h, Int_t n) final;
151 void ReadFastArray(UShort_t *h, Int_t n) final;
152 void ReadFastArray(Int_t *i, Int_t n) final;
153 void ReadFastArray(UInt_t *i, Int_t n) final;
154 void ReadFastArray(Long_t *l, Int_t n) final;
155 void ReadFastArray(ULong_t *l, Int_t n) final;
156 void ReadFastArray(Long64_t *l, Int_t n) final;
157 void ReadFastArray(ULong64_t *l, Int_t n) final;
158 void ReadFastArray(Float_t *f, Int_t n) final;
159 void ReadFastArray(Double_t *d, Int_t n) final;
160 void ReadFastArray(
void *start, const TClass *cl, Int_t n = 1, TMemberStreamer *s =
nullptr,
161 const TClass *onFileClass =
nullptr) final;
162 void ReadFastArray(
void **startp, const TClass *cl, Int_t n = 1, Bool_t isPreAlloc = kFALSE,
163 TMemberStreamer *s =
nullptr, const TClass *onFileClass =
nullptr) final;
165 void WriteArray(const Bool_t *b, Int_t n) final;
166 void WriteArray(const Char_t *c, Int_t n) final;
167 void WriteArray(const UChar_t *c, Int_t n) final;
168 void WriteArray(const Short_t *h, Int_t n) final;
169 void WriteArray(const UShort_t *h, Int_t n) final;
170 void WriteArray(const Int_t *i, Int_t n) final;
171 void WriteArray(const UInt_t *i, Int_t n) final;
172 void WriteArray(const Long_t *l, Int_t n) final;
173 void WriteArray(const ULong_t *l, Int_t n) final;
174 void WriteArray(const Long64_t *l, Int_t n) final;
175 void WriteArray(const ULong64_t *l, Int_t n) final;
176 void WriteArray(const Float_t *f, Int_t n) final;
177 void WriteArray(const Double_t *d, Int_t n) final;
179 void WriteFastArray(const Bool_t *b, Int_t n) final;
180 void WriteFastArray(const Char_t *c, Int_t n) final;
181 void WriteFastArrayString(const Char_t *c, Int_t n) final;
182 void WriteFastArray(const UChar_t *c, Int_t n) final;
183 void WriteFastArray(const Short_t *h, Int_t n) final;
184 void WriteFastArray(const UShort_t *h, Int_t n) final;
185 void WriteFastArray(const Int_t *i, Int_t n) final;
186 void WriteFastArray(const UInt_t *i, Int_t n) final;
187 void WriteFastArray(const Long_t *l, Int_t n) final;
188 void WriteFastArray(const ULong_t *l, Int_t n) final;
189 void WriteFastArray(const Long64_t *l, Int_t n) final;
190 void WriteFastArray(const ULong64_t *l, Int_t n) final;
191 void WriteFastArray(const Float_t *f, Int_t n) final;
192 void WriteFastArray(const Double_t *d, Int_t n) final;
193 void WriteFastArray(
void *start, const TClass *cl, Int_t n = 1, TMemberStreamer *s =
nullptr) final;
194 Int_t WriteFastArray(
void **startp, const TClass *cl, Int_t n = 1, Bool_t isPreAlloc = kFALSE,
195 TMemberStreamer *s =
nullptr) final;
197 void StreamObject(
void *obj, const TClass *cl, const TClass *onFileClass =
nullptr) final;
198 using TBufferText::StreamObject;
200 void ReadBool(Bool_t &b) final;
201 void ReadChar(Char_t &c) final;
202 void ReadUChar(UChar_t &c) final;
203 void ReadShort(Short_t &s) final;
204 void ReadUShort(UShort_t &s) final;
205 void ReadInt(Int_t &i) final;
206 void ReadUInt(UInt_t &i) final;
207 void ReadLong(Long_t &l) final;
208 void ReadULong(ULong_t &l) final;
209 void ReadLong64(Long64_t &l) final;
210 void ReadULong64(ULong64_t &l) final;
211 void ReadFloat(Float_t &f) final;
212 void ReadDouble(Double_t &d) final;
213 void ReadCharP(Char_t *c) final;
214 void ReadTString(TString &s) final;
215 void ReadStdString(std::
string *s) final;
216 using TBuffer::ReadStdString;
217 void ReadCharStar(
char *&s) final;
219 void WriteBool(Bool_t b) final;
220 void WriteChar(Char_t c) final;
221 void WriteUChar(UChar_t c) final;
222 void WriteShort(Short_t s) final;
223 void WriteUShort(UShort_t s) final;
224 void WriteInt(Int_t i) final;
225 void WriteUInt(UInt_t i) final;
226 void WriteLong(Long_t l) final;
227 void WriteULong(ULong_t l) final;
228 void WriteLong64(Long64_t l) final;
229 void WriteULong64(ULong64_t l) final;
230 void WriteFloat(Float_t f) final;
231 void WriteDouble(Double_t d) final;
232 void WriteCharP(const Char_t *c) final;
233 void WriteTString(const TString &s) final;
234 void WriteStdString(const std::
string *s) final;
235 using TBuffer::WriteStdString;
236 void WriteCharStar(
char *s) final;
238 TVirtualStreamerInfo *GetInfo() final;
242 void ReadBaseClass(
void *start, TStreamerBase *elem) final;
247 void WriteObjectClass(const
void *actualObjStart, const TClass *actualClass, Bool_t cacheReuse) final;
251 static
void *ConvertFromJSONChecked(const
char *str, const TClass *expectedClass);
253 TString JsonWriteMember(const
void *ptr, TDataMember *member, TClass *memberClass, Int_t arraylen);
255 TJSONStackObj *PushStack(Int_t inclevel = 0,
void *readnode =
nullptr);
256 TJSONStackObj *PopStack();
257 TJSONStackObj *Stack() {
return fStack.back().get(); }
259 void WorkWithClass(TStreamerInfo *info,
const TClass *cl =
nullptr);
260 void WorkWithElement(TStreamerElement *elem, Int_t);
262 void JsonDisablePostprocessing();
263 Int_t JsonSpecialClass(
const TClass *cl)
const;
265 TJSONStackObj *JsonStartObjectWrite(
const TClass *obj_class, TStreamerInfo *info =
nullptr);
267 void JsonStartElement(
const TStreamerElement *elem,
const TClass *base_class);
269 void PerformPostProcessing(TJSONStackObj *stack,
const TClass *obj_cl =
nullptr);
271 void JsonWriteBasic(Char_t value);
272 void JsonWriteBasic(Short_t value);
273 void JsonWriteBasic(Int_t value);
274 void JsonWriteBasic(Long_t value);
275 void JsonWriteBasic(Long64_t value);
276 void JsonWriteBasic(Float_t value);
277 void JsonWriteBasic(Double_t value);
278 void JsonWriteBasic(Bool_t value);
279 void JsonWriteBasic(UChar_t value);
280 void JsonWriteBasic(UShort_t value);
281 void JsonWriteBasic(UInt_t value);
282 void JsonWriteBasic(ULong_t value);
283 void JsonWriteBasic(ULong64_t value);
285 void JsonWriteConstChar(
const char *value, Int_t len = -1,
const char * =
nullptr);
287 void JsonWriteObject(
const void *obj,
const TClass *objClass, Bool_t check_map = kTRUE);
289 void JsonWriteCollection(TCollection *obj,
const TClass *objClass);
291 void JsonReadCollection(TCollection *obj,
const TClass *objClass);
293 void JsonReadTObjectMembers(TObject *obj,
void *node =
nullptr);
295 void *JsonReadObject(
void *obj,
const TClass *objClass =
nullptr, TClass **readClass =
nullptr);
297 void AppendOutput(
const char *line0,
const char *line1 =
nullptr);
299 void JsonPushValue();
301 template <
typename T>
302 R__ALWAYS_INLINE
void JsonWriteArrayCompress(
const T *vname, Int_t arrsize,
const char *typname);
304 template <
typename T>
305 R__ALWAYS_INLINE
void JsonReadBasic(T &value);
307 template <
typename T>
308 R__ALWAYS_INLINE Int_t JsonReadArray(T *value);
310 template <
typename T>
311 R__ALWAYS_INLINE
void JsonReadFastArray(T *arr, Int_t arrsize,
bool asstring =
false);
313 template <
typename T>
314 R__ALWAYS_INLINE
void JsonWriteFastArray(
const T *arr, Int_t arrsize,
const char *typname,
315 void (TBufferJSON::*method)(
const T *, Int_t,
const char *));
318 TString *fOutput{
nullptr};
320 unsigned fJsonrCnt{0};
321 std::deque<std::unique_ptr<TJSONStackObj>> fStack;
323 Bool_t fMapAsObject{kFALSE};
325 Int_t fArrayCompact{0};
327 TString fNumericLocale;
328 TString fTypeNameTag;
329 TString fTypeVersionTag;
330 std::vector<const TClass *> fSkipClasses;
332 ClassDefOverride(TBufferJSON, 0)