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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: objstack.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/12 17:15:27  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.23
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJSTACK__HPP
  10. #define OBJSTACK__HPP
  11. /*  $Id: objstack.hpp,v 1000.1 2004/04/12 17:15:27 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. #define VIRTUAL_MID_LEVEL_IO 1
  42. //#undef VIRTUAL_MID_LEVEL_IO
  43. #ifdef VIRTUAL_MID_LEVEL_IO
  44. # define MLIOVIR virtual
  45. #else
  46. # define MLIOVIR
  47. #endif
  48. #include <corelib/ncbistd.hpp>
  49. #include <serial/exception.hpp>
  50. #include <serial/memberid.hpp>
  51. #include <serial/typeinfo.hpp>
  52. /** @addtogroup ObjStreamSupport
  53.  *
  54.  * @{
  55.  */
  56. BEGIN_NCBI_SCOPE
  57. class CObjectStack;
  58. class NCBI_XSERIAL_EXPORT CObjectStackFrame
  59. {
  60. public:
  61.     enum EFrameType {
  62.         eFrameOther,
  63.         eFrameNamed,
  64.         eFrameArray,
  65.         eFrameArrayElement,
  66.         eFrameClass,
  67.         eFrameClassMember,
  68.         eFrameChoice,
  69.         eFrameChoiceVariant
  70.     };
  71.     void Reset(void);
  72.     
  73.     EFrameType GetFrameType(void) const;
  74.     bool HasTypeInfo(void) const;
  75.     TTypeInfo GetTypeInfo(void) const;
  76.     bool HasMemberId(void) const;
  77.     const CMemberId& GetMemberId(void) const;
  78.     void SetNotag(bool set=true);
  79.     bool GetNotag(void) const;
  80.     const char* GetFrameTypeName(void) const;
  81.     string GetFrameInfo(void) const;
  82.     string GetFrameName(void) const;
  83. protected:
  84.     void SetMemberId(const CMemberId& memberid);
  85. private:
  86.     friend class CObjectStack;
  87.     EFrameType m_FrameType;
  88.     TTypeInfo m_TypeInfo;
  89.     const CMemberId* m_MemberId;
  90.     bool m_Notag;
  91. };
  92. class NCBI_XSERIAL_EXPORT CObjectStack
  93. {
  94. public:
  95.     typedef CObjectStackFrame TFrame;
  96.     typedef TFrame::EFrameType EFrameType;
  97.     CObjectStack(void);
  98.     virtual ~CObjectStack(void);
  99.     size_t GetStackDepth(void) const;
  100.     TFrame& PushFrame(EFrameType type, TTypeInfo typeInfo);
  101.     TFrame& PushFrame(EFrameType type, const CMemberId& memberId);
  102.     TFrame& PushFrame(EFrameType type);
  103.     void PopFrame(void);
  104.     void PopErrorFrame(void);
  105.     void SetTopMemberId(const CMemberId& memberId);
  106. #if defined(NCBI_SERIAL_IO_TRACE)
  107.     void TracePushFrame(bool push) const;
  108. #endif
  109.     bool StackIsEmpty(void) const;
  110.     void ClearStack(void);
  111.     string GetStackTraceASN(void) const;
  112.     const TFrame& TopFrame(void) const;
  113.     TFrame& TopFrame(void);
  114.     TFrame& FetchFrameFromTop(size_t index);
  115.     const TFrame& FetchFrameFromTop(size_t index) const;
  116.     const TFrame& FetchFrameFromBottom(size_t index) const;
  117.     virtual void UnendedFrame(void);
  118.     const string& GetStackPath(void);
  119.     void WatchPathHooks(bool set=true);
  120. protected:
  121.     virtual void x_SetPathHooks(bool set) = 0;
  122. private:
  123.     TFrame& PushFrame(void);
  124.     TFrame& PushFrameLong(void);
  125.     void x_PushStackPath(void);
  126.     void x_PopStackPath(void);
  127.     TFrame* m_Stack;
  128.     TFrame* m_StackPtr;
  129.     TFrame* m_StackEnd;
  130.     string  m_MemberPath;
  131.     bool    m_WatchPathHooks;
  132.     bool    m_PathValid;
  133. };
  134. #include <serial/objstack.inl>
  135. #define BEGIN_OBJECT_FRAME_OFx(Stream, Args) 
  136.     (Stream).PushFrame Args; 
  137.     try {
  138. #define END_OBJECT_FRAME_OF(Stream) 
  139.     } catch (CSerialException& s_expt) { 
  140.         std::string msg((Stream).TopFrame().GetFrameName()); 
  141.         (Stream).PopErrorFrame(); 
  142.         s_expt.AddFrameInfo(msg); 
  143.         throw; 
  144.     } catch (CException& expt) { 
  145.         std::string msg((Stream).TopFrame().GetFrameInfo()); 
  146.         (Stream).PopErrorFrame(); 
  147.         NCBI_RETHROW_SAME(expt,msg); 
  148.     } 
  149.     (Stream).PopFrame()
  150. #define BEGIN_OBJECT_FRAME_OF(Stream, Type) 
  151.     BEGIN_OBJECT_FRAME_OFx(Stream, (CObjectStackFrame::Type))
  152. #define BEGIN_OBJECT_FRAME_OF2(Stream, Type, Arg) 
  153.     BEGIN_OBJECT_FRAME_OFx(Stream, (CObjectStackFrame::Type, Arg))
  154. #define BEGIN_OBJECT_FRAME(Type) BEGIN_OBJECT_FRAME_OF(*this, Type)
  155. #define BEGIN_OBJECT_FRAME2(Type, Arg) BEGIN_OBJECT_FRAME_OF2(*this, Type, Arg)
  156. #define BEGIN_OBJECT_FRAME3(Type, Arg) BEGIN_OBJECT_FRAME_OFx(*this, (Type, Arg))
  157. #define END_OBJECT_FRAME() END_OBJECT_FRAME_OF(*this)
  158. #define BEGIN_OBJECT_2FRAMES_OFx(Stream, Args) 
  159.     (Stream).In().PushFrame Args; 
  160.     (Stream).Out().PushFrame Args; 
  161.     try {
  162. #define END_OBJECT_2FRAMES_OF(Stream) 
  163.     } catch (CException& expt) { 
  164.         std::string msg((Stream).In().TopFrame().GetFrameInfo()); 
  165.         (Stream).Out().PopFrame(); 
  166.         (Stream).Out().SetFailFlagsNoError(CObjectOStream::fInvalidData); 
  167.         (Stream).In().PopErrorFrame(); 
  168.         NCBI_RETHROW_SAME(expt,msg); 
  169.     } 
  170.     (Stream).Out().PopFrame(); 
  171.     (Stream).In().PopFrame()
  172. #define BEGIN_OBJECT_2FRAMES_OF(Stream, Type) 
  173.     BEGIN_OBJECT_2FRAMES_OFx(Stream, (CObjectStackFrame::Type))
  174. #define BEGIN_OBJECT_2FRAMES_OF2(Stream, Type, Arg) 
  175.     BEGIN_OBJECT_2FRAMES_OFx(Stream, (CObjectStackFrame::Type, Arg))
  176. #define BEGIN_OBJECT_2FRAMES(Type) BEGIN_OBJECT_2FRAMES_OF(*this, Type)
  177. #define BEGIN_OBJECT_2FRAMES2(Type, Arg) BEGIN_OBJECT_2FRAMES_OF2(*this, Type, Arg)
  178. #define END_OBJECT_2FRAMES() END_OBJECT_2FRAMES_OF(*this)
  179. END_NCBI_SCOPE
  180. #endif  /* OBJSTACK__HPP */
  181. /* @} */
  182. /* ---------------------------------------------------------------------------
  183. * $Log: objstack.hpp,v $
  184. * Revision 1000.1  2004/04/12 17:15:27  gouriano
  185. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.23
  186. *
  187. * Revision 1.23  2004/01/05 14:24:09  gouriano
  188. * Added possibility to set serialization hooks by stack path
  189. *
  190. * Revision 1.22  2003/10/27 19:18:03  grichenk
  191. * Reformatted object stream error messages
  192. *
  193. * Revision 1.21  2003/08/25 15:58:32  gouriano
  194. * added possibility to use namespaces in XML i/o streams
  195. *
  196. * Revision 1.20  2003/05/16 18:02:53  gouriano
  197. * revised exception error messages
  198. *
  199. * Revision 1.19  2003/04/15 16:18:33  siyan
  200. * Added doxygen support
  201. *
  202. * Revision 1.18  2003/03/10 18:52:37  gouriano
  203. * use new structured exceptions (based on CException)
  204. *
  205. * Revision 1.17  2002/12/26 19:27:31  gouriano
  206. * removed Get/SetSkipTag and eFrameAttlist - not needed any more
  207. *
  208. * Revision 1.16  2002/12/23 18:38:51  dicuccio
  209. * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  210. * Moved all CVS logs to the end.
  211. *
  212. * Revision 1.15  2002/12/13 21:51:05  gouriano
  213. * corrected reading of choices
  214. *
  215. * Revision 1.14  2002/12/12 21:11:15  gouriano
  216. * added some debug tracing
  217. *
  218. * Revision 1.13  2002/11/19 19:45:13  gouriano
  219. * added const qualifier to GetSkipTag/GetNotag functions
  220. *
  221. * Revision 1.12  2002/11/14 20:53:42  gouriano
  222. * added support of XML attribute lists
  223. *
  224. * Revision 1.11  2002/10/25 14:49:29  vasilche
  225. * NCBI C Toolkit compatibility code extracted to libxcser library.
  226. * Serial streams flags names were renamed to fXxx.
  227. *
  228. * Names of flags
  229. *
  230. * Revision 1.10  2002/10/15 13:40:33  gouriano
  231. * added "skiptag" flag
  232. *
  233. * Revision 1.9  2002/09/26 18:12:27  gouriano
  234. * added HasMemberId method
  235. *
  236. * Revision 1.8  2001/05/17 14:59:47  lavr
  237. * Typos corrected
  238. *
  239. * Revision 1.7  2000/10/20 15:51:28  vasilche
  240. * Fixed data error processing.
  241. * Added interface for constructing container objects directly into output stream.
  242. * object.hpp, object.inl and object.cpp were split to
  243. * objectinfo.*, objecttype.*, objectiter.* and objectio.*.
  244. *
  245. * Revision 1.6  2000/09/18 20:00:07  vasilche
  246. * Separated CVariantInfo and CMemberInfo.
  247. * Implemented copy hooks.
  248. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  249. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  250. *
  251. * Revision 1.5  2000/09/01 13:16:02  vasilche
  252. * Implemented class/container/choice iterators.
  253. * Implemented CObjectStreamCopier for copying data without loading into memory.
  254. *
  255. * Revision 1.4  2000/08/15 19:44:41  vasilche
  256. * Added Read/Write hooks:
  257. * CReadObjectHook/CWriteObjectHook for objects of specified type.
  258. * CReadClassMemberHook/CWriteClassMemberHook for specified members.
  259. * CReadChoiceVariantHook/CWriteChoiceVariant for specified choice variants.
  260. * CReadContainerElementHook/CWriteContainerElementsHook for containers.
  261. *
  262. * Revision 1.3  2000/06/07 19:45:44  vasilche
  263. * Some code cleaning.
  264. * Macros renaming in more clear way.
  265. * BEGIN_NAMED_*_INFO, ADD_*_MEMBER, ADD_NAMED_*_MEMBER.
  266. *
  267. * Revision 1.2  2000/06/01 19:06:58  vasilche
  268. * Added parsing of XML data.
  269. *
  270. * Revision 1.1  2000/05/24 20:08:14  vasilche
  271. * Implemented XML dump.
  272. *
  273. * ===========================================================================
  274. */