129 std::string _message;
133 static const char* _stdErrorMsg[];
142#define TREE_NODE_CHECK_THROW(x) { if (!(x)) throw TreeNodeException(TNE_UserDefined, #x); }
162#define VOID_IMPLEMENTATION(which) { throw TreeNodeException(TNE_VoidImplementation, which); }
168#define VOID_IMPLEMENTATION_RET(which, R) { if (MLAlwaysTrue){ throw TreeNodeException(TNE_VoidImplementation, which); } return R; }
171#define ADD_LONG_CHILD { addChild(static_cast<long>(val), name); }
174#define ADD_ULONG_CHILD { addChild(static_cast<unsigned long>(val), name); }
177#define ADD_LDOUBLE_CHILD { addChild(static_cast<long double>(val), name); }
181#define READ_LONG_CHILD(DST_TYPE) { long lval=0; readChild(lval, name); val = static_cast<DST_TYPE>(lval); }
185#define READ_ULONG_CHILD(DST_TYPE) { unsigned long lval=0; readChild(lval, name); val = static_cast<DST_TYPE>(lval); }
189#define READ_LDOUBLE_CHILD(DST_TYPE){ long double ldval=0; readChild(ldval, name); val = static_cast<DST_TYPE>(ldval); }
193#define READ_LONG_CHILD_FOR_BOOL { long lval=0; readChild(lval, name); val = (lval!=0); }
303 virtual void addChild(
const std::string& ,
const char* )
VOID_IMPLEMENTATION(
"addChild(const std::string&)");
334 virtual void addChild (
const void*
const ,
size_t ,
const char* )
VOID_IMPLEMENTATION(
"addChild(void*)");
375 virtual
void readChild (
char& val, const
char* name =
nullptr)
READ_LONG_CHILD(
char);
378 virtual
void readChild (
unsigned char& val, const
char* name =
nullptr)
READ_ULONG_CHILD(
unsigned char);
381 virtual
void readChild (
short& val, const
char* name =
nullptr)
READ_LONG_CHILD(
short);
384 virtual
void readChild (
unsigned short& val, const
char* name =
nullptr)
READ_ULONG_CHILD(
unsigned short);
387 virtual
void readChild (
int& val, const
char* name =
nullptr)
READ_LONG_CHILD(
int);
390 virtual
void readChild (
unsigned int& val, const
char* name =
nullptr)
READ_ULONG_CHILD(
unsigned int);
393 virtual
void readChild (
long& , const
char* =
nullptr)
VOID_IMPLEMENTATION("readChild(
long&)");
396 virtual
void readChild (
unsigned long& , const
char* =
nullptr)
VOID_IMPLEMENTATION("readChild(
unsigned long&)");
405 virtual
void readChild (
float& val, const
char* name =
nullptr)
READ_LDOUBLE_CHILD(
float);
408 virtual
void readChild (
double& val, const
char* name =
nullptr)
READ_LDOUBLE_CHILD(
double);
411 virtual
void readChild (
long double& , const
char* =
nullptr)
VOID_IMPLEMENTATION("readChild(
long double&)");
442 virtual
void readChild (
void*& ,
unsigned long& , const
char* =
nullptr)
VOID_IMPLEMENTATION("readChild(
char*&)");
476 virtual
TreeNode* readContainerChild (const
char* name =
nullptr)
479 readChild(node, name);
490 virtual Base* readBaseChild (
const char* name =
nullptr)
492 Base* objP =
nullptr;
493 readChild(objP, name);
512 virtual const char* getLastReadChildName()
const {
VOID_IMPLEMENTATION_RET(
"getLastReadChildName()",
nullptr); }
515 bool isRootNode()
const {
return _isRoot; }
541 TreeNode(ConstructionMode ) :
559 std::vector<TreeNode*> &_getChildTreeNodes();
570 void _appendNewChild(TreeNode& newNode) { _childTreeNodes.push_back(&newNode); }
592 std::vector<TreeNode*> _childTreeNodes;
605#undef VOID_IMPLEMENTATION
606#undef ADD_ULONG_CHILD
608#undef ADD_LDOUBLE_CHILD
609#undef READ_ULONG_CHILD
610#undef READ_LONG_CHILD
611#undef READ_LDOUBLE_CHILD
612#undef READ_LONG_CHILD_FOR_BOOL
626#define ML_READCHILD_OPTIONAL(obj, tagName, defaultVal) \
627if (parent->hasChild(tagName)) { \
628 parent->readChild(obj, tagName); \
635#define ML_ADDSTATE_VERSION(ThisClass) parent->setVersion("#ThisClass#", ThisClass::getAddStateVersion());
639#define ML_ADDSTATE_SUPER(SuperClass) { \
640TreeNode* superClassNode = parent->addChild("_" #SuperClass); \
641SuperClass::addStateToTree(superClassNode); \
646#define ML_READSTATE_SUPER(SuperClass) { \
647TreeNode* superClassNode = parent->readContainerChild("_" #SuperClass); \
648SuperClass::readStateFromTree(superClassNode); \
659#define ML_TREE_NODE_SUPPORT_VIA_PERSISTENT_STATE \
660virtual void addStateToTree(TreeNode* parent) const \
662auto state = persistentState(); \
663if (state.empty()){ state = "Could not read object state."; } \
664parent->addChild(state, "State"); \
667virtual void readStateFromTree(TreeNode* parent) \
670parent->readChild(state, "State"); \
671setPersistentState(state); \
Class representing general ML objects that support import/export via strings (setPersistentState() an...
SubImageBoxd - SubImageBox with coordinates of float data type.
The class TreeNodeException is the base class for all exceptions thrown by the class TreeNode and all...
virtual ~TreeNodeException()
Destructor.
int getCode() const
Returns the error code.
int _errorCode
The error code of the exception.
TreeNodeException(int errorCode=0, const char *msg=nullptr)
Creates a new exception object with code errorCode and an optional error message.
virtual const char * getMessage() const
Returns the error string.
The class TreeNode is the abstract base class for the import/export of ML objects.
virtual void addChild(char val, const char *name) ADD_LONG_CHILD
Factory method adding a child encapsulating a variable of type char.
@ CM_readerRoot
Construct as root node for reading.
@ CM_writerRoot
Construct as root node for writing.
virtual ~TreeNode()
Destructor deleting all children of this node.
virtual void addChild(int val, const char *name) ADD_LONG_CHILD
Factory method adding a child encapsulating a variable of type int.
virtual void addChild(MLint64, const char *) VOID_IMPLEMENTATION("addChild(MLint64)")
Factory method adding a child encapsulating a variable of type MLint64.
virtual void addChild(unsigned short val, const char *name) ADD_ULONG_CHILD
Factory method adding a child encapsulating a variable of type unsigned short.
virtual void addChild(double val, const char *name) ADD_LDOUBLE_CHILD
Factory method adding a child encapsulating a variable of type double.
virtual void addChild(short val, const char *name) ADD_LONG_CHILD
Factory method adding a child encapsulating a variable of type short.
virtual void writeToString(std::string &) VOID_IMPLEMENTATION("writeToString")
Generates a string representation of the subtree represented by this node to a file.
virtual void writeToFile(const char *) VOID_IMPLEMENTATION("writeToFile")
Writes the subtree represented by this node to a file.
virtual void addChild(unsigned int val, const char *name) ADD_ULONG_CHILD
Factory method adding a child encapsulating a variable of type unsigned int.
virtual void addChild(unsigned char val, const char *name) ADD_ULONG_CHILD
Factory method adding a child encapsulating a variable of type unsigned char.
virtual void addChild(long, const char *) VOID_IMPLEMENTATION("addChild(long)")
Factory method adding a child encapsulating a variable of type long.
virtual void addChild(bool val, const char *name) ADD_ULONG_CHILD
Factory method adding a child encapsulating a variable of type bool.
virtual void addChild(unsigned long, const char *) VOID_IMPLEMENTATION("addChild(unsigned long)")
Factory method adding a child encapsulating a variable of type long.
virtual void addChild(MLuint64, const char *) VOID_IMPLEMENTATION("addChild(MLuint64)")
Factory method adding a child encapsulating a variable of type MLuint64.
virtual void readFromFile(const char *) VOID_IMPLEMENTATION("readFromFile")
Reads the subtree represented by this node from a file.
virtual void addChild(float val, const char *name) ADD_LDOUBLE_CHILD
Factory method adding a child encapsulating a variable of type float.
virtual void addChild(long double, const char *) VOID_IMPLEMENTATION("addChild(long double)")
Factory method adding a child encapsulating a variable of type long double.
virtual void readFromString(const std::string &) VOID_IMPLEMENTATION("readFromString")
Reads the subtree represented by this node from a string.
#define MLEXPORT
To export symbols from a dll/shared object, we need to mark them with the MLEXPORT symbol.
#define ML_ABSTRACT_ROOT_CLASS_HEADER(className)
#define ML_ROOT_CLASS_HEADER(className)
#define ADD_LONG_CHILD
For each signed integer type, addChild(long) is called by default.
#define READ_LDOUBLE_CHILD(DST_TYPE)
For each floating point type, readChild(LDouble) is called by default and the results is simply caste...
#define VOID_IMPLEMENTATION(which)
Standard body for a method in this interface class.
#define VOID_IMPLEMENTATION_RET(which, R)
Standard body for a method in this interface class.
#define READ_LONG_CHILD_FOR_BOOL
For each signed integer type, readChild(Long) is called by default and the results is simply casted t...
#define ADD_LDOUBLE_CHILD
For each floating point type, addChild(LDouble) is called by default.
#define READ_LONG_CHILD(DST_TYPE)
For each signed integer type, readChild(Long) is called by default and the results is simply casted t...
#define READ_ULONG_CHILD(DST_TYPE)
For each unsigned integer type, readChild(ULong) is called by default and the results is simply caste...
#define ADD_ULONG_CHILD
For each unsigned integer type, addChild(ulong) is called by default.
UINT64 MLuint64
Introduce platform independent 64 bit unsigned integer type.
INT64 MLint64
Include 64 bit integer support for Windows or Unix.
@ TNE_UnsupportedClassVersion
@ TNE_ReadingSubImageBoxd