continfo.inl
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:12k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: continfo.inl,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/12 17:14:33  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #if defined(CONTINFO__HPP)  &&  !defined(CONTINFO__INL)
  10. #define CONTINFO__INL
  11. /*  $Id: continfo.inl,v 1000.1 2004/04/12 17:14:33 gouriano Exp $
  12. * ===========================================================================
  13. *
  14. *                            PUBLIC DOMAIN NOTICE
  15. *               National Center for Biotechnology Information
  16. *
  17. *  This software/database is a "United States Government Work" under the
  18. *  terms of the United States Copyright Act.  It was written as part of
  19. *  the author's official duties as a United States Government employee and
  20. *  thus cannot be copyrighted.  This software/database is freely available
  21. *  to the public for use. The National Library of Medicine and the U.S.
  22. *  Government have not placed any restriction on its use or reproduction.
  23. *
  24. *  Although all reasonable efforts have been taken to ensure the accuracy
  25. *  and reliability of the software and data, the NLM and the U.S.
  26. *  Government do not and cannot warrant the performance or results that
  27. *  may be obtained by using this software or data. The NLM and the U.S.
  28. *  Government disclaim all warranties, express or implied, including
  29. *  warranties of performance, merchantability or fitness for any particular
  30. *  purpose.
  31. *
  32. *  Please cite the author in any work or product based on this material.
  33. *
  34. * ===========================================================================
  35. *
  36. * Author: Eugene Vasilchenko
  37. *
  38. * File Description:
  39. *   !!! PUT YOUR DESCRIPTION HERE !!!
  40. */
  41. inline
  42. TTypeInfo CContainerTypeInfo::GetElementType(void) const
  43. {
  44.     return m_ElementType.Get();
  45. }
  46. inline
  47. bool CContainerTypeInfo::RandomElementsOrder(void) const
  48. {
  49.     return m_RandomOrder;
  50. }
  51. inline
  52. CContainerTypeInfo::CConstIterator::CConstIterator(void)
  53.     : m_ContainerType(0), m_ContainerPtr(0), m_IteratorData(0)
  54. {
  55. }
  56. inline
  57. CContainerTypeInfo::CConstIterator::~CConstIterator(void)
  58. {
  59.     const CContainerTypeInfo* containerType = m_ContainerType;
  60.     if ( containerType )
  61.         containerType->ReleaseIterator(*this);
  62. }
  63. inline
  64. const CContainerTypeInfo*
  65. CContainerTypeInfo::CConstIterator::GetContainerType(void) const
  66. {
  67.     return m_ContainerType;
  68. }
  69. inline
  70. CContainerTypeInfo::CConstIterator::TObjectPtr
  71. CContainerTypeInfo::CConstIterator::GetContainerPtr(void) const
  72. {
  73.     return m_ContainerPtr;
  74. }
  75. inline
  76. void CContainerTypeInfo::CConstIterator::Reset(void)
  77. {
  78.     const CContainerTypeInfo* containerType = m_ContainerType;
  79.     if ( containerType ) {
  80.         containerType->ReleaseIterator(*this);
  81.         m_ContainerType = 0;
  82.         m_ContainerPtr = 0;
  83.         m_IteratorData = 0;
  84.     }
  85. }
  86. inline
  87. CContainerTypeInfo::CIterator::CIterator(void)
  88.     : m_ContainerType(0), m_ContainerPtr(0), m_IteratorData(0)
  89. {
  90. }
  91. inline
  92. CContainerTypeInfo::CIterator::~CIterator(void)
  93. {
  94.     const CContainerTypeInfo* containerType = m_ContainerType;
  95.     if ( containerType )
  96.         containerType->ReleaseIterator(*this);
  97. }
  98. inline
  99. const CContainerTypeInfo*
  100. CContainerTypeInfo::CIterator::GetContainerType(void) const
  101. {
  102.     return m_ContainerType;
  103. }
  104. inline
  105. CContainerTypeInfo::CIterator::TObjectPtr
  106. CContainerTypeInfo::CIterator::GetContainerPtr(void) const
  107. {
  108.     return m_ContainerPtr;
  109. }
  110. inline
  111. void CContainerTypeInfo::CIterator::Reset(void)
  112. {
  113.     const CContainerTypeInfo* containerType = m_ContainerType;
  114.     if ( containerType ) {
  115.         containerType->ReleaseIterator(*this);
  116.         m_ContainerType = 0;
  117.         m_ContainerPtr = 0;
  118.         m_IteratorData = 0;
  119.     }
  120. }
  121. inline
  122. bool CContainerTypeInfo::InitIterator(CConstIterator& it,
  123.                                       TConstObjectPtr obj) const
  124. {
  125.     it.Reset();
  126.     it.m_ContainerType = this;
  127.     it.m_ContainerPtr = obj;
  128.     return m_InitIteratorConst(it);
  129. }
  130. inline
  131. void CContainerTypeInfo::ReleaseIterator(CConstIterator& it) const
  132. {
  133.     _ASSERT(it.m_ContainerType == this);
  134.     m_ReleaseIteratorConst(it);
  135. }
  136. inline
  137. void CContainerTypeInfo::CopyIterator(CConstIterator& dst,
  138.                                       const CConstIterator& src) const
  139. {
  140.     _ASSERT(src.m_ContainerType == this);
  141.     dst.Reset();
  142.     dst.m_ContainerType = this;
  143.     dst.m_ContainerPtr = src.m_ContainerPtr;
  144.     m_CopyIteratorConst(dst, src);
  145. }
  146. inline
  147. bool CContainerTypeInfo::NextElement(CConstIterator& it) const
  148. {
  149.     _ASSERT(it.m_ContainerType == this);
  150.     return m_NextElementConst(it);
  151. }
  152. inline
  153. TConstObjectPtr
  154. CContainerTypeInfo::GetElementPtr(const CConstIterator& it) const
  155. {
  156.     _ASSERT(it.m_ContainerType == this);
  157.     return m_GetElementPtrConst(it);
  158. }
  159. inline
  160. bool CContainerTypeInfo::InitIterator(CIterator& it,
  161.                                       TObjectPtr obj) const
  162. {
  163.     it.Reset();
  164.     it.m_ContainerType = this;
  165.     it.m_ContainerPtr = obj;
  166.     return m_InitIterator(it);
  167. }
  168. inline
  169. void CContainerTypeInfo::ReleaseIterator(CIterator& it) const
  170. {
  171.     _ASSERT(it.m_ContainerType == this);
  172.     m_ReleaseIterator(it);
  173. }
  174. inline
  175. void CContainerTypeInfo::CopyIterator(CIterator& dst,
  176.                                       const CIterator& src) const
  177. {
  178.     _ASSERT(src.m_ContainerType == this);
  179.     dst.Reset();
  180.     dst.m_ContainerType = this;
  181.     m_CopyIterator(dst, src);
  182. }
  183. inline
  184. bool CContainerTypeInfo::NextElement(CIterator& it) const
  185. {
  186.     _ASSERT(it.m_ContainerType == this);
  187.     return m_NextElement(it);
  188. }
  189. inline
  190. TObjectPtr CContainerTypeInfo::GetElementPtr(const CIterator& it) const
  191. {
  192.     _ASSERT(it.m_ContainerType == this);
  193.     return m_GetElementPtr(it);
  194. }
  195. inline
  196. bool CContainerTypeInfo::EraseElement(CIterator& it) const
  197. {
  198.     _ASSERT(it.m_ContainerType == this);
  199.     return m_EraseElement(it);
  200. }
  201. inline
  202. void CContainerTypeInfo::EraseAllElements(CIterator& it) const
  203. {
  204.     _ASSERT(it.m_ContainerType == this);
  205.     m_EraseAllElements(it);
  206. }
  207. inline
  208. void CContainerTypeInfo::AddElement(TObjectPtr containerPtr,
  209.                                     TConstObjectPtr elementPtr,
  210.                                     ESerialRecursionMode how) const
  211. {
  212.     m_AddElement(this, containerPtr, elementPtr, how);
  213. }
  214. inline
  215. void CContainerTypeInfo::AddElement(TObjectPtr containerPtr,
  216.                                     CObjectIStream& in) const
  217. {
  218.     m_AddElementIn(this, containerPtr, in);
  219. }
  220. inline
  221. CContainerElementIterator::CContainerElementIterator(void)
  222.     : m_ElementType(0), m_Valid(false)
  223. {
  224. }
  225. inline
  226. CContainerElementIterator::CContainerElementIterator(TObjectPtr containerPtr,
  227.                                                      const CContainerTypeInfo* containerType)
  228.     : m_ElementType(containerType->GetElementType())
  229. {
  230.     m_Valid = containerType->InitIterator(m_Iterator, containerPtr);
  231. }
  232. inline
  233. CContainerElementIterator::CContainerElementIterator(const CContainerElementIterator& src)
  234.     : m_ElementType(src.m_ElementType),
  235.       m_Valid(src.m_Valid)
  236. {
  237.     const CContainerTypeInfo* containerType =
  238.         src.m_Iterator.GetContainerType();
  239.     if ( containerType )
  240.         containerType->CopyIterator(m_Iterator, src.m_Iterator);
  241. }
  242. inline
  243. CContainerElementIterator& CContainerElementIterator::operator=(const CContainerElementIterator& src)
  244. {
  245.     m_Valid = false;
  246.     m_Iterator.Reset();
  247.     m_ElementType = src.m_ElementType;
  248.     const CContainerTypeInfo* containerType =
  249.         src.m_Iterator.GetContainerType();
  250.     if ( containerType )
  251.         containerType->CopyIterator(m_Iterator, src.m_Iterator);
  252.     m_Valid = src.m_Valid;
  253.     return *this;
  254. }
  255. inline
  256. void CContainerElementIterator::Init(TObjectPtr containerPtr,
  257.                                      const CContainerTypeInfo* containerType)
  258. {
  259.     m_Valid = false;
  260.     m_Iterator.Reset();
  261.     m_ElementType = containerType->GetElementType();
  262.     m_Valid = containerType->InitIterator(m_Iterator, containerPtr);
  263. }
  264. inline
  265. TTypeInfo CContainerElementIterator::GetElementType(void) const
  266. {
  267.     return m_ElementType;
  268. }
  269. inline
  270. bool CContainerElementIterator::Valid(void) const
  271. {
  272.     return m_Valid;
  273. }
  274. inline
  275. void CContainerElementIterator::Next(void)
  276. {
  277.     _ASSERT(m_Valid);
  278.     m_Valid = m_Iterator.GetContainerType()->NextElement(m_Iterator);
  279. }
  280. inline
  281. void CContainerElementIterator::Erase(void)
  282. {
  283.     _ASSERT(m_Valid);
  284.     m_Valid = m_Iterator.GetContainerType()->EraseElement(m_Iterator);
  285. }
  286. inline
  287. void CContainerElementIterator::EraseAll(void)
  288. {
  289.     if ( m_Valid ) {
  290.         m_Iterator.GetContainerType()->EraseAllElements(m_Iterator);
  291.         m_Valid = false;
  292.     }
  293. }
  294. inline
  295. pair<TObjectPtr, TTypeInfo> CContainerElementIterator::Get(void) const
  296. {
  297.     _ASSERT(m_Valid);
  298.     return make_pair(m_Iterator.GetContainerType()->GetElementPtr(m_Iterator),
  299.                      GetElementType());
  300. }
  301. inline
  302. CConstContainerElementIterator::CConstContainerElementIterator(void)
  303.     : m_ElementType(0), m_Valid(false)
  304. {
  305. }
  306. inline
  307. CConstContainerElementIterator::CConstContainerElementIterator(TConstObjectPtr containerPtr,
  308.                                                                const CContainerTypeInfo* containerType)
  309.     : m_ElementType(containerType->GetElementType())
  310. {
  311.     m_Valid = containerType->InitIterator(m_Iterator, containerPtr);
  312. }
  313. inline
  314. CConstContainerElementIterator::CConstContainerElementIterator(const CConstContainerElementIterator& src)
  315.     : m_ElementType(src.m_ElementType),
  316.       m_Valid(src.m_Valid)
  317. {
  318.     const CContainerTypeInfo* containerType =
  319.         src.m_Iterator.GetContainerType();
  320.     if ( containerType )
  321.         containerType->CopyIterator(m_Iterator, src.m_Iterator);
  322. }
  323. inline
  324. CConstContainerElementIterator&
  325. CConstContainerElementIterator::operator=(const CConstContainerElementIterator& src)
  326. {
  327.     m_Valid = false;
  328.     m_Iterator.Reset();
  329.     m_ElementType = src.m_ElementType;
  330.     const CContainerTypeInfo* containerType =
  331.         src.m_Iterator.GetContainerType();
  332.     if ( containerType )
  333.         containerType->CopyIterator(m_Iterator, src.m_Iterator);
  334.     m_Valid = src.m_Valid;
  335.     return *this;
  336. }
  337. inline
  338. void CConstContainerElementIterator::Init(TConstObjectPtr containerPtr,
  339.                                           const CContainerTypeInfo* containerType)
  340. {
  341.     m_Valid = false;
  342.     m_Iterator.Reset();
  343.     m_ElementType = containerType->GetElementType();
  344.     m_Valid = containerType->InitIterator(m_Iterator, containerPtr);
  345. }
  346. inline
  347. TTypeInfo CConstContainerElementIterator::GetElementType(void) const
  348. {
  349.     return m_ElementType;
  350. }
  351. inline
  352. bool CConstContainerElementIterator::Valid(void) const
  353. {
  354.     return m_Valid;
  355. }
  356. inline
  357. void CConstContainerElementIterator::Next(void)
  358. {
  359.     _ASSERT(m_Valid);
  360.     m_Valid = m_Iterator.GetContainerType()->NextElement(m_Iterator);
  361. }
  362. inline
  363. pair<TConstObjectPtr, TTypeInfo> CConstContainerElementIterator::Get(void) const
  364. {
  365.     _ASSERT(m_Valid);
  366.     return make_pair(m_Iterator.GetContainerType()->GetElementPtr(m_Iterator),
  367.                      GetElementType());
  368. }
  369. #endif /* def CONTINFO__HPP  &&  ndef CONTINFO__INL */
  370. /* ---------------------------------------------------------------------------
  371. * $Log: continfo.inl,v $
  372. * Revision 1000.1  2004/04/12 17:14:33  gouriano
  373. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.5
  374. *
  375. * Revision 1.5  2004/03/25 15:56:27  gouriano
  376. * Added possibility to copy and compare serial object non-recursively
  377. *
  378. * Revision 1.4  2003/08/14 20:03:57  vasilche
  379. * Avoid memory reallocation when reading over preallocated object.
  380. * Simplified CContainerTypeInfo iterators interface.
  381. *
  382. * Revision 1.3  2002/12/23 18:38:50  dicuccio
  383. * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  384. * Moved all CVS logs to the end.
  385. *
  386. * Revision 1.2  2000/10/13 16:28:30  vasilche
  387. * Reduced header dependency.
  388. * Avoid use of templates with virtual methods.
  389. * Reduced amount of different maps used.
  390. * All this lead to smaller compiled code size (libraries and programs).
  391. *
  392. * Revision 1.1  2000/09/18 20:00:00  vasilche
  393. * Separated CVariantInfo and CMemberInfo.
  394. * Implemented copy hooks.
  395. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  396. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  397. *
  398. * ===========================================================================
  399. */