home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / Software / TemaCD / tcvpa / data1.cab / MyFileGroup / INCLUDE / ObjBind.hpp < prev    next >
C/C++ Source or Header  |  1999-06-03  |  17KB  |  609 lines

  1. #ifndef _INC_OBJBIND_HPP
  2. #define _INC_OBJBIND_HPP
  3. class TC_CPsInstID;
  4. class TC_CPsInstance;
  5. class TC_CPsObject;
  6.  
  7. class TC_CPsCollection;
  8. template <class T> class TC_TPsArray;
  9. template <class T> class TC_TPsSortedArray;
  10.  
  11. class TC_CPsRef;
  12. template <class T> class TC_TPsRef;
  13.  
  14. class TC_CPsDemRef;
  15. template <class T> class TC_TPsDemRef;
  16. #define TC_PS_ID TC_CPsInstID
  17. #define TC_PS_NULL_OID    0
  18. enum  {
  19.  dem_NoResolve = 1,
  20. };
  21. #define TC_PSGetNoResolve(o)    Get((o),dem_NoResolve)
  22. #define TC_PS_OBJSTATE_NEW        0x00000001L
  23. #define TC_PS_OBJSTATE_DELETED    0x00000002L
  24. #define TC_PS_OBJSTATE_DIRTY    0x00000004L
  25. enum TCPsRefStat {
  26.  ref_UnResolved,
  27.  ref_UnAssigned,
  28.  ref_Assigned,
  29. };
  30.  
  31. // **********************************************************************
  32. class TC_PS_EXPORT TC_CPsInstID 
  33. {
  34. public:  TCPsHClass m_hClass ;
  35. public:  ULONG m_oid ;
  36. public:   TC_CPsInstID ()  ;
  37. public:   TC_CPsInstID (TCPsHClass cl, ULONG oid)  ;
  38. public:   TC_CPsInstID (ULONG cid, ULONG oid)  ;
  39. public:  ULONG GetCID ()  ;
  40. public:  BOOL IsValid ()  ;
  41. public:   operator BOOL ()  ;
  42. public:  void Set (TCPsHClass cl, ULONG oid)  ;
  43. public:  void Set (ULONG cid, ULONG oid)  ;
  44. public:  void Clear ()  ;
  45. public:  BOOL operator == (TC_CPsInstID &inst_id)  ;
  46. public:  BOOL operator == (TC_CPsInstID * inst_id)  ;
  47.  
  48. }; // end of class TC_CPsInstID
  49.  
  50. // **********************************************************************
  51.  
  52. // **********************************************************************
  53. class TC_PS_EXPORT TC_CPsInstance 
  54. {
  55. friend class PsInstMgr;
  56. friend class PsObjGraph;
  57.  
  58. protected:  TC_CPsInstID m_InstID ;
  59. public:  void SetOID ( ULONG oid)  ;
  60. public:  ULONG GetOID ()  ;
  61. public:  ULONG GetCID ()  ;
  62. protected: virtual void SetClass (TCPsHClass hClass)  ;
  63. public:  TCPsHClass HClass ()  ;
  64. public:  TC_CPsInstID * GetInstID ()  ;
  65. public:   TC_CPsInstance ()  ;
  66. public:   TC_CPsInstance (TC_CPsInstID & inst_id)  ;
  67. public:   TC_CPsInstance (TCPsHClass cl, ULONG oid)  ;
  68.  
  69. }; // end of class TC_CPsInstance
  70.  
  71. // **********************************************************************
  72.  
  73. // **********************************************************************
  74. class TC_PS_EXPORT TC_CPsObject 
  75.     : public TC_CPsInstance
  76. {
  77. friend class TC_CPsTxRsc;
  78. friend class PsObjGraph;
  79. friend class TC_CPsResSet;
  80. friend class TC_CPsRef;
  81. private:
  82.     TC_CPsObject& operator = (const TC_CPsObject&);
  83.     TC_CPsObject (const TC_CPsObject&); 
  84. private:  int m_RefCount ;
  85.  
  86. // **********************************************************************
  87. protected: 
  88. class TC_PS_EXPORT RelOIDSet 
  89. {
  90.  
  91. // **********************************************************************
  92. public: 
  93. class TC_PS_EXPORT RelOID 
  94. {
  95. public:  ULONG m_oid ;
  96. public:  char * m_AttrName ;
  97. public:   RelOID (char * attr_name)  ;
  98.  
  99. }; // end of class RelOID
  100.  
  101. // **********************************************************************
  102. private:  TC_TArrayPTR <class RelOID> m_RelOIDs ;
  103. public:   RelOIDSet ()  ;
  104. public:  void Create (TCPsHClass hClass)  ;
  105. public:  BOOL SetOID (char * attr_name, ULONG id)  ;
  106. public:  ULONG GetOID (char * attr_name)  ;
  107.  
  108. }; // end of class RelOIDSet
  109.  
  110. // **********************************************************************
  111.  
  112. // **********************************************************************
  113. private: 
  114. class TC_PS_EXPORT SmartRefs 
  115. {
  116. private:  TC_TArrayPTR <TC_CPsRef> m_Refs ;
  117. public:   SmartRefs ()  ;
  118. public:  void UnrefAll ()  ;
  119. public:  void Add (TC_CPsRef * ref)  ;
  120. public:  void Remove (TC_CPsRef * ref)  ;
  121. public:  int Count ()  ;
  122. public:  void Trace ()  ;
  123.  
  124. }; // end of class SmartRefs
  125.  
  126. // **********************************************************************
  127. private:  BOOL m_Registered ;
  128. private:  ULONG m_State ;
  129. private:  BOOL m_IsDeep ;
  130. private:  SmartRefs m_SmartRefs ;
  131. protected:  RelOIDSet m_RelOIDSet ;
  132. public:   TC_CPsObject ()  ;
  133. public: virtual  ~TC_CPsObject ()  ;
  134. protected:  void SetClass (TCPsHClass hClass)  ;
  135. private:  void AddSmartRef (TC_CPsRef * ref)  ;
  136. private:  void RemoveSmartRef (TC_CPsRef * ref)  ;
  137. public:  int SmartRefCount ()  ;
  138. public:  void RemoveRef ()  ;
  139. public:  void AddRef ()  ;
  140. public:  int RefCount ()  ;
  141. public:  TC_CPsClassInfo GetClassInfo ()  ;
  142. public:  BOOL IsModified ()  ;
  143. public:  BOOL IsNew ()  ;
  144. public:  TCPsRetCode SetModified (TCPsSetOpt setOpt = opt_Set)  ;
  145. public:  ULONG GetState ()  ;
  146. public:  TC_CString InfoStr ()  ;
  147. public:  void Trace (char * title = "")  ;
  148. public:  BOOL SetRelOID (char * attr_name, ULONG id)  ;
  149. public:  ULONG GetRelOID (char * attr_name)  ;
  150. public: virtual void OnRestore ()  ;
  151. public: virtual TCPsRetCode Store (TCPsDepthMode depth = Depth_Default) TC_PS_THROW_FUNC ;
  152. public: virtual TCPsRetCode Remove () TC_PS_THROW_FUNC ;
  153.  
  154. }; // end of class TC_CPsObject
  155.  
  156. // **********************************************************************
  157.  
  158. // **********************************************************************
  159. class TC_PS_EXPORT TC_CPsRef 
  160. {
  161. friend class TC_CPsObject::SmartRefs;
  162. private:  TC_CPsObject * m_Object ;
  163. public: static void Ref (TC_CPsRef & ref)  ;
  164. public: static void UnRef (TC_CPsRef & ref)  ;
  165. public: static void Assign (TC_CPsRef & ref, TC_CPsObject * obj)  ;
  166.  
  167. }; // end of class TC_CPsRef
  168.  
  169. // **********************************************************************
  170.  
  171. // **********************************************************************
  172.  template <class T>
  173. class TC_TPsRef 
  174. {
  175. private:  T * m_Object ;
  176. public:   TC_TPsRef ( T * obj = 0) 
  177. {
  178. m_Object = obj;
  179. TC_CPsRef::Ref(*this);
  180.  
  181.  
  182.  
  183.     
  184.  
  185.  
  186.  
  187. } // end of func
  188. // **********************************************************************
  189.  
  190. public:   TC_TPsRef (TC_TPsRef<T>  &ps_ref) 
  191. {
  192. m_Object = ps_ref.m_Object;
  193. TC_CPsRef::Ref(*this);
  194.  
  195.  
  196.  
  197.     
  198.  
  199.  
  200.  
  201. } // end of func
  202. // **********************************************************************
  203.  
  204. public:   ~TC_TPsRef () 
  205. {
  206. TC_CPsRef::UnRef(*this);
  207.  
  208.     
  209. } // end of func
  210. // **********************************************************************
  211.  
  212. public:  T* operator-> () 
  213. {
  214. return m_Object;
  215. } // end of func
  216. // **********************************************************************
  217.  
  218. public:  TC_TPsRef<T> & operator = (TC_TPsRef<T> &ps_ref) 
  219. {
  220. TC_CPsRef::Assign(*this, ps_ref.m_Object);
  221. return *this;
  222.  
  223. } // end of func
  224. // **********************************************************************
  225.  
  226. public:  TC_TPsRef<T> & operator = (T * obj) 
  227. {
  228. TC_CPsRef::Assign(*this, obj);
  229. return *this;
  230.  
  231. } // end of func
  232. // **********************************************************************
  233.  
  234. public:   operator T* () 
  235. {
  236. return m_Object;
  237. } // end of func
  238. // **********************************************************************
  239.  
  240. public:   operator TC_CPsRef& () 
  241. {
  242. return *(TC_CPsRef*)this;
  243. } // end of func
  244. // **********************************************************************
  245.  
  246. public:  BOOL operator == (T* obj) 
  247. {
  248. return m_Object == obj;
  249. } // end of func
  250. // **********************************************************************
  251.  
  252. public:  BOOL operator == (TC_TPsRef<T> &ps_ref) 
  253. {
  254. return m_Object == ps_ref.m_Object;
  255. } // end of func
  256. // **********************************************************************
  257.  
  258. public:  BOOL operator != (T* obj) 
  259. {
  260. return m_Object != obj;
  261. } // end of func
  262. // **********************************************************************
  263.  
  264. public:  BOOL operator != (TC_TPsRef<T> &ps_ref) 
  265. {
  266. return m_Object != ps_ref.m_Object;
  267. } // end of func
  268. // **********************************************************************
  269.  
  270.  
  271. }; // end of class TC_TPsRef
  272.  
  273. // **********************************************************************
  274.  
  275. // **********************************************************************
  276. class TC_PS_EXPORT TC_CPsCollection 
  277. {
  278. public: virtual  ~TC_CPsCollection ()  ;
  279. public: virtual TC_CPsObject * GetObject (int idx)  =0 ;
  280. public: virtual int AddObject (TC_CPsObject * obj)  =0 ;
  281. public: virtual void RemoveObject (TC_CPsObject * obj)  =0 ;
  282. public: virtual void RemoveObject (int idx)  =0 ;
  283. public: virtual void Release ()  ;
  284. public: virtual void SetImpl (void * impl)  =0 ;
  285. public: virtual void * GetImpl ()  =0 ;
  286. public: virtual void * CreateImpl ()  =0 ;
  287. public: virtual void CreatePrivateImpl ()  =0 ;
  288. public: virtual TC_CPsCollection * Copy ()  =0 ;
  289. public: virtual int Count ()  =0 ;
  290. public: virtual int ContainsInstance (TC_CPsInstID inst_id)  ;
  291. public: virtual int ContainsObject (TC_CPsObject * obj)  ;
  292.  
  293. }; // end of class TC_CPsCollection
  294.  
  295. // **********************************************************************
  296.  
  297. // **********************************************************************
  298.  template <class T>
  299. class TC_TPsArray 
  300.     : public TC_CPsCollection
  301. {
  302. typedef TC_TArrayPTR <T> ObjPtrCltn;
  303. protected:  ObjPtrCltn * m_Cltn ;
  304. protected:  BOOL m_Own ;
  305. public:   TC_TPsArray () 
  306. {
  307. m_Cltn = 0;
  308. m_Own = FALSE;
  309. } // end of func
  310. // **********************************************************************
  311.  
  312. public:   TC_TPsArray ( ObjPtrCltn * cltn) 
  313. {
  314. m_Cltn = cltn;
  315. m_Own = FALSE;
  316. } // end of func
  317. // **********************************************************************
  318.  
  319. public:   ~TC_TPsArray () 
  320. {
  321. Clear();
  322. } // end of func
  323. // **********************************************************************
  324.  
  325. private:  void Clear () 
  326. {
  327. if(m_Own) {
  328.     Release();
  329.     delete m_Cltn;
  330. }
  331. } // end of func
  332. // **********************************************************************
  333.  
  334. public:  TC_CPsObject * GetObject (int idx) 
  335. {
  336. return m_Cltn->Get(idx);
  337. } // end of func
  338. // **********************************************************************
  339.  
  340. public:  int AddObject (TC_CPsObject * obj) 
  341. {
  342. return m_Cltn->Add((T*)obj);
  343. } // end of func
  344. // **********************************************************************
  345.  
  346. public:  void RemoveObject (TC_CPsObject * obj) 
  347. {
  348. m_Cltn->Remove((T*)obj);
  349. } // end of func
  350. // **********************************************************************
  351.  
  352. public:  void RemoveObject (int idx) 
  353. {
  354. m_Cltn->Remove(idx);
  355. } // end of func
  356. // **********************************************************************
  357.  
  358. public:  void SetImpl (void * impl) 
  359. {
  360. Clear();
  361. m_Own = FALSE;
  362. m_Cltn = (ObjPtrCltn*)impl;
  363. } // end of func
  364. // **********************************************************************
  365.  
  366. public:  void * GetImpl () 
  367. {
  368. return m_Cltn;
  369. } // end of func
  370. // **********************************************************************
  371.  
  372. public:  void * CreateImpl () 
  373. {
  374. return new ObjPtrCltn;
  375. } // end of func
  376. // **********************************************************************
  377.  
  378. public:  void CreatePrivateImpl () 
  379. {
  380. Clear();
  381. m_Own = TRUE;
  382. m_Cltn = new ObjPtrCltn;
  383.  
  384. } // end of func
  385. // **********************************************************************
  386.  
  387. public:  TC_CPsCollection * Copy () 
  388. {
  389. return new TC_TPsArray<T>;
  390. } // end of func
  391. // **********************************************************************
  392.  
  393. public:  int Count () 
  394. {
  395. return m_Cltn->Count();
  396. } // end of func
  397. // **********************************************************************
  398.  
  399. public:  T * operator [] (int idx) 
  400. {
  401. return (T*)GetObject(idx);
  402.  
  403. } // end of func
  404. // **********************************************************************
  405.  
  406.  
  407. }; // end of class TC_TPsArray
  408.  
  409. // **********************************************************************
  410.  
  411. // **********************************************************************
  412.  template <class T>
  413. class TC_TPsSortedArray 
  414.     : public TC_CPsCollection
  415. {
  416. typedef TC_TPtrMap <T, T>  ObjPtrMap;
  417. typedef int (*CMP_FUNC)(const T*, const T*);
  418. protected:  ObjPtrMap * m_Map ;
  419. protected:  BOOL m_Own ;
  420. protected:  CMP_FUNC m_CmpFunc ;
  421. public:   TC_TPsSortedArray (CMP_FUNC cmp_func) 
  422. {
  423. m_Map = 0;
  424. m_Own = FALSE;
  425. m_CmpFunc = cmp_func;
  426. } // end of func
  427. // **********************************************************************
  428.  
  429. public:   TC_TPsSortedArray ( ObjPtrMap * map) 
  430. {
  431. m_Map = map;
  432. m_Own = FALSE;
  433. m_CmpFunc = (CMP_FUNC)map->GetCmpFunc();
  434.  
  435.  
  436. } // end of func
  437. // **********************************************************************
  438.  
  439. public:   ~TC_TPsSortedArray () 
  440. {
  441. Clear();
  442. } // end of func
  443. // **********************************************************************
  444.  
  445. private:  void Clear () 
  446. {
  447. if(m_Own) {
  448.     Release();
  449.     delete m_Map;
  450. }
  451. } // end of func
  452. // **********************************************************************
  453.  
  454. public:  TC_CPsObject * GetObject (int idx) 
  455. {
  456. return m_Map->ValByIdx(idx);
  457. } // end of func
  458. // **********************************************************************
  459.  
  460. public:  int AddObject (TC_CPsObject * obj) 
  461. {
  462. return m_Map->InsertAssoc((T*)obj,(T*)obj);
  463. //return m_Map->GetCurPos();
  464. } // end of func
  465. // **********************************************************************
  466.  
  467. public:  void RemoveObject (TC_CPsObject * obj) 
  468. {
  469. m_Map->RemoveAssoc((T*)obj);
  470. } // end of func
  471. // **********************************************************************
  472.  
  473. public:  void RemoveObject (int idx) 
  474. {
  475. m_Map->RemoveByIdx(idx);
  476. } // end of func
  477. // **********************************************************************
  478.  
  479. public:  void SetImpl (void * impl) 
  480. {
  481. Clear();
  482. m_Own = FALSE;
  483. m_Map = (ObjPtrMap*)impl;
  484. } // end of func
  485. // **********************************************************************
  486.  
  487. public:  void * GetImpl () 
  488. {
  489. return m_Map;
  490. } // end of func
  491. // **********************************************************************
  492.  
  493. public:  void * CreateImpl () 
  494. {
  495. return new ObjPtrMap((TC_TPtrMap<T,T>::MapCmpFunc)m_CmpFunc);
  496. } // end of func
  497. // **********************************************************************
  498.  
  499. public:  void CreatePrivateImpl () 
  500. {
  501. Clear();
  502. m_Own = TRUE;
  503. m_Map = new ObjPtrMap(m_CmpFunc);
  504.  
  505. } // end of func
  506. // **********************************************************************
  507.  
  508. public:  TC_CPsCollection * Copy () 
  509. {
  510. return new TC_TPsSortedArray<T>(m_CmpFunc);
  511. } // end of func
  512. // **********************************************************************
  513.  
  514. public:  int Count () 
  515. {
  516. return m_Map->Count();
  517. } // end of func
  518. // **********************************************************************
  519.  
  520. public:  int ContainsObject (TC_CPsObject * obj) 
  521. {
  522. if(m_Map->Search((T*)obj)==0)
  523.     return m_Map->GetCurPos();
  524. return -1;
  525. } // end of func
  526. // **********************************************************************
  527.  
  528. public:  T * operator [] (int idx) 
  529. {
  530. return (T*)GetObject(idx);
  531.  
  532. } // end of func
  533. // **********************************************************************
  534.  
  535.  
  536. }; // end of class TC_TPsSortedArray
  537.  
  538. // **********************************************************************
  539.  
  540. // **********************************************************************
  541. class TC_PS_EXPORT TC_CPsDemRef 
  542. {
  543. protected:  int m_RefStatus ;
  544. protected:  TCPsRetCode ReleaseRef (TCPsHClass hClass)  ;
  545. public:   TC_CPsDemRef ()  ;
  546. public:  int RefStatus ()  ;
  547. public:  void UnResolve ()  ;
  548. public:  TCPsRetCode GetObject (TC_CPsObject * owner_obj, char * attr_name) TC_PS_THROW_FUNC ;
  549. public:  void SetRef (void * obj)  ;
  550. public:  BOOL IsResolved ()  ;
  551. public:  BOOL IsAssigned ()  ;
  552.  
  553. }; // end of class TC_CPsDemRef
  554.  
  555. // **********************************************************************
  556. template <class T> TCPsHClass _Get_HClass(T*);
  557.  
  558. // **********************************************************************
  559.  template <class T>
  560. class TC_TPsDemRef 
  561.     : public TC_CPsDemRef
  562. {
  563. friend class TC_CPsDemRef;
  564. protected:  T * m_Object ;
  565. public:   TC_TPsDemRef () 
  566. {
  567. m_Object = 0;
  568. } // end of func
  569. // **********************************************************************
  570.  
  571. public:   ~TC_TPsDemRef () 
  572. {
  573. Release();
  574. } // end of func
  575. // **********************************************************************
  576.  
  577. public:  TCPsRetCode Release () 
  578. {
  579. //return IsAssigned() ? ReleaseRef(_Get_HClass(m_Object)) : rcOk;
  580. return rcOk;
  581. } // end of func
  582. // **********************************************************************
  583.  
  584. public:  T* operator = (T * obj) 
  585. {
  586. SetRef(obj);
  587. return obj;
  588. } // end of func
  589. // **********************************************************************
  590.  
  591. public:  T* GetRef () 
  592. {
  593. return m_Object;
  594. } // end of func
  595. // **********************************************************************
  596.  
  597. public:  T* operator * () 
  598. {
  599. return m_Object;
  600. } // end of func
  601. // **********************************************************************
  602.  
  603.  
  604. }; // end of class TC_TPsDemRef
  605.  
  606. // **********************************************************************
  607.  
  608. #endif // _INC_OBJBIND_HPP
  609.