From 39e4240db8cbe15c5c52ac9198d47f28574242c7 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Tue, 7 Nov 2023 19:08:12 +0100 Subject: [PATCH] Test a user-defined implementation of the ROOT read rules --- .../PortableTestObjects/src/classes.cc | 55 +++++++++++++++++++ .../PortableTestObjects/src/classes_def.xml | 4 +- 2 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 DataFormats/PortableTestObjects/src/classes.cc diff --git a/DataFormats/PortableTestObjects/src/classes.cc b/DataFormats/PortableTestObjects/src/classes.cc new file mode 100644 index 0000000000000..8ea09ac6afb10 --- /dev/null +++ b/DataFormats/PortableTestObjects/src/classes.cc @@ -0,0 +1,55 @@ +// required by +#define G__DICTIONARY + +#include +#include +#include +#include + +#include "classes.h" + +namespace ROOT { + + // forward declaration + TGenericClassInfo *GenerateInitInstance(portabletest::TestHostCollection const *); + +} // namespace ROOT + +// read function for portabletest::TestHostCollection +// called for every event +static void setROOTReadStreamerFor_portabletest_TestHostCollection(char *target, TVirtualObject *oldObj) { + // address in memory of the buffer containing the object being read from file + char *onfile_address = (char *)oldObj->GetObject(); + // offset of the "layout_" data member + static ptrdiff_t onfile_offset = oldObj->GetClass()->GetDataMemberOffset("layout_"); + // reference to the Layout object being read from file + portabletest::TestHostCollection::Layout &onfile( + *(portabletest::TestHostCollection::Layout *)(onfile_address + onfile_offset)); + // pointer to the portabletest::TestHostCollection object being constructed in memory + portabletest::TestHostCollection *newObj = (portabletest::TestHostCollection *)target; + + portabletest::TestHostCollection::ROOTReadStreamer(newObj, onfile); +} + +// set the read function for portabletest::TestHostCollection +// called when the dictionary is loaded +static bool set_portabletest_TestHostCollection_ReadRules() { + // build the read rules + std::vector<::ROOT::Internal::TSchemaHelper> readrules(1); + ::ROOT::Internal::TSchemaHelper *rule = &readrules[0]; + rule->fSourceClass = "portabletest::TestHostCollection"; + rule->fSource = "portabletest::TestHostCollection::Layout layout_;"; + rule->fFunctionPtr = (void *)TFunc2void(setROOTReadStreamerFor_portabletest_TestHostCollection); + rule->fTarget = "buffer_,layout_,view_"; + rule->fCode = ""; + rule->fVersion = "[1-]"; + rule->fEmbed = false; + + // set the read rules + ::ROOT::GenerateInitInstance((portabletest::TestHostCollection const *)nullptr)->SetReadRules(readrules); + + return true; +} + +static const bool has_the_portabletest_TestHostCollection_ReadRules_been_set = + set_portabletest_TestHostCollection_ReadRules(); diff --git a/DataFormats/PortableTestObjects/src/classes_def.xml b/DataFormats/PortableTestObjects/src/classes_def.xml index 3470c65a70c23..c1c3e27e622c0 100644 --- a/DataFormats/PortableTestObjects/src/classes_def.xml +++ b/DataFormats/PortableTestObjects/src/classes_def.xml @@ -3,7 +3,7 @@ - - +