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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: objstack.inl,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/12 17:15:30  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.17
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #if defined(OBJSTACK__HPP)  &&  !defined(OBJSTACK__INL)
  10. #define OBJSTACK__INL
  11. /*  $Id: objstack.inl,v 1000.1 2004/04/12 17:15:30 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. void CObjectStackFrame::Reset(void)
  43. {
  44.     m_FrameType = eFrameOther;
  45.     m_TypeInfo = 0;
  46.     m_MemberId = 0;
  47.     m_Notag = false;
  48. }
  49. inline
  50. CObjectStackFrame::EFrameType CObjectStackFrame::GetFrameType(void) const
  51. {
  52.     return m_FrameType;
  53. }
  54. inline
  55. bool CObjectStackFrame::HasTypeInfo(void) const
  56. {
  57.     return (m_FrameType != eFrameOther &&
  58.             m_FrameType != eFrameChoiceVariant &&
  59.             m_TypeInfo  != 0);
  60. }
  61. inline
  62. TTypeInfo CObjectStackFrame::GetTypeInfo(void) const
  63. {
  64.     _ASSERT(m_FrameType != eFrameOther &&
  65.             m_FrameType != eFrameChoiceVariant);
  66.     _ASSERT(m_TypeInfo != 0);
  67.     return m_TypeInfo;
  68. }
  69. inline
  70. bool CObjectStackFrame::HasMemberId(void) const
  71. {
  72.     return (m_FrameType == eFrameClassMember ||
  73.             m_FrameType == eFrameChoiceVariant) && (m_MemberId != 0);
  74. }
  75. inline
  76. const CMemberId& CObjectStackFrame::GetMemberId(void) const
  77. {
  78.     _ASSERT(m_FrameType == eFrameClassMember ||
  79.             m_FrameType == eFrameChoiceVariant ||
  80.             m_FrameType == eFrameArray);
  81.     _ASSERT(m_MemberId != 0);
  82.     return *m_MemberId;
  83. }
  84. inline
  85. void CObjectStackFrame::SetMemberId(const CMemberId& memberid)
  86. {
  87.     _ASSERT(m_FrameType == eFrameClassMember ||
  88.             m_FrameType == eFrameChoiceVariant);
  89.     m_MemberId = &memberid;
  90. }
  91. inline
  92. void CObjectStackFrame::SetNotag(bool set)
  93. {
  94.     m_Notag = set;
  95. #if defined(NCBI_SERIAL_IO_TRACE)
  96.     cout << ", "  << (m_Notag ? "N" : "!N");
  97. #endif
  98. }
  99. inline
  100. bool CObjectStackFrame::GetNotag(void) const
  101. {
  102.     return m_Notag;
  103. }
  104. inline
  105. size_t CObjectStack::GetStackDepth(void) const
  106. {
  107.     return static_cast<size_t>(m_StackPtr - m_Stack);
  108. }
  109. inline
  110. bool CObjectStack::StackIsEmpty(void) const
  111. {
  112.     return m_Stack == m_StackPtr;
  113. }
  114. inline
  115. CObjectStack::TFrame& CObjectStack::PushFrame(void)
  116. {
  117.     TFrame* newPtr = m_StackPtr + 1;
  118.     if ( newPtr >= m_StackEnd )
  119.         return PushFrameLong();
  120.     m_StackPtr = newPtr;
  121.     return *newPtr;
  122. }
  123. inline
  124. CObjectStack::TFrame& CObjectStack::PushFrame(EFrameType type)
  125. {
  126.     TFrame& frame = PushFrame();
  127.     frame.m_FrameType = type;
  128. #if defined(NCBI_SERIAL_IO_TRACE)
  129.     TracePushFrame(true);
  130. #endif
  131.     return frame;
  132. }
  133. inline
  134. CObjectStack::TFrame& CObjectStack::PushFrame(EFrameType type,
  135.                                               TTypeInfo typeInfo)
  136. {
  137.     _ASSERT(type != TFrame::eFrameOther &&
  138.             type != TFrame::eFrameClassMember &&
  139.             type != TFrame::eFrameChoiceVariant);
  140.     _ASSERT(typeInfo != 0);
  141.     TFrame& frame = PushFrame(type);
  142.     frame.m_TypeInfo = typeInfo;
  143.     return frame;
  144. }
  145. inline
  146. CObjectStack::TFrame& CObjectStack::PushFrame(EFrameType type,
  147.                                               const CMemberId& memberId)
  148. {
  149.     _ASSERT(type == TFrame::eFrameClassMember ||
  150.             type == TFrame::eFrameChoiceVariant);
  151.     TFrame& frame = PushFrame(type);
  152.     frame.m_MemberId = &memberId;
  153.     x_PushStackPath();
  154.     return frame;
  155. }
  156. inline
  157. void CObjectStack::PopFrame(void)
  158. {
  159.     _ASSERT(!StackIsEmpty());
  160. #if defined(NCBI_SERIAL_IO_TRACE)
  161.     TracePushFrame(false);
  162. #endif
  163.     x_PopStackPath();
  164.     m_StackPtr->Reset();
  165.     --m_StackPtr;
  166. }
  167. inline
  168. CObjectStack::TFrame& CObjectStack::FetchFrameFromTop(size_t index)
  169. {
  170.     TFrame* ptr = m_StackPtr - index;
  171.     _ASSERT(ptr > m_Stack);
  172.     return *ptr;
  173. }
  174. inline
  175. const CObjectStack::TFrame& CObjectStack::FetchFrameFromTop(size_t index) const
  176. {
  177.     TFrame* ptr = m_StackPtr - index;
  178.     _ASSERT(ptr > m_Stack);
  179.     return *ptr;
  180. }
  181. inline
  182. const CObjectStack::TFrame& CObjectStack::TopFrame(void) const
  183. {
  184.     _ASSERT(!StackIsEmpty());
  185.     return *m_StackPtr;
  186. }
  187. inline
  188. CObjectStack::TFrame& CObjectStack::TopFrame(void)
  189. {
  190.     _ASSERT(!StackIsEmpty());
  191.     return *m_StackPtr;
  192. }
  193. inline
  194. void CObjectStack::SetTopMemberId(const CMemberId& memberid)
  195. {
  196.     x_PopStackPath();
  197.     TopFrame().SetMemberId(memberid);
  198.     x_PushStackPath();
  199. }
  200. inline
  201. const CObjectStack::TFrame& CObjectStack::FetchFrameFromBottom(size_t index) const
  202. {
  203.     TFrame* ptr = m_Stack + 1 + index;
  204.     _ASSERT(ptr <= m_StackPtr);
  205.     return *ptr;
  206. }
  207. inline
  208. void CObjectStack::WatchPathHooks(bool set)
  209. {
  210.     m_WatchPathHooks = set;
  211.     m_PathValid = false;
  212.     GetStackPath();
  213. }
  214. #endif /* def OBJSTACK__HPP  &&  ndef OBJSTACK__INL */
  215. /* ---------------------------------------------------------------------------
  216. * $Log: objstack.inl,v $
  217. * Revision 1000.1  2004/04/12 17:15:30  gouriano
  218. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.17
  219. *
  220. * Revision 1.17  2004/01/05 14:24:09  gouriano
  221. * Added possibility to set serialization hooks by stack path
  222. *
  223. * Revision 1.16  2003/08/25 15:58:32  gouriano
  224. * added possibility to use namespaces in XML i/o streams
  225. *
  226. * Revision 1.15  2003/03/10 18:52:37  gouriano
  227. * use new structured exceptions (based on CException)
  228. *
  229. * Revision 1.14  2002/12/26 19:27:31  gouriano
  230. * removed Get/SetSkipTag and eFrameAttlist - not needed any more
  231. *
  232. * Revision 1.13  2002/12/23 18:38:51  dicuccio
  233. * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  234. * Moved all CVS logs to the end.
  235. *
  236. * Revision 1.12  2002/12/12 21:11:15  gouriano
  237. * added some debug tracing
  238. *
  239. * Revision 1.11  2002/11/19 19:45:13  gouriano
  240. * added const qualifier to GetSkipTag/GetNotag functions
  241. *
  242. * Revision 1.10  2002/11/14 20:53:41  gouriano
  243. * added support of XML attribute lists
  244. *
  245. * Revision 1.9  2002/10/15 13:40:33  gouriano
  246. * added "skiptag" flag
  247. *
  248. * Revision 1.8  2002/09/26 18:12:27  gouriano
  249. * added HasMemberId method
  250. *
  251. * Revision 1.7  2001/08/15 20:53:04  juran
  252. * Heed warnings.
  253. *
  254. * Revision 1.6  2000/09/18 20:00:08  vasilche
  255. * Separated CVariantInfo and CMemberInfo.
  256. * Implemented copy hooks.
  257. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  258. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  259. *
  260. * Revision 1.5  2000/09/01 13:16:02  vasilche
  261. * Implemented class/container/choice iterators.
  262. * Implemented CObjectStreamCopier for copying data without loading into memory.
  263. *
  264. * Revision 1.4  2000/08/15 19:44:42  vasilche
  265. * Added Read/Write hooks:
  266. * CReadObjectHook/CWriteObjectHook for objects of specified type.
  267. * CReadClassMemberHook/CWriteClassMemberHook for specified members.
  268. * CReadChoiceVariantHook/CWriteChoiceVariant for specified choice variants.
  269. * CReadContainerElementHook/CWriteContainerElementsHook for containers.
  270. *
  271. * Revision 1.3  2000/06/07 19:45:44  vasilche
  272. * Some code cleaning.
  273. * Macros renaming in more clear way.
  274. * BEGIN_NAMED_*_INFO, ADD_*_MEMBER, ADD_NAMED_*_MEMBER.
  275. *
  276. * Revision 1.2  2000/06/01 19:06:58  vasilche
  277. * Added parsing of XML data.
  278. *
  279. * Revision 1.1  2000/05/24 20:08:15  vasilche
  280. * Implemented XML dump.
  281. *
  282. * ===========================================================================
  283. */