17#include <TDataMember.h>
20#include <TEnumConstant.h>
25#include <fairlogger/Logger.h>
26#include <boost/property_tree/ptree.hpp>
27#include <boost/functional/hash.hpp>
40 std::string nil =
"<null>";
42 std::ostringstream out;
43 out << prefix <<
"." <<
name <<
" : " <<
value;
47 out <<
"\t\t[ " + prov +
" ]";
54 out << pdm.
toString(
"",
false) <<
"\n";
62 return strcmp(dm.GetTrueTypeName(),
"string") == 0;
70 std::function<
void(
const TDataMember*,
int,
int)>&& callback)
72 auto memberlist = cl->GetListOfDataMembers();
73 for (
int i = 0;
i < memberlist->GetEntries(); ++
i) {
74 auto dm = (TDataMember*)memberlist->At(
i);
76 auto isValidComplex = [dm]() {
77 return isString(*dm) || dm->IsEnum();
81 if (dm->Property() & kIsStatic) {
85 if (dm->IsaPointer()) {
86 LOG(warning) <<
"Pointer types not supported in ConfigurableParams: " << dm->GetFullTypeName() <<
" " << dm->GetName();
89 if (!dm->IsBasic() && !isValidComplex()) {
90 LOG(warning) <<
"Generic complex types not supported in ConfigurableParams: " << dm->GetFullTypeName() <<
" " << dm->GetName();
94 const auto dim = dm->GetArrayDim();
97 LOG(warning) <<
"We support at most 1 dimensional arrays in ConfigurableParams: " << dm->GetFullTypeName() <<
" " << dm->GetName();
101 const auto size = (dim == 1) ? dm->GetMaxIndex(dim - 1) : 1;
113 std::stringstream namestream;
114 namestream << dm->GetName();
116 namestream <<
"[" <<
index <<
"]";
118 return namestream.str();
124 auto dt = dm.GetDataType();
130 auto tname = dm.GetFullTypeName();
131 if (strcmp(tname,
"string") == 0 || strcmp(tname,
"std::string")) {
132 return sizeof(std::string);
134 LOG(error) <<
"ENCOUNTERED AN UNSUPPORTED TYPE " << tname <<
"IN A CONFIGURABLE PARAMETER";
145 if (
auto dt = dm.GetDataType()) {
148 if (dt->GetType() == EDataType::kChar_t) {
151 }
else if (dt->GetType() == EDataType::kUChar_t) {
161 const auto enumtype = TEnum::GetEnum(dm.GetTypeName());
162 assert(enumtype !=
nullptr);
163 const auto constantlist = enumtype->GetConstants();
164 assert(constantlist !=
nullptr);
166 for (
int i = 0;
i < constantlist->GetEntries(); ++
i) {
167 const auto e = (TEnumConstant*)(constantlist->At(
i));
169 return std::string(e->GetName());
175 return std::string(
val);
180 return ((std::string*)
pointer)->c_str();
184 LOG(error) <<
"COULD NOT REPRESENT AS STRING";
185 return std::string();
190std::vector<ParamDataMember>* _ParamHelper::getDataMembersImpl(std::string
const& mainkey, TClass* cl,
void* obj,
191 std::map<std::string, ConfigurableParam::EParamProvenance>
const* provmap,
size_t globaloffset)
193 std::vector<ParamDataMember>* members =
new std::vector<ParamDataMember>;
195 auto toDataMember = [&members, obj, mainkey, provmap, globaloffset](
const TDataMember* dm,
int index,
int size) {
197 char*
pointer = ((
char*)obj) + dm->GetOffset() +
index * TS + globaloffset;
201 std::string prov =
"";
202 auto iter = provmap->find(mainkey +
"." +
name);
203 if (iter != provmap->end()) {
207 members->push_back(member);
223 switch (dt->GetType()) {
228 return typeid(
unsigned char);
231 return typeid(
short);
234 return typeid(
unsigned short);
240 return typeid(
unsigned int);
246 return typeid(
unsigned long);
249 return typeid(float);
252 return typeid(double);
255 return typeid(double);
261 return typeid(
long long);
264 return typeid(
unsigned long long);
272 if (strcmp(tname,
"string") == 0 || strcmp(tname,
"std::string")) {
273 return typeid(std::string);
275 LOG(error) <<
"ENCOUNTERED AN UNSUPPORTED TYPE " << tname <<
"IN A CONFIGURABLE PARAMETER";
276 return typeid(
"ERROR");
281void _ParamHelper::fillKeyValuesImpl(std::string
const& mainkey, TClass* cl,
void* obj, boost::property_tree::ptree*
tree,
282 std::map<std::string, std::pair<std::type_info const&, void*>>* keytostoragemap,
285 boost::property_tree::ptree localtree;
286 auto fillMap = [obj, &mainkey, &localtree, &keytostoragemap, &enumRegistry, globaloffset](
const TDataMember* dm,
int index,
int size) {
288 auto dt = dm->GetDataType();
290 char*
pointer = ((
char*)obj) + dm->GetOffset() +
index * TS + globaloffset;
293 auto key = mainkey +
"." +
name;
298 enumRegistry->
add(
key, dm);
301 using mapped_t = std::pair<std::type_info const&, void*>;
303 keytostoragemap->insert(std::pair<std::string, mapped_t>(
key, mapped_t(ti,
pointer)));
306 tree->add_child(mainkey, localtree);
311void _ParamHelper::printMembersImpl(std::string
const& mainkey, std::vector<ParamDataMember>
const* members,
bool showProv,
bool useLogger)
314 _ParamHelper::outputMembersImpl(std::cout, mainkey, members, showProv, useLogger);
317void _ParamHelper::outputMembersImpl(std::ostream& out, std::string
const& mainkey, std::vector<ParamDataMember>
const* members,
bool showProv,
bool useLogger)
319 if (members ==
nullptr) {
323 for (
auto& member : *members) {
325 LOG(info) << member.toString(mainkey, showProv);
327 out << member.toString(mainkey, showProv) <<
"\n";
332size_t _ParamHelper::getHashImpl(std::string
const& mainkey, std::vector<ParamDataMember>
const* members)
335 boost::hash_combine(hash, mainkey);
336 for (
auto& member : *members) {
337 boost::hash_combine(hash, member.value);
347 for (
int i = 0;
i < sizeinbytes /
sizeof(
char); ++
i) {
348 if (block1[
i] != block2[
i]) {
357void _ParamHelper::assignmentImpl(std::string
const& mainkey, TClass* cl,
void* to,
void* from,
358 std::map<std::string, ConfigurableParam::EParamProvenance>* provmap,
size_t globaloffset)
360 auto assignifchanged = [to, from, &mainkey, provmap, globaloffset](
const TDataMember* dm,
int index,
int size) {
362 auto dt = dm->GetDataType();
364 char* pointerto = ((
char*)to) + dm->GetOffset() +
index * TS + globaloffset;
365 char* pointerfrom = ((
char*)from) + dm->GetOffset() +
index * TS + globaloffset;
368 auto updateProv = [&mainkey,
name, provmap]() {
369 auto key = mainkey +
"." +
name;
370 auto iter = provmap->find(
key);
371 if (iter != provmap->end()) {
374 LOG(warn) <<
"KEY " <<
key <<
" NOT FOUND WHILE UPDATING PARAMETER PROVENANCE";
383 std::string&
target = *(std::string*)pointerto;
384 std::string
const&
origin = *(std::string*)pointerfrom;
385 if (
target.compare(origin) != 0) {
404void _ParamHelper::syncCCDBandRegistry(
const std::string& mainkey, TClass* cl,
void* to,
void* from,
405 std::map<std::string, ConfigurableParam::EParamProvenance>* provmap,
size_t globaloffset)
407 auto sync = [to, from, &mainkey, provmap, globaloffset](
const TDataMember* dm,
int index,
int size) {
409 auto dt = dm->GetDataType();
411 char* pointerto = ((
char*)to) + dm->GetOffset() +
index * TS + globaloffset;
412 char* pointerfrom = ((
char*)from) + dm->GetOffset() +
index * TS + globaloffset;
415 auto key = mainkey +
"." +
name;
416 auto proviter = provmap->find(
key);
422 auto updateProv = [&proviter]() {
428 std::string&
target = *(std::string*)pointerto;
429 std::string
const&
origin = *(std::string*)pointerfrom;
449void _ParamHelper::printWarning(std::type_info
const& tinfo)
451 LOG(warning) <<
"Registered parameter class with name " << tinfo.name()
452 <<
" has no ROOT dictionary and will not be available in the configurable parameter system";
size_t getSizeOfUnderlyingType(const TDataMember &dm)
void loopOverMembers(TClass *cl, void *obj, std::function< void(const TDataMember *, int, int)> &&callback)
std::string getName(const TDataMember *dm, int index, int size)
std::string asString(TDataMember const &dm, char *pointer)
bool isString(TDataMember const &dm)
std::type_info const & nameToTypeInfo(const char *tname, TDataType const *dt)
static std::string toString(EParamProvenance p)
void add(const std::string &key, const TDataMember *dm)
GLuint const GLchar * name
GLsizei const GLfloat * value
consteval header::DataOrigin origin()
bool isMemblockDifferent(void const *block1, void const *block2)
std::ostream & operator<<(std::ostream &out, ConfigurableParam const ¶m)
std::string to_string(gsl::span< T, Size > span)
std::string toString(std::string const &prefix, bool showProv) const
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::unique_ptr< TTree > tree((TTree *) flIn.Get(std::string(o2::base::NameConf::CTFTREENAME).c_str()))