27 static Bool_t IsIrrelevantCharacter(
char c)
29 return (
c ==
' ' ||
c ==
'\n' ||
c ==
'\t');
32 static void AdvanceOverIrrelevantCharacter(
const char*& str)
34 while (IsIrrelevantCharacter(*str)) {
46 const char null =
'\0';
47 const char* left = lhs.
Data();
48 const char* right = rhs.
Data();
51 AdvanceOverIrrelevantCharacter(left);
52 AdvanceOverIrrelevantCharacter(right);
54 while (*left != null || *right != null) {
56 if (!literal && IsIrrelevantCharacter(*left) && IsIrrelevantCharacter(*right)) {
57 AdvanceOverIrrelevantCharacter(left);
58 AdvanceOverIrrelevantCharacter(right);
62 if (*left == null || *right == null) {
63 AdvanceOverIrrelevantCharacter(left);
64 AdvanceOverIrrelevantCharacter(right);
65 result = (*left ==
null && *right ==
null);
69 if (*left != *right) {
90 fTargetVect( nullptr ), fSourceVect( nullptr ),
91 fIncludeVect( nullptr ), fEmbed(
kTRUE ),
92 fReadFuncPtr( nullptr ), fReadRawFuncPtr( nullptr ),
113 fVersionVect( nullptr ), fChecksumVect( nullptr ),
114 fTargetVect( nullptr ), fSourceVect( nullptr ),
115 fIncludeVect( nullptr ), fEmbed(
kTRUE ),
116 fReadFuncPtr( nullptr ), fReadRawFuncPtr( nullptr ),
180 std::cout <<
"Schema Evolution Rule: ";
189 if (targetname && targetname[0]) std::cout <<
"targetClass=\"" << targetname <<
"\" ";
190 else std::cout <<
"targetClass\"" <<
fTargetClass <<
"\" ";
193 std::cout <<
"source=\"" <<
fSource <<
"\" ";
194 std::cout <<
"target=\"" <<
fTarget <<
"\" ";
198 std::cout <<
"include=\"" <<
fInclude <<
"\" " <<
"\n";
202 std::cout <<
"attributes=\"" <<
fAttributes <<
"\"" <<
"\n";
206 std::cout <<
"code=\"{" <<
fCode <<
"}\" "
236 else { out +=
"-- "; end =
"-->"; }
255 if (!shortform || (
fVersion !=
"[1-]")) {
260 out +=
"source=\"" +
fSource +
"\" ";
261 out +=
"target=\"" +
fTarget +
"\" ";
270 out +=
"\n<![CDATA[ { " +
fCode +
" ]]>\n ";
280 out +=
"code=\"{" +
fCode +
"}\" ";
329 std::string error_string;
331 Error(
"SetFromRule",
"The rule (%s) is invalid: %s",rule,error_string.c_str());
334 ROOT::Internal::MembersMap_t::const_iterator it1;
336 it1 = rule_values.find(
"type" );
337 if( it1 != rule_values.end() ) {
338 if (it1->second ==
"read" || it1->second ==
"Read") {
340 }
else if (it1->second ==
"readraw" || it1->second ==
"ReadRaw") {
349 it1 = rule_values.find(
"targetClass" );
351 it1 = rule_values.find(
"sourceClass" );
353 it1 = rule_values.find(
"target" );
354 if( it1 != rule_values.end() )
SetTarget( it1->second );
355 it1 = rule_values.find(
"source" );
356 if( it1 != rule_values.end() )
SetSource( it1->second );
357 it1 = rule_values.find(
"version" );
358 if( it1 != rule_values.end() )
SetVersion( it1->second );
359 it1 = rule_values.find(
"checksum" );
360 if( it1 != rule_values.end() )
SetChecksum( it1->second );
361 it1 = rule_values.find(
"embed" );
362 if( it1 != rule_values.end() )
SetEmbed( it1->second ==
"false" ?
false : true );
363 it1 = rule_values.find(
"include" );
364 if( it1 != rule_values.end() )
SetInclude( it1->second );
365 it1 = rule_values.find(
"attributes" );
367 it1 = rule_values.find(
"code" );
368 if( it1 != rule_values.end() )
SetCode( it1->second );
416 if( version >= it.first && version <= it.second )
458 std::string normalizedName;
476 std::string normalizedName;
679 while( (obj = it.
Next()) ) {
697 while( (obj = it.
Next()) ) {
793 while( (obj = titer.
Next() ) ) {
796 haveCommonTargets =
kTRUE;
799 if( !haveCommonTargets )
807 std::vector<UInt_t>::iterator it;
819 std::vector<std::pair<Int_t, Int_t> >::iterator it1;
820 std::vector<std::pair<Int_t, Int_t> >::iterator it2;
828 if( it1->first >= it2->first && it1->first <= it2->second )
831 if( it1->first < it2->first && it1->second >= it2->first )
848 if( version[0] !=
'[' || version[version.
Length()-1] !=
']' )
850 std::string ver = version.
Data();
852 std::list<std::string> versions;
855 if( versions.empty() )
863 fVersionVect =
new std::vector<std::pair<Int_t, Int_t> >;
870 std::list<std::string>::iterator it;
871 for( it = versions.begin(); it != versions.end(); ++it ) {
872 std::pair<Int_t, Int_t> verpair;
895 std::string chk = (
const char*)checksum;
896 if( chk[0] !=
'[' || chk[chk.size()-1] !=
']' )
899 std::list<std::string> checksums;
902 if( checksums.empty() ) {
916 for(
const auto& checksumStr : checksums ) {
934 std::istringstream converter(checksum);
936 converter >> std::hex >> chksum;
937 if (converter.fail()) {
940 converter >> std::dec >> chksum;
943 if( converter.fail() ) {
955 std::list<std::string> elems;
956 std::list<std::string>::iterator it;
964 for( it = elems.begin(); it != elems.end(); ++it ) {
976 std::list<std::pair<ROOT::Internal::TSchemaType,std::string> > elems;
977 std::list<std::pair<ROOT::Internal::TSchemaType,std::string> >::iterator it;
985 for( it = elems.begin(); it != elems.end(); ++it ) {
986 TSources *
type =
new TSources( it->second.c_str(), it->first.fType.c_str(), it->first.fDimensions.c_str() ) ;
1002 funcname +=
"_" +
name;
1004 String filename = funcname +
".C";
1009 std::ofstream fileout(filename);
1015 gROOT->LoadMacro(filename);
static void SplitDeclaration(const std::string &source, std::list< std::pair< ROOT::Internal::TSchemaType, std::string > > &result)
static bool ProcessVersion(const std::string &source, std::pair< Int_t, Int_t > &result)
static void SplitList(const std::string &source, std::list< std::string > &result, char delimiter=',')
void SetRuleType(RuleType_t type)
Set the type of the rule.
void SetCode(const TString &code)
Set the source code of this rule.
TString fCode
Includes vector.
void SetTarget(const TString &target)
Set the target member of this rule (i.e. the in memory data member).
ReadFuncPtr_t fReadFuncPtr
void SetReadRawFunctionPointer(ReadRawFuncPtr_t ptr)
Set the pointer to the function to be run for the rule (if it is a raw read rule).
void SetInclude(const TString &include)
Set the comma separated list of header files to include to be able to compile this rule.
void AsString(TString &out, const char *options="") const
Add to the string 'out' the string representation of the rule.
const TObjArray * GetSource() const
Get the list of source members as a TObjArray of TNamed object, with the name being the member name a...
void SetReadFunctionPointer(ReadFuncPtr_t ptr)
Set the pointer to the function to be run for the rule (if it is a read rule).
std::vector< UInt_t > * fChecksumVect
void ls(Option_t *option="") const
The ls function lists the contents of a class on stdout.
UInt_t ParseChecksum(const char *checksum) const
Parse the checksum in the given string.
static void ProcessList(TObjArray *array, const TString &list)
Split the list as a comma separated list into a TObjArray of TObjString.
Bool_t operator==(const TSchemaRule &rhs) const
Return true if the rule have the same effects.
Bool_t SetFromRule(const char *rule)
Set the content fot this object from the rule See TClass::AddRule for details on the syntax.
Bool_t TestVersion(Int_t version) const
Check if given version number is defined in this rule.
TString fSource
Target data member vector (for searching purposes)
Bool_t HasSource(const TString &source) const
Return true if one of the rule's data member source is 'source'.
ReadRawFuncPtr_t GetReadRawFunctionPointer() const
Get the pointer to the function to be run for the rule (if it is a raw read rule).
const TObjArray * GetTarget() const
Get the target data members of this rule (i.e. the in memory data member).
Bool_t ProcessChecksum(const TString &checksum) const
Check if specified checksum string is correct and build checksum vector.
void(* ReadFuncPtr_t)(char *, TVirtualObject *)
void SetEmbed(Bool_t embed)
Set whether this rule should be save in the ROOT file (if true)
RuleType_t GetRuleType() const
Return the type of the rule.
Bool_t Conflicts(const TSchemaRule *rule) const
Check if this rule conflicts with the given one.
TSchemaRule & operator=(const TSchemaRule &rhs)
Copy operator.
void SetTargetClass(const TString &classname)
Set the target class of this rule (i.e. the in memory class).
void(* ReadRawFuncPtr_t)(char *, TBuffer &)
const char * GetSourceClass() const
Get the source class of this rule (i.e. the onfile class).
virtual ~TSchemaRule()
Destructor.
Bool_t TestChecksum(UInt_t checksum) const
Check if given checksum is defined in this rule.
Bool_t SetVersion(const TString &version)
Set the version string - returns kFALSE if the format is incorrect.
TString fInclude
Source data member vector (for searching purposes)
TString fChecksum
Source version vector (for searching purposes)
void SetSource(const TString &source)
Set the list of source members.
Bool_t IsRenameRule() const
Return kTRUE if the rule is a strict renaming of the class to a new name.
void SetAttributes(const TString &attributes)
Set the attributes code of this rule.
TString fSourceClass
Source checksum vector (for searching purposes)
Bool_t HasTarget(const TString &target) const
Return true if one of the rule's data member target is 'target'.
const char * GetTargetString() const
Get the target data members of this rule as a simple string (i.e. the in memory data member).
std::vector< std::pair< Int_t, Int_t > > * fVersionVect
ReadRawFuncPtr_t fReadRawFuncPtr
Conversion function pointer for read rule.
RuleType_t fRuleType
Conversion function pointer for readraw rule.
Bool_t IsValid() const
Return kTRUE if this rule is valid.
ReadFuncPtr_t GetReadFunctionPointer() const
Get the pointer to the function to be run for the rule (if it is a read rule).
const char * GetVersion() const
Get the version string.
const char * GetAttributes() const
Get the attributes code of this rule.
Bool_t GetEmbed() const
Return true if this rule should be saved in the ROOT File.
const char * GetCode() const
Get the source code of this rule.
void SetSourceClass(const TString &classname)
Set the source class of this rule (i.e. the onfile class).
TSchemaRule()
Default Constructor.
Bool_t SetChecksum(const TString &checksum)
Set the checksum string - returns kFALSE if the format is incorrect.
void Clear(Option_t *="")
Zero out this rule object.
const TObjArray * GetInclude() const
Return the list of header files to include to be able to compile this rule as a TObjArray of TObjStri...
Bool_t IsAliasRule() const
Return kTRUE if the rule is a strict renaming of one of the data member of the class.
const char * GetTargetClass() const
Get the targte class of this rule (i.e. the in memory class).
static void ProcessDeclaration(TObjArray *array, const TString &list)
Split the list as a declaration into as a TObjArray of TNamed(name,type).
Bool_t ProcessVersion(const TString &version) const
Check if specified version string is correct and build version vector.
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
virtual const char * GetName() const
Returns name of object.
Iterator of object array.
TObject * Next()
Return next object in array. Returns 0 when no more objects in array.
virtual void Clear(Option_t *option="")
Remove all objects from the array.
Collectable string class.
const TString & GetString() const
Mother of all ROOT objects.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
static Int_t IncreaseDirLevel()
Increase the indentation level for ls().
static void IndentLevel()
Functions used by ls() to indent an object hierarchy.
static Int_t DecreaseDirLevel()
Decrease the indentation level for ls().
Describes a persistent version of a class.
Int_t GetClassVersion() const
void ToLower()
Change string to lower-case.
void Clear()
Clear string without changing its capacity.
const char * Data() const
TString & ReplaceAll(const TString &s1, const TString &s2)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
std::map< std::string, std::string > MembersMap_t
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
void WriteReadRuleFunc(SchemaRuleMap_t &rule, int index, std::string &mappedName, MembersTypeMap_t &members, std::ostream &output)
Write the conversion function for Read rule, the function name is being written to rule["funcname"].
void WriteReadRawRuleFunc(SchemaRuleMap_t &rule, int index, std::string &mappedName, MembersTypeMap_t &members, std::ostream &output)
Write the conversion function for ReadRaw rule, the function name is being written to rule["funcname"...
bool ParseRule(std::string rule, ROOT::Internal::MembersMap_t &result, std::string &error_string)
Parse the schema rule as specified in the LinkDef file.
void GetNormalizedName(std::string &norm_name, std::string_view name)
Return the normalized name.