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_ReadingVec2, 00066 TNE_ReadingVec3, 00067 TNE_ReadingVec4, 00068 TNE_ReadingVec6, 00069 TNE_ReadingVector, 00070 TNE_ReadingMat3, 00071 TNE_ReadingMat4, 00072 TNE_ReadingSubImgBox, 00073 TNE_ReadingSubImgBoxf, 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 00088 00089 00090 //--------------------------------------------------------------------------------- 00100 //--------------------------------------------------------------------------------- 00101 class MLEXPORT TreeNodeException 00102 { 00103 00104 public: 00105 00108 00112 TreeNodeException(int errorCode = 0, const char* msg = 0) { _errorCode = errorCode; _errorMsg = msg; } 00113 00115 virtual ~TreeNodeException() { } 00116 00118 int getCode() const { return _errorCode; } 00119 00121 00126 virtual const char* getMessage() const; 00127 00128 protected: 00129 00131 int _errorCode; 00132 00134 const char* _errorMsg; 00135 00136 private: 00137 00140 static const char* _stdErrorMsg[]; 00141 00144 ML_CLASS_HEADER(TreeNodeException); 00145 }; 00146 00147 00150 00157 class MLEXPORT TreeNode { 00158 00159 00160 public: 00161 00162 // Define macros for default implementations: 00163 00165 #define VOID_IMPLEMENTATION(which) { throw TreeNodeException(TNE_VoidImplementation, which); } 00166 00171 #define VOID_IMPLEMENTATION_RET(which, R) { if (MLAlwaysTrue){ throw TreeNodeException(TNE_VoidImplementation, which); } return R; } 00172 00174 #define ADD_LONG_CHILD { addChild(static_cast<long>(val), name); } 00175 00177 #define ADD_ULONG_CHILD { addChild(static_cast<unsigned long>(val), name); } 00178 00180 #define ADD_LDOUBLE_CHILD { addChild(static_cast<long double>(val), name); } 00181 00182 #if 0 00183 00184 00185 #define READ_LONG_CHILD(DST_TYPE) { long lval=0; readChild(lval, name); val = static_cast<DST_TYPE>(lval); } 00186 00189 #define READ_ULONG_CHILD(DST_TYPE) { unsigned long lval=0; readChild(lval, name); val = static_cast<DST_TYPE>(lval); } 00190 00193 #define READ_LDOUBLE_CHILD(DST_TYPE){ long double ldval=0; readChild(ldval, name); val = ldval; } 00194 #else 00195 00198 #define READ_LONG_CHILD { long lval=0; readChild(lval, name); val = lval; } 00199 00202 #define READ_ULONG_CHILD { unsigned long lval=0; readChild(lval, name); val = lval; } 00203 00206 #define READ_LDOUBLE_CHILD { long double ldval=0; readChild(ldval, name); val = ldval; } 00207 #endif 00208 00211 #define READ_LONG_CHILD_FOR_BOOL { long lval=0; readChild(lval, name); val = (lval!=0); } 00212 00213 00215 typedef enum { 00216 00218 CM_writerRoot, 00219 00221 CM_readerRoot, 00222 00224 CM_COUNT 00225 00226 } ConstructionMode; 00227 00228 00230 virtual ~TreeNode(); 00231 00232 //-------------------------------------------------------------- 00236 //-------------------------------------------------------------- 00237 00239 00241 virtual void writeToFile (const char* /*fileName*/) VOID_IMPLEMENTATION("writeToFile"); 00242 00244 virtual void readFromFile (const char* /*fileName*/) VOID_IMPLEMENTATION("readFromFile"); 00245 00247 00250 virtual void writeToString (char*& /*str*/) VOID_IMPLEMENTATION("writeToString"); 00251 00253 00256 virtual void readFromString (const char* /*str*/) VOID_IMPLEMENTATION("readFromString"); 00257 00259 00260 //------------------------------------------------------------------------------------------ 00271 //------------------------------------------------------------------------------------------ 00272 00274 00276 virtual void addChild (bool val , const char* name ) ADD_ULONG_CHILD; 00277 00279 virtual void addChild (unsigned char val , const char* name ) ADD_ULONG_CHILD; 00280 00282 virtual void addChild (char val , const char* name ) ADD_LONG_CHILD; 00283 00285 virtual void addChild (unsigned short val , const char* name ) ADD_ULONG_CHILD; 00286 00288 virtual void addChild (short val , const char* name ) ADD_LONG_CHILD; 00289 00291 virtual void addChild (unsigned int val , const char* name ) ADD_ULONG_CHILD; 00292 00294 virtual void addChild (int val , const char* name ) ADD_LONG_CHILD; 00295 00297 virtual void addChild (unsigned long /*val*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(unsigned long)"); 00298 00300 virtual void addChild (long /*val*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(long)"); 00301 00303 virtual void addChild (MLuint64 /*val*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(MLuint64)"); 00304 00306 virtual void addChild (MLint64 /*val*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(MLint64)"); 00307 00309 virtual void addChild (float val , const char* name ) ADD_LDOUBLE_CHILD; 00310 00312 virtual void addChild (double val , const char* name ) ADD_LDOUBLE_CHILD; 00313 00315 virtual void addChild (long double /*val*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(long double)"); 00316 00318 virtual void addChild (const char* const /*str*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(const char* const)"); 00319 00321 virtual void addChild (const Vector2& /*vec*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(Vector2)"); 00322 00324 virtual void addChild (const Vector3& /*vec*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(Vector3)"); 00325 00327 virtual void addChild (const Vector4& /*vec*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(Vector4)"); 00328 00330 virtual void addChild (const Vector6& /*vec*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(Vector6)"); 00331 00333 virtual void addChild (const ImageVector& /*vec*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(ImageVector)"); 00334 00336 virtual void addChild (const Matrix3& /*mat*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(Matrix3)"); 00337 00339 virtual void addChild (const Matrix4& /*mat*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(Matrix4)"); 00340 00342 virtual void addChild (const SubImageBox& /*box*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(SubImageBox)"); 00343 00345 virtual void addChild (const SubImageBoxd& /*box*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(SubImageBoxd)"); 00346 00349 virtual void addChild (const void* const /*ptr*/, size_t /*noBytes*/, const char* /*name*/) VOID_IMPLEMENTATION("addChild(void*)"); 00350 00352 00355 virtual void addChild (const Base* const /*obj*/, const char* /*name*/, bool /*generic*/ = true) VOID_IMPLEMENTATION("addChild(Base*)"); 00356 00358 00361 virtual TreeNode* addChild (const char* /*name*/) VOID_IMPLEMENTATION_RET("TreeNode* addChild()", NULL); 00362 00364 00365 00366 00367 00368 //-------------------------------------------------------------------------------------------- 00374 //-------------------------------------------------------------------------------------------- 00375 00377 00382 virtual bool hasChild (const char* /*tagName*/ = 0) VOID_IMPLEMENTATION_RET("TreeNode* hasChild()", false); 00383 00384 00385 00387 virtual void readChild (bool& val, const char* name = 0) READ_LONG_CHILD_FOR_BOOL; 00388 00389 #if 0 00390 00391 virtual void readChild (char& val, const char* name = 0) READ_LONG_CHILD(char); 00392 00394 virtual void readChild (unsigned char& val, const char* name = 0) READ_ULONG_CHILD(unsigned char); 00395 00397 virtual void readChild (short& val, const char* name = 0) READ_LONG_CHILD(short); 00398 00400 virtual void readChild (unsigned short& val, const char* name = 0) READ_ULONG_CHILD(unsigned short); 00401 00403 virtual void readChild (int& val, const char* name = 0) READ_LONG_CHILD(int); 00404 00406 virtual void readChild (unsigned int& val, const char* name = 0) READ_ULONG_CHILD(unsigned int); 00407 00409 virtual void readChild (long& /*val*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(long&)"); 00410 00412 virtual void readChild (unsigned long& /*val*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(unsigned long&)"); 00413 00415 virtual void readChild (MLint64& /*val*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(MLint64&)"); 00416 00418 virtual void readChild (MLuint64& /*val*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(MLuint64&)"); 00419 00421 virtual void readChild (float& val, const char* name = 0) READ_LDOUBLE_CHILD(float); 00422 00424 virtual void readChild (double& val, const char* name = 0) READ_LDOUBLE_CHILD(double); 00425 #else 00426 00427 virtual void readChild (char& val, const char* name = 0) READ_LONG_CHILD; 00428 00430 virtual void readChild (unsigned char& val, const char* name = 0) READ_ULONG_CHILD; 00431 00433 virtual void readChild (short& val, const char* name = 0) READ_LONG_CHILD; 00434 00436 virtual void readChild (unsigned short& val, const char* name = 0) READ_ULONG_CHILD; 00437 00439 virtual void readChild (int& val, const char* name = 0) READ_LONG_CHILD; 00440 00442 virtual void readChild (unsigned int& val, const char* name = 0) READ_ULONG_CHILD; 00443 00445 virtual void readChild (long& /*val*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(long&)"); 00446 00448 virtual void readChild (unsigned long& /*val*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(unsigned long&)"); 00449 00451 virtual void readChild (MLint64& /*val*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(MLint64&)"); 00452 00454 virtual void readChild (MLuint64& /*val*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(MLuint64&)"); 00455 00457 virtual void readChild (float& val, const char* name = 0) READ_LDOUBLE_CHILD; 00458 00460 virtual void readChild (double& val, const char* name = 0) READ_LDOUBLE_CHILD; 00461 #endif 00462 00463 virtual void readChild (long double& /*val*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(long double&)"); 00464 00466 virtual void readChild (Vector2& /*vec*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(Vector2&)"); 00467 00469 virtual void readChild (Vector3& /*vec*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(Vector3&)"); 00470 00472 virtual void readChild (Vector4& /*vec*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(Vector4&)"); 00473 00475 virtual void readChild (Vector6& /*vec*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(Vector6&)"); 00476 00478 virtual void readChild (ImageVector& /*vec*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(ImageVector&)"); 00479 00481 virtual void readChild (Matrix3& /*mat*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(Matrix3&)"); 00482 00484 virtual void readChild (Matrix4& /*mat*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(Matrix4&)"); 00485 00487 virtual void readChild (SubImageBox& /*box*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(SubImageBox&)"); 00488 00490 virtual void readChild (SubImageBoxd& /*box*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(SubImageBoxd&)"); 00491 00494 virtual void readChild (void*& /*ptr*/, unsigned long& /*noBytes*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(char*&)"); 00495 00499 virtual void readChild (Base*& /*objP*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(Base*&)"); 00500 00504 virtual void readChild (Base& /*objP*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(Base&)"); 00505 00507 virtual void readChild (TreeNode*& /*node*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(TreeNode*&)"); 00508 00512 virtual void readChild (char*& /*str*/, const char* /*name*/ = 0) VOID_IMPLEMENTATION("readChild(char*&)"); 00513 00515 virtual void deleteString (char* /*str*/) const VOID_IMPLEMENTATION("deleteString(char*)"); 00516 00518 00519 00520 //----------------------------------------------------------------------------- 00525 //----------------------------------------------------------------------------- 00526 00528 00531 virtual TreeNode* readContainerChild (const char* name = 0) 00532 { 00533 ML_TRACE_IN( "TreeNode::readContainerChild ( )" ); 00534 00535 TreeNode* node = NULL; 00536 ML_TRY 00537 { 00538 readChild(node, name); 00539 } 00540 ML_CATCH_BLOCK(const TreeNodeException&) { throw; } 00541 ML_CATCH_RETHROW; 00542 return node; 00543 } 00544 00545 00547 00552 virtual Base* readBaseChild (const char* name = 0) 00553 { 00554 ML_TRACE_IN( "TreeNode::readBaseChild ( )" ); 00555 00556 Base* objP = NULL; 00557 ML_TRY 00558 { 00559 readChild(objP, name); 00560 } 00561 ML_CATCH_BLOCK(const TreeNodeException&) { throw; } 00562 ML_CATCH_RETHROW; 00563 return objP; 00564 } 00565 00567 00568 //------------------------------ 00570 //------------------------------ 00571 00573 00575 virtual void setVersion(const char* /*className*/, int /*version*/){ VOID_IMPLEMENTATION("setVersion()"); } 00576 00578 virtual int getVersion(const char* /*className*/) { VOID_IMPLEMENTATION_RET("getVersion()", 0); } 00579 00581 virtual const char* getLastReadChildName() const { VOID_IMPLEMENTATION_RET("getLastReadChildName()", NULL); } 00582 00584 bool isRootNode() const { return _isRoot; } 00585 00588 virtual char* correctName(const char* /*name*/) const { VOID_IMPLEMENTATION_RET("correctName()", NULL); } 00589 00591 virtual bool isCorrectName(const char* /*name*/) const { VOID_IMPLEMENTATION_RET("isCorrectName()", false); } 00592 00594 00595 protected: 00596 00597 00598 //---------------------------------------------------------------------------------- 00604 //---------------------------------------------------------------------------------- 00606 00610 TreeNode(ConstructionMode /*mode*/) : 00611 _isRoot(true) 00612 { 00613 ML_TRACE_IN( "TreeNode::TreeNode( )" ); 00614 } 00615 00618 TreeNode() : 00619 _isRoot(false) 00620 { 00621 ML_TRACE_IN( "TreeNode::TreeNode( )" ); 00622 } 00623 00625 00630 std::vector<TreeNode*> &_getChildTreeNodes(); 00631 00632 //--------------------------------------------- 00635 //--------------------------------------------- 00636 00638 00641 void _appendNewChild(TreeNode& newNode) { _childTreeNodes.push_back(&newNode); } 00642 00644 00645 //------------------------------------------------ 00649 //------------------------------------------------ 00650 00651 private: 00652 00653 00654 //------------------------ 00657 //------------------------ 00658 00660 00663 std::vector<TreeNode*> _childTreeNodes; 00664 00667 bool _isRoot; 00668 00670 00673 ML_ABSTRACT_CLASS_HEADER(TreeNode); 00674 00676 #undef VOID_IMPLEMENTATION 00677 #undef ADD_ULONG_CHILD 00678 #undef ADD_LONG_CHILD 00679 #undef ADD_LDOUBLE_CHILD 00680 #undef READ_ULONG_CHILD 00681 #undef READ_LONG_CHILD 00682 #undef READ_LDOUBLE_CHILD 00683 #undef READ_LONG_CHILD_FOR_BOOL 00684 00685 }; // class TreeNode 00686 00687 00688 //------------------------ 00691 //------------------------ 00692 00694 00697 #define ML_READCHILD_OPTIONAL(obj, tagName, defaultVal) \ 00698 if (parent->hasChild(tagName)) { \ 00699 parent->readChild(obj, tagName); \ 00700 } else { \ 00701 obj = defaultVal; \ 00702 } 00703 00704 00706 #define ML_ADDSTATE_VERSION(ThisClass) parent->setVersion("#ThisClass#", ThisClass::getAddStateVersion()); 00707 00710 #define ML_ADDSTATE_SUPER(SuperClass) { \ 00711 TreeNode* superClassNode = parent->addChild("_" #SuperClass); \ 00712 SuperClass::addStateToTree(superClassNode); \ 00713 } 00714 00717 #define ML_READSTATE_SUPER(SuperClass) { \ 00718 TreeNode* superClassNode = parent->readContainerChild("_" #SuperClass); \ 00719 SuperClass::readStateFromTree(superClassNode); \ 00720 } 00721 00727 00730 #define ML_TREE_NODE_SUPPORT_VIA_PERSISTENT_STATE \ 00731 virtual void addStateToTree(TreeNode* parent) const \ 00732 { \ 00733 char* state = getPersistentState(); \ 00734 if (!state){ state = "Could not read object state."; } \ 00735 parent->addChild(state, "State"); \ 00736 clearPersistentState(state); \ 00737 } \ 00738 \ 00739 virtual void readStateFromTree(TreeNode* parent) \ 00740 { \ 00741 char* state; \ 00742 parent->readChild(state, "State"); \ 00743 setPersistentState(state); \ 00744 parent->deleteString(state); \ 00745 } 00746 00747 00748 ML_END_NAMESPACE 00749 00750 #ifdef _MSC_VER 00751 #pragma warning(pop) 00752 #endif 00753 00754 #endif // __mlTreeNode_H 00755 00756