ML Reference
MeVis/Foundation/Sources/ML/include/mlTreeNode.h
Go to the documentation of this file.
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