Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Next porition for TBufferXML and TBufferJSON #43

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 15 additions & 5 deletions io/xml/src/TBufferXML.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@
#include "TStreamer.h"
#include "TStreamerInfoActions.h"
#include "RZip.h"
#include <string>

#ifdef R__VISUAL_CPLUSPLUS
#define FLong64 "%I64d"
Expand Down Expand Up @@ -1433,16 +1432,27 @@ void TBufferXML::BeforeIOoperation()
//______________________________________________________________________________
TClass* TBufferXML::ReadClass(const TClass*, UInt_t*)
{
// suppressed function of TBuffer
// function to read class from buffer, used in old-style streamers

return 0;
const char* clname = 0;

if (VerifyItemNode(xmlio::Class)) {
clname = XmlReadValue(xmlio::Class);
}

if (gDebug>2) Info("ReadClass", "Try to read class %s", clname ? clname : "---");

return clname ? gROOT->GetClass(clname) : 0;
}

//______________________________________________________________________________
void TBufferXML::WriteClass(const TClass*)
void TBufferXML::WriteClass(const TClass* cl)
{
// suppressed function of TBuffer
// function to write class into buffer, used in old-style streamers

if (gDebug>2) Info("WriteClass", "Try to write class %s", cl->GetName());

XmlWriteValue(cl->GetName(), xmlio::Class);
}

//______________________________________________________________________________
Expand Down
87 changes: 53 additions & 34 deletions net/http/src/TBufferJSON.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
#include "TBufferJSON.h"

#include <typeinfo>
#include <string>

#include "Compression.h"

Expand Down Expand Up @@ -395,8 +394,7 @@ TString TBufferJSON::JsonWriteMember(const void *ptr, TDataMember *member,
while (cnt >= 0) {
if (indexes[cnt] >= member->GetMaxIndex(cnt)) {
fOutBuffer.Append(" ]");
indexes[cnt] = 0;
cnt--;
indexes[cnt--] = 0;
if (cnt >= 0) indexes[cnt]++;
continue;
}
Expand All @@ -417,8 +415,6 @@ TString TBufferJSON::JsonWriteMember(const void *ptr, TDataMember *member,

fValue.Clear();

WriteFastArray((Int_t *)ptr + shift, len);

switch (tid) {
case kChar_t:
WriteFastArray((Char_t *)ptr + shift, len);
Expand Down Expand Up @@ -485,8 +481,7 @@ TString TBufferJSON::JsonWriteMember(const void *ptr, TDataMember *member,
}

fOutBuffer.Append(fValue);
cnt--;
indexes[cnt]++;
indexes[--cnt]++;
}
}

Expand Down Expand Up @@ -798,39 +793,41 @@ void TBufferJSON::JsonWriteObject(const void *obj, const TClass *cl, Bool_t chec
}

} else {
// write like blob values, but skipping first element with size
// TODO: make special handling for std::map, should pack each each pair in separate object
const char* separ = "[";
TString blob;

for (Int_t k=1;k<=stack->fValues.GetLast();k++) {
blob.Append(separ); separ = fArraySepar.Data();
blob.Append(stack->fValues.At(k)->GetName());
if (fValue.Length() > 0) {
stack->fValues.Add(new TObjString(fValue));
fValue.Clear();
}

if (fValue.Length()>0) {
blob.Append(separ);
blob.Append(fValue);
Int_t size = TString(stack->fValues.At(0)->GetName()).Atoi();

if ((size*2 == stack->fValues.GetLast()) &&
((special_kind==TClassEdit::kMap) || (special_kind==TClassEdit::kMultiMap))) {
// special handling for std::map. Create entries like { 'first' : key, 'second' : value }
for (Int_t k=1;k<stack->fValues.GetLast();k+=2) {
fValue.Append(separ); separ = fArraySepar.Data();
fValue.Append("{");
fValue.Append("\"first\"");
fValue.Append(fSemicolon);
fValue.Append(stack->fValues.At(k)->GetName());
fValue.Append(fArraySepar);
fValue.Append("\"second\"");
fValue.Append(fSemicolon);
fValue.Append(stack->fValues.At(k+1)->GetName());
fValue.Append("}");
}
} else {
// for most stl containers write just like blob, but skipping first element with size
for (Int_t k=1;k<=stack->fValues.GetLast();k++) {
fValue.Append(separ); separ = fArraySepar.Data();
fValue.Append(stack->fValues.At(k)->GetName());
}
}

blob.Append("]");
fValue.Append("]");
stack->fValues.Delete();
fValue = blob;
}

/*
switch(isstlcont) {
case TClassEdit::kVector : break;
case TClassEdit::kList : break;
case TClassEdit::kDeque : break;
case TClassEdit::kMap : break;
case TClassEdit::kMultiMap : break;
case TClassEdit::kSet : break;
case TClassEdit::kMultiSet : break;
case TClassEdit::kBitSet : break;
default: break;
}
*/
}

if ((special_kind==0) &&
Expand Down Expand Up @@ -2130,8 +2127,30 @@ void TBufferJSON::WriteArrayDouble32(const Double_t *d, Int_t n,
} \
PerformPostProcessing(Stack(0), elem); \
} \
} \
else { \
} else \
if ((elem!=0) && (elem->GetArrayDim()>1) && (elem->GetArrayLength()==n)) { \
TArrayI indexes(elem->GetArrayDim() - 1); \
indexes.Reset(0); \
Int_t cnt = 0; \
while (cnt >= 0) { \
if (indexes[cnt] >= elem->GetMaxIndex(cnt)) { \
fValue.Append("]"); \
indexes[cnt--] = 0; \
if (cnt >= 0) indexes[cnt]++; \
continue; \
} \
fValue.Append(indexes[cnt] == 0 ? "[" : fArraySepar.Data()); \
if (++cnt == indexes.GetSize()) { \
Int_t shift = 0; \
for (Int_t k = 0; k < indexes.GetSize(); k++) \
shift = shift * elem->GetMaxIndex(k) + indexes[k]; \
Int_t len = elem->GetMaxIndex(indexes.GetSize()); \
shift *= len; \
TJSONWriteArrayContent((vname+shift), len); \
indexes[--cnt]++; \
} \
} \
} else { \
TJSONWriteArrayContent(vname, n); \
} \
}
Expand Down