ML Reference
|
00001 // **InsertLicense** code 00002 //------------------------------------------------------------------------- 00010 //------------------------------------------------------------------------- 00011 #ifndef __mlTreeNode_H 00012 #define __mlTreeNode_H 00013 00014 #ifndef __mlInitSystemML_H 00015 #include "mlInitSystemML.h" 00016 #endif 00017 #ifndef __mlBasics_H 00018 #include "mlBasics.h" 00019 #endif 00020 #ifndef __mlRuntimeType_H 00021 #include "mlRuntimeType.h" 00022 #endif 00023 #ifndef __mlRuntimeSubClass_H 00024 #include "mlRuntimeSubClass.h" 00025 #endif 00026 00027 #ifdef _MSC_VER 00028 #pragma warning(push) 00029 // warning C4244: 'Argument': Konvertierung von 'typ1' in 'typ2', möglicher Datenverlust 00030 #pragma warning(disable: 4244) 00031 #endif 00032 00033 ML_START_NAMESPACE 00034 00035 // Incomplete type to reduce header file dependencies. 00036 class Base; 00037 class SubImageBoxd; 00038 #ifdef ML_DEPRECATED 00039 ML_DEPRECATED typedef SubImageBoxd SubImgBoxf; 00040 #endif 00041 00042 //--------------------------------------------------------------------------------- 00046 //--------------------------------------------------------------------------------- 00047 enum { 00048 TNE_VoidImplementation, 00049 TNE_NotSupported, 00050 TNE_ChildNotFound, 00051 TNE_AddingBase, 00052 TNE_ReadingBase, 00053 TNE_ReadingUChar, 00054 TNE_ReadingChar, 00055 TNE_ReadingUShort, 00056 TNE_ReadingShort, 00057 TNE_ReadingUInt, 00058 TNE_ReadingInt, 00059 TNE_ReadingULong, 00060 TNE_ReadingLong, 00061 TNE_ReadingFloat, 00062 TNE_ReadingDouble, 00063 TNE_ReadingLDouble, 00064 TNE_ReadingString, 00065 TNE_ReadingVector2, 00066 TNE_ReadingVector3, 00067 TNE_ReadingVector4, 00068 TNE_ReadingVector6, 00069 TNE_ReadingImageVector, 00070 TNE_ReadingMatrix3, 00071 TNE_ReadingMatrix4, 00072 TNE_ReadingSubImageBox, 00073 TNE_ReadingSubImageBoxd, 00074 TNE_InvalidReadNext, 00075 TNE_InvalidParentNode, 00076 TNE_FileNotFound, 00077 TNE_ReadingFile, 00078 TNE_WritingFile, 00079 TNE_UnsupportedClassVersion, 00080 TNE_UserDefined, 00081 TNE_Unknown, 00082 TNE_ReadingMLint64, 00083 TNE_ReadingMLuint64, 00084 00085 TNE_COUNT 00086 00087 #if defined(ML_DEPRECATED) 00088 , 00089 TNE_ReadingVec2 = TNE_ReadingVector2, 00090 TNE_ReadingVec3 = TNE_ReadingVector3, 00091 TNE_ReadingVec4 = TNE_ReadingVector4, 00092 TNE_ReadingVec6 = TNE_ReadingVector6, 00093 TNE_ReadingVector = TNE_ReadingImageVector, 00094 TNE_ReadingMat3 = TNE_ReadingMatrix3, 00095 TNE_ReadingMat4 = TNE_ReadingMatrix4, 00096 TNE_ReadingSubImgBox = TNE_ReadingSubImageBox, 00097 TNE_ReadingSubImgBoxf = TNE_ReadingSubImageBoxd 00098 #endif 00099 }; 00100 00101 00102 //--------------------------------------------------------------------------------- 00112 //--------------------------------------------------------------------------------- 00113 class MLEXPORT TreeNodeException 00114 { 00115 00116 public: 00117 00120 00124 TreeNodeException(int errorCode = 0, const char* msg = 0) { _errorCode = errorCode; _errorMsg = msg; } 00125 00127 virtual ~TreeNodeException() { } 00128 00130 int getCode() const { return _errorCode; } 00131 00133 00138 virtual const char* getMessage() const; 00139 00140 protected: 00141 00143 int _errorCode; 00144 00146 const char* _errorMsg; 00147 00148 private: 00149 00152 static const char* _stdErrorMsg[]; 00153 00156 ML_CLASS_HEADER(TreeNodeException); 00157 }; 00158 00159 00162 00169 class MLEXPORT TreeNode { 00170 00171 00172 public: 00173 00174 // Define macros for default implementations: 00175 00177 #define VOID_IMPLEMENTATION(which) { throw TreeNodeException(TNE_VoidImplementation, which); } 00178 00183 #define VOID_IMPLEMENTATION_RET(which, R) { if (MLAlwaysTrue){ throw TreeNodeException(TNE_VoidImplementation, which); } return R; } 00184 00186 #define ADD_LONG_CHILD { addChild(static_cast<long>(val), name); } 00187 00189 #define ADD_ULONG_CHILD { addChild(static_cast<unsigned long>(val), name); } 00190 00192 #define ADD_LDOUBLE_CHILD { addChild(static_cast<long double>(val), name); } 00193 00196 #define READ_LONG_CHILD(DST_TYPE) { long lval=0; readChild(lval, name); val = static_cast<DST_TYPE>(lval); } 00197 00200 #define READ_ULONG_CHILD(DST_TYPE) { unsigned long lval=0; readChild(lval, name); val = static_cast<DST_TYPE>(lval); } 00201 00204 #define READ_LDOUBLE_CHILD(DST_TYPE){ long double ldval=0; readChild(ldval, name); val = static_cast<DST_TYPE>(ldval); } 00205 00208 #define READ_LONG_CHILD_FOR_BOOL { long lval=0; readChild(lval, name); val = (lval!=0); } 00209 00210 00212 typedef enum { 00213 00215 CM_writerRoot, 00216 00218 CM_readerRoot, 00219 00221 CM_COUNT 00222 00223 } ConstructionMode; 00224 00225 00227 virtual ~TreeNode(); 00228 00229 //-------------------------------------------------------------- 00233 //-------------------------------------------------------------- 00234 00236 00238 virtual void writeToFile (const char* /*fileName*/) VOID_IMPLEMENTATION("writeToFile"); 00239 00241 virtual void readFromFile (const char* /*fileName*/) VOID_IMPLEMENTATION("readFromFile"); 00242 00244 00247 virtual void writeToString (char*& /*str*/) VOID_IMPLEMENTATION("writeToString"); 00248 00250 00253 virtual void readFromString (const char* /*str*/) VOID_IMPLEMENTATION("readFromString"); 00254 00256 00257 //------------------------------------------------------------------------------------------ 00268 //------------------------------------------------------------------------------------------ 00269 00271 00273 virtual void addChild (bool val , const char* name ) ADD_ULONG_CHILD; 00274 00276 virtual void addChild (unsigned char val , const char* name ) ADD_ULONG_CHILD; 00277 00279 virtual void addChild (char val , const char* name ) ADD_LONG_CHILD; 00280 00282 virtual void addChild (unsigned short val , const char* name ) ADD_ULONG_CHILD; 00283 00285 virtual void addChild (short val , const char* name ) ADD_LONG_CHILD; 00286 00288 virtual void addChild (unsigned int val , const char* name ) ADD_ULONG_CHILD; 00289 00291 virtual void addChild (int val , const char* name ) ADD_LONG_CHILD; 00292 00294 virtual void addChild (unsigned long /*val*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(unsigned long)"); 00295 00297 virtual void addChild (long /*val*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(long)"); 00298 00300 virtual void addChild (MLuint64 /*val*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(MLuint64)"); 00301 00303 virtual void addChild (MLint64 /*val*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(MLint64)"); 00304 00306 virtual void addChild (float val , const char* name ) ADD_LDOUBLE_CHILD; 00307 00309 virtual void addChild (double val , const char* name ) ADD_LDOUBLE_CHILD; 00310 00312 virtual void addChild (long double /*val*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(long double)"); 00313 00315 virtual void addChild (const char* const /*str*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(const char* const)"); 00316 00318 virtual void addChild (const Vector2& /*vec*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(Vector2)"); 00319 00321 virtual void addChild (const Vector3& /*vec*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(Vector3)"); 00322 00324 virtual void addChild (const Vector4& /*vec*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(Vector4)"); 00325 00327 virtual void addChild (const Vector6& /*vec*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(Vector6)"); 00328 00330 virtual void addChild (const ImageVector& /*vec*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(ImageVector)"); 00331 00333 virtual void addChild (const Matrix3& /*mat*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(Matrix3)"); 00334 00336 virtual void addChild (const Matrix4& /*mat*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(Matrix4)"); 00337 00339 virtual void addChild (const SubImageBox& /*box*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(SubImageBox)"); 00340 00342 virtual void addChild (const SubImageBoxd& /*box*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(SubImageBoxd)"); 00343 00346 virtual void addChild (const void* const /*ptr*/, size_t /*noBytes*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(void*)"); 00347 00349 00352 virtual void addChild (const Base* const /*obj*/, const char* /*name*/, bool /*generic*/ = true) VOID_IMPLEMENTATION("addChild(Base*)"); 00353 00355 00358 virtual TreeNode* addChild (const char* /*name*/) VOID_IMPLEMENTATION_RET("TreeNode* addChild()", NULL); 00359 00361 00362 00363 00364 00365 //-------------------------------------------------------------------------------------------- 00371 //-------------------------------------------------------------------------------------------- 00372 00374 00379 virtual bool hasChild (const char* /*tagName*/ = 0) VOID_IMPLEMENTATION_RET("TreeNode* hasChild()", false); 00380 00381 00382 00384 virtual void readChild (bool& val, const char* name = 0) READ_LONG_CHILD_FOR_BOOL; 00385 00387 virtual void readChild (char& val, const char* name = 0) READ_LONG_CHILD(char); 00388 00390 virtual void readChild (unsigned char& val, const char* name = 0) READ_ULONG_CHILD(unsigned char); 00391 00393 virtual void readChild (short& val, const char* name = 0) READ_LONG_CHILD(short); 00394 00396 virtual void readChild (unsigned short& val, const char* name = 0) READ_ULONG_CHILD(unsigned short); 00397 00399 virtual void readChild (int& val, const char* name = 0) READ_LONG_CHILD(int); 00400 00402 virtual void readChild (unsigned int& val, const char* name = 0) READ_ULONG_CHILD(unsigned int); 00403 00405 virtual void readChild (long& /*val*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(long&)"); 00406 00408 virtual void readChild (unsigned long& /*val*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(unsigned long&)"); 00409 00411 virtual void readChild (MLint64& /*val*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(MLint64&)"); 00412 00414 virtual void readChild (MLuint64& /*val*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(MLuint64&)"); 00415 00417 virtual void readChild (float& val, const char* name = 0) READ_LDOUBLE_CHILD(float); 00418 00420 virtual void readChild (double& val, const char* name = 0) READ_LDOUBLE_CHILD(double); 00421 00423 virtual void readChild (long double& /*val*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(long double&)"); 00424 00426 virtual void readChild (Vector2& /*vec*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(Vector2&)"); 00427 00429 virtual void readChild (Vector3& /*vec*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(Vector3&)"); 00430 00432 virtual void readChild (Vector4& /*vec*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(Vector4&)"); 00433 00435 virtual void readChild (Vector6& /*vec*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(Vector6&)"); 00436 00438 virtual void readChild (ImageVector& /*vec*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(ImageVector&)"); 00439 00441 virtual void readChild (Matrix3& /*mat*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(Matrix3&)"); 00442 00444 virtual void readChild (Matrix4& /*mat*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(Matrix4&)"); 00445 00447 virtual void readChild (SubImageBox& /*box*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(SubImageBox&)"); 00448 00450 virtual void readChild (SubImageBoxd& /*box*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(SubImageBoxd&)"); 00451 00454 virtual void readChild (void*& /*ptr*/, unsigned long& /*noBytes*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(char*&)"); 00455 00459 virtual void readChild (Base*& /*objP*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(Base*&)"); 00460 00464 virtual void readChild (Base& /*objP*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(Base&)"); 00465 00467 virtual void readChild (TreeNode*& /*node*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(TreeNode*&)"); 00468 00472 virtual void readChild (char*& /*str*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(char*&)"); 00473 00475 virtual void deleteString (char* /*str*/) const VOID_IMPLEMENTATION("deleteString(char*)"); 00476 00478 00479 00480 //----------------------------------------------------------------------------- 00485 //----------------------------------------------------------------------------- 00486 00488 00491 virtual TreeNode* readContainerChild (const char* name = 0) 00492 { 00493 ML_TRACE_IN( "TreeNode::readContainerChild ( )" ); 00494 00495 TreeNode* node = NULL; 00496 ML_TRY 00497 { 00498 readChild(node, name); 00499 } 00500 ML_CATCH_BLOCK(const TreeNodeException&) { throw; } 00501 ML_CATCH_RETHROW; 00502 return node; 00503 } 00504 00505 00507 00512 virtual Base* readBaseChild (const char* name = 0) 00513 { 00514 ML_TRACE_IN( "TreeNode::readBaseChild ( )" ); 00515 00516 Base* objP = NULL; 00517 ML_TRY 00518 { 00519 readChild(objP, name); 00520 } 00521 ML_CATCH_BLOCK(const TreeNodeException&) { throw; } 00522 ML_CATCH_RETHROW; 00523 return objP; 00524 } 00525 00527 00528 //------------------------------ 00530 //------------------------------ 00531 00533 00535 virtual void setVersion(const char* /*className*/, int /*version*/){ VOID_IMPLEMENTATION("setVersion()"); } 00536 00538 virtual int getVersion(const char* /*className*/) { VOID_IMPLEMENTATION_RET("getVersion()", 0); } 00539 00541 virtual const char* getLastReadChildName() const { VOID_IMPLEMENTATION_RET("getLastReadChildName()", NULL); } 00542 00544 bool isRootNode() const { return _isRoot; } 00545 00548 virtual char* correctName(const char* /*name*/) const { VOID_IMPLEMENTATION_RET("correctName()", NULL); } 00549 00551 virtual bool isCorrectName(const char* /*name*/) const { VOID_IMPLEMENTATION_RET("isCorrectName()", false); } 00552 00554 00555 protected: 00556 00557 00558 //---------------------------------------------------------------------------------- 00564 //---------------------------------------------------------------------------------- 00566 00570 TreeNode(ConstructionMode /*mode*/) : 00571 _isRoot(true) 00572 { 00573 ML_TRACE_IN( "TreeNode::TreeNode( )" ); 00574 } 00575 00578 TreeNode() : 00579 _isRoot(false) 00580 { 00581 ML_TRACE_IN( "TreeNode::TreeNode( )" ); 00582 } 00583 00585 00590 std::vector<TreeNode*> &_getChildTreeNodes(); 00591 00592 //--------------------------------------------- 00595 //--------------------------------------------- 00596 00598 00601 void _appendNewChild(TreeNode& newNode) { _childTreeNodes.push_back(&newNode); } 00602 00604 00605 //------------------------------------------------ 00609 //------------------------------------------------ 00610 00611 private: 00612 00613 00614 //------------------------ 00617 //------------------------ 00618 00620 00623 std::vector<TreeNode*> _childTreeNodes; 00624 00627 bool _isRoot; 00628 00630 00633 ML_ABSTRACT_CLASS_HEADER(TreeNode); 00634 00636 #undef VOID_IMPLEMENTATION 00637 #undef ADD_ULONG_CHILD 00638 #undef ADD_LONG_CHILD 00639 #undef ADD_LDOUBLE_CHILD 00640 #undef READ_ULONG_CHILD 00641 #undef READ_LONG_CHILD 00642 #undef READ_LDOUBLE_CHILD 00643 #undef READ_LONG_CHILD_FOR_BOOL 00644 00645 }; // class TreeNode 00646 00647 00648 //------------------------ 00651 //------------------------ 00652 00654 00657 #define ML_READCHILD_OPTIONAL(obj, tagName, defaultVal) \ 00658 if (parent->hasChild(tagName)) { \ 00659 parent->readChild(obj, tagName); \ 00660 } else { \ 00661 obj = defaultVal; \ 00662 } 00663 00664 00666 #define ML_ADDSTATE_VERSION(ThisClass) parent->setVersion("#ThisClass#", ThisClass::getAddStateVersion()); 00667 00670 #define ML_ADDSTATE_SUPER(SuperClass) { \ 00671 TreeNode* superClassNode = parent->addChild("_" #SuperClass); \ 00672 SuperClass::addStateToTree(superClassNode); \ 00673 } 00674 00677 #define ML_READSTATE_SUPER(SuperClass) { \ 00678 TreeNode* superClassNode = parent->readContainerChild("_" #SuperClass); \ 00679 SuperClass::readStateFromTree(superClassNode); \ 00680 } 00681 00687 00690 #define ML_TREE_NODE_SUPPORT_VIA_PERSISTENT_STATE \ 00691 virtual void addStateToTree(TreeNode* parent) const \ 00692 { \ 00693 char* state = getPersistentState(); \ 00694 if (!state){ state = "Could not read object state."; } \ 00695 parent->addChild(state, "State"); \ 00696 clearPersistentState(state); \ 00697 } \ 00698 \ 00699 virtual void readStateFromTree(TreeNode* parent) \ 00700 { \ 00701 char* state; \ 00702 parent->readChild(state, "State"); \ 00703 setPersistentState(state); \ 00704 parent->deleteString(state); \ 00705 } 00706 00707 00708 ML_END_NAMESPACE 00709 00710 #ifdef _MSC_VER 00711 #pragma warning(pop) 00712 #endif 00713 00714 #endif // __mlTreeNode_H 00715 00716