00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef FSF_HANDLE_H
00030 #define FSF_HANDLE_H
00031
00032
00033
00034
00035 #include "FsfNode.h"
00036 #include "FsfPulse.h"
00037
00038 #include <list>
00039 #include <algorithm>
00040
00041 namespace fsf{
00042
00060
00061
00064 class CPassiveHandle{
00065 private:
00066 std::list<CPassiveHandle*> m_listChildren;
00067 CNode *m_pNode;
00068 long m_nHandleID;
00069
00074
00075
00076 void setNode(CNode *pNode) { if(m_pNode) m_pNode->decNbHandleRefs(); m_pNode=pNode; if(m_pNode) m_pNode->incNbHandleRefs(); }
00078 void releaseNode() { if(m_pNode) { m_pNode->decNbHandleRefs(); m_pNode=NULL; } }
00080
00081 public:
00083
00084
00085 CPassiveHandle() : m_pNode(NULL) {}
00087 CPassiveHandle(CNode *pNode, long nHandleID) : m_pNode(pNode), m_nHandleID(nHandleID) { if(m_pNode) m_pNode->incNbHandleRefs(); }
00089 CPassiveHandle(const CPassiveHandle &h);
00091 ~CPassiveHandle(){
00092 if(m_pNode) { m_pNode->decNbHandleRefs();}
00093
00094 std::for_each(m_listChildren.begin(),m_listChildren.end(),DeleteObject());
00095 }
00096
00098
00099
00100 CNode *getNode() const { return m_pNode; }
00102 long getHandleID() const { return m_nHandleID; }
00104 void getChildren(std::list<CPassiveHandle*> &listHandles) { listHandles.insert(listHandles.end(),m_listChildren.begin(),m_listChildren.end()); }
00106
00107
00109
00110
00111 void setHandleID(long nID) { m_nHandleID=nID; }
00113 void addChild(CPassiveHandle *pHandle) { m_listChildren.push_back(pHandle); }
00116 void spliceChildren(std::list<CPassiveHandle*> &listHandles) { m_listChildren.splice(m_listChildren.end(),listHandles,listHandles.begin(),listHandles.end()); }
00122 void addChildren(std::list<CPassiveHandle*> &listHandles) { m_listChildren.insert(m_listChildren.end(),listHandles.begin(),listHandles.end()); }
00124 void deleteChildren();
00126
00127 };
00128
00131 class CActiveHandle{
00132 private:
00133 std::list<CActiveHandle*> m_listChildren;
00134 CNode *m_pNode;
00135 long m_nHandleID;
00136
00139
00140
00141 void setNode(CNode *pNode) { m_pNode=pNode; }
00143 void releaseNode() { m_pNode=NULL; }
00145
00146
00147 public:
00149
00150
00151 CActiveHandle() : m_pNode(NULL), m_nHandleID(-1) {}
00153 CActiveHandle(CNode *pNode, long nHandleID) : m_pNode(pNode), m_nHandleID(nHandleID) {}
00155 CActiveHandle(const CActiveHandle &h);
00157 ~CActiveHandle() {
00158 std::for_each(m_listChildren.begin(),m_listChildren.end(),DeleteObject());
00159 }
00161
00163
00164
00165 CNode *getNode() const { return m_pNode; }
00167 long getHandleID() const { return m_nHandleID; }
00169 void getChildren(std::list<CActiveHandle*> &listHandles){
00170 listHandles.insert(listHandles.end(),m_listChildren.begin(),m_listChildren.end());
00171 }
00173
00175
00176
00177 void addChild(CActiveHandle *pHandle) { m_listChildren.push_back(pHandle); }
00183 void addChildren(std::list<CActiveHandle*> &listHandles){
00184 m_listChildren.insert(m_listChildren.end(),listHandles.begin(),listHandles.end());
00185 }
00187 void deleteChildren();
00189 };
00190
00191 }
00192
00193 #endif // FSF_HANDLE_H