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_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