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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: objectiter.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:40:48  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: objectiter.cpp,v 1000.2 2004/06/01 19:40:48 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Author: Eugene Vasilchenko
  35. *
  36. * File Description:
  37. *   !!! PUT YOUR DESCRIPTION HERE !!!
  38. *
  39. * ---------------------------------------------------------------------------
  40. * $Log: objectiter.cpp,v $
  41. * Revision 1000.2  2004/06/01 19:40:48  gouriano
  42. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  43. *
  44. * Revision 1.13  2004/05/17 21:03:03  gorelenk
  45. * Added include of PCH ncbi_pch.hpp
  46. *
  47. * Revision 1.12  2004/01/05 14:25:20  gouriano
  48. * Added possibility to set serialization hooks by stack path
  49. *
  50. * Revision 1.11  2003/10/01 14:40:12  vasilche
  51. * Fixed CanGet() for members wihout 'set' flag.
  52. *
  53. * Revision 1.10  2003/09/30 17:11:57  gouriano
  54. * Modified TypeIterators to skip unset optional members
  55. *
  56. * Revision 1.9  2003/08/14 20:03:58  vasilche
  57. * Avoid memory reallocation when reading over preallocated object.
  58. * Simplified CContainerTypeInfo iterators interface.
  59. *
  60. * Revision 1.8  2003/08/11 15:25:52  grichenk
  61. * Added possibility to reset an object member from
  62. * a read hook (including non-optional members).
  63. *
  64. * Revision 1.7  2003/07/29 18:47:47  vasilche
  65. * Fixed thread safeness of object stream hooks.
  66. *
  67. * Revision 1.6  2003/07/17 22:49:48  vasilche
  68. * Added missing methods.
  69. *
  70. * Revision 1.5  2003/07/17 20:02:51  vasilche
  71. * Added update of 'set' flag for non const class member dereference.
  72. * Added choice switch for non const choice variant dereference.
  73. *
  74. * Revision 1.4  2003/04/29 18:30:37  gouriano
  75. * object data member initialization verification
  76. *
  77. * Revision 1.3  2003/03/10 18:54:26  gouriano
  78. * use new structured exceptions (based on CException)
  79. *
  80. * Revision 1.2  2001/05/17 15:07:08  lavr
  81. * Typos corrected
  82. *
  83. * Revision 1.1  2000/10/20 15:51:40  vasilche
  84. * Fixed data error processing.
  85. * Added interface for constructing container objects directly into output stream.
  86. * object.hpp, object.inl and object.cpp were split to
  87. * objectinfo.*, objecttype.*, objectiter.* and objectio.*.
  88. *
  89. * ===========================================================================
  90. */
  91. #include <ncbi_pch.hpp>
  92. #include <corelib/ncbistd.hpp>
  93. #include <serial/exception.hpp>
  94. #include <serial/objectiter.hpp>
  95. #include <serial/delaybuf.hpp>
  96. BEGIN_NCBI_SCOPE
  97. void CConstObjectInfoEI::ReportNonValid(void) const
  98. {
  99.     ERR_POST("CElementIterator was used without checking its validity");
  100. }
  101. void CObjectInfoEI::ReportNonValid(void) const
  102. {
  103.     ERR_POST("CElementIterator was used without checking its validity");
  104. }
  105. void CObjectTypeInfoII::ReportNonValid(void) const
  106. {
  107.     ERR_POST("CTypeMemberIterator is used without validity check");
  108. }
  109. // container iterators
  110. CConstObjectInfoEI::CConstObjectInfoEI(const CConstObjectInfo& object)
  111.     : m_Iterator(object.GetObjectPtr(), object.GetContainerTypeInfo())
  112. {
  113.     _DEBUG_ARG(m_LastCall = eNone);
  114. }
  115. CConstObjectInfoEI&
  116. CConstObjectInfoEI::operator=(const CConstObjectInfo& object)
  117. {
  118.     m_Iterator.Init(object.GetObjectPtr(), object.GetContainerTypeInfo());
  119.     _DEBUG_ARG(m_LastCall = eNone);
  120.     return *this;
  121. }
  122. CObjectInfoEI::CObjectInfoEI(const CObjectInfo& object)
  123.     : m_Iterator(object.GetObjectPtr(), object.GetContainerTypeInfo())
  124. {
  125.     _DEBUG_ARG(m_LastCall = eNone);
  126. }
  127. CObjectInfoEI&
  128. CObjectInfoEI::operator=(const CObjectInfo& object)
  129. {
  130.     m_Iterator.Init(object.GetObjectPtr(), object.GetContainerTypeInfo());
  131.     _DEBUG_ARG(m_LastCall = eNone);
  132.     return *this;
  133. }
  134. // class iterators
  135. bool CObjectTypeInfoMI::IsSet(const CConstObjectInfo& object) const
  136. {
  137.     const CMemberInfo* memberInfo = GetMemberInfo();
  138.     if ( memberInfo->HaveSetFlag() )
  139.         return memberInfo->GetSetFlagYes(object.GetObjectPtr());
  140.     
  141.     if ( memberInfo->CanBeDelayed() &&
  142.          memberInfo->GetDelayBuffer(object.GetObjectPtr()).Delayed() )
  143.         return true;
  144.     if ( memberInfo->Optional() ) {
  145.         TConstObjectPtr defaultPtr = memberInfo->GetDefault();
  146.         TConstObjectPtr memberPtr =
  147.             memberInfo->GetMemberPtr(object.GetObjectPtr());
  148.         TTypeInfo memberType = memberInfo->GetTypeInfo();
  149.         if ( !defaultPtr ) {
  150.             if ( memberType->IsDefault(memberPtr) )
  151.                 return false; // DEFAULT
  152.         }
  153.         else {
  154.             if ( memberType->Equals(memberPtr, defaultPtr) )
  155.                 return false; // OPTIONAL
  156.         }
  157.     }
  158.     return true;
  159. }
  160. void CObjectTypeInfoMI::SetLocalReadHook(CObjectIStream& stream,
  161.                                          CReadClassMemberHook* hook) const
  162. {
  163.     GetNCMemberInfo()->SetLocalReadHook(stream, hook);
  164. }
  165. void CObjectTypeInfoMI::SetGlobalReadHook(CReadClassMemberHook* hook) const
  166. {
  167.     GetNCMemberInfo()->SetGlobalReadHook(hook);
  168. }
  169. void CObjectTypeInfoMI::ResetLocalReadHook(CObjectIStream& stream) const
  170. {
  171.     GetNCMemberInfo()->ResetLocalReadHook(stream);
  172. }
  173. void CObjectTypeInfoMI::ResetGlobalReadHook(void) const
  174. {
  175.     GetNCMemberInfo()->ResetGlobalReadHook();
  176. }
  177. void CObjectTypeInfoMI::SetPathReadHook(CObjectIStream* in, const string& path,
  178.                                         CReadClassMemberHook* hook) const
  179. {
  180.     GetNCMemberInfo()->SetPathReadHook(in, path, hook);
  181. }
  182. void CObjectTypeInfoMI::SetLocalWriteHook(CObjectOStream& stream,
  183.                                           CWriteClassMemberHook* hook) const
  184. {
  185.     GetNCMemberInfo()->SetLocalWriteHook(stream, hook);
  186. }
  187. void CObjectTypeInfoMI::SetGlobalWriteHook(CWriteClassMemberHook* hook) const
  188. {
  189.     GetNCMemberInfo()->SetGlobalWriteHook(hook);
  190. }
  191. void CObjectTypeInfoMI::ResetLocalWriteHook(CObjectOStream& stream) const
  192. {
  193.     GetNCMemberInfo()->ResetLocalWriteHook(stream);
  194. }
  195. void CObjectTypeInfoMI::ResetGlobalWriteHook(void) const
  196. {
  197.     GetNCMemberInfo()->ResetGlobalWriteHook();
  198. }
  199. void CObjectTypeInfoMI::SetPathWriteHook(CObjectOStream* stream, const string& path,
  200.                                          CWriteClassMemberHook* hook) const
  201. {
  202.     GetNCMemberInfo()->SetPathWriteHook(stream, path, hook);
  203. }
  204. void CObjectTypeInfoMI::SetLocalSkipHook(CObjectIStream& stream,
  205.                                          CSkipClassMemberHook* hook) const
  206. {
  207.     GetNCMemberInfo()->SetLocalSkipHook(stream, hook);
  208. }
  209. void CObjectTypeInfoMI::SetGlobalSkipHook(CSkipClassMemberHook* hook) const
  210. {
  211.     GetNCMemberInfo()->SetGlobalSkipHook(hook);
  212. }
  213. void CObjectTypeInfoMI::ResetLocalSkipHook(CObjectIStream& stream) const
  214. {
  215.     GetNCMemberInfo()->ResetLocalSkipHook(stream);
  216. }
  217. void CObjectTypeInfoMI::ResetGlobalSkipHook(void) const
  218. {
  219.     GetNCMemberInfo()->ResetGlobalSkipHook();
  220. }
  221. void CObjectTypeInfoMI::SetPathSkipHook(CObjectIStream* stream, const string& path,
  222.                                         CSkipClassMemberHook* hook) const
  223. {
  224.     GetNCMemberInfo()->SetPathSkipHook(stream, path, hook);
  225. }
  226. void CObjectTypeInfoMI::SetLocalCopyHook(CObjectStreamCopier& stream,
  227.                                          CCopyClassMemberHook* hook) const
  228. {
  229.     GetNCMemberInfo()->SetLocalCopyHook(stream, hook);
  230. }
  231. void CObjectTypeInfoMI::SetGlobalCopyHook(CCopyClassMemberHook* hook) const
  232. {
  233.     GetNCMemberInfo()->SetGlobalCopyHook(hook);
  234. }
  235. void CObjectTypeInfoMI::ResetLocalCopyHook(CObjectStreamCopier& stream) const
  236. {
  237.     GetNCMemberInfo()->ResetLocalCopyHook(stream);
  238. }
  239. void CObjectTypeInfoMI::ResetGlobalCopyHook(void) const
  240. {
  241.     GetNCMemberInfo()->ResetGlobalCopyHook();
  242. }
  243. void CObjectTypeInfoMI::SetPathCopyHook(CObjectStreamCopier* stream,
  244.                                         const string& path,
  245.                                         CCopyClassMemberHook* hook) const
  246. {
  247.     GetNCMemberInfo()->SetPathCopyHook(stream,path,hook);
  248. }
  249. bool CConstObjectInfoMI::CanGet(void) const
  250. {
  251.     const CMemberInfo* memberInfo = GetMemberInfo();
  252.     return !memberInfo->HaveSetFlag() ||
  253.         memberInfo->GetSetFlagYes(m_Object.GetObjectPtr());
  254. }
  255. pair<TConstObjectPtr, TTypeInfo> CConstObjectInfoMI::GetMemberPair(void) const
  256. {
  257.     const CMemberInfo* memberInfo = GetMemberInfo();
  258.     return make_pair(memberInfo->GetMemberPtr(m_Object.GetObjectPtr()),
  259.                      memberInfo->GetTypeInfo());
  260. }
  261. bool CObjectInfoMI::CanGet(void) const
  262. {
  263.     const CMemberInfo* memberInfo = GetMemberInfo();
  264.     return !memberInfo->HaveSetFlag() ||
  265.         memberInfo->GetSetFlagYes(m_Object.GetObjectPtr());
  266. }
  267. pair<TObjectPtr, TTypeInfo> CObjectInfoMI::GetMemberPair(void) const
  268. {
  269.     TObjectPtr objectPtr = m_Object.GetObjectPtr();
  270.     const CMemberInfo* memberInfo = GetMemberInfo();
  271.     memberInfo->UpdateSetFlagMaybe(objectPtr);
  272.     return make_pair(memberInfo->GetMemberPtr(objectPtr),
  273.                      memberInfo->GetTypeInfo());
  274. }
  275. void CObjectInfoMI::Erase(EEraseFlag flag)
  276. {
  277.     const CMemberInfo* mInfo = GetMemberInfo();
  278.     if ( !(mInfo->Optional() || flag == eErase_Mandatory)
  279.         || mInfo->GetDefault() )
  280.         NCBI_THROW(CSerialException,eIllegalCall, "cannot reset non OPTIONAL member");
  281.     
  282.     TObjectPtr objectPtr = m_Object.GetObjectPtr();
  283.     // check 'set' flag
  284.     bool haveSetFlag = mInfo->HaveSetFlag();
  285.     if ( haveSetFlag && mInfo->GetSetFlagNo(objectPtr) ) {
  286.         // member not set
  287.         return;
  288.     }
  289.     // reset member
  290.     mInfo->GetTypeInfo()->SetDefault(mInfo->GetMemberPtr(objectPtr));
  291.     // update 'set' flag
  292.     if ( haveSetFlag )
  293.         mInfo->UpdateSetFlagNo(objectPtr);
  294. }
  295. // choice iterators
  296. void CObjectTypeInfoVI::SetLocalReadHook(CObjectIStream& stream,
  297.                                          CReadChoiceVariantHook* hook) const
  298. {
  299.     GetNCVariantInfo()->SetLocalReadHook(stream, hook);
  300. }
  301. void CObjectTypeInfoVI::SetGlobalReadHook(CReadChoiceVariantHook* hook) const
  302. {
  303.     GetNCVariantInfo()->SetGlobalReadHook(hook);
  304. }
  305. void CObjectTypeInfoVI::ResetLocalReadHook(CObjectIStream& stream) const
  306. {
  307.     GetNCVariantInfo()->ResetLocalReadHook(stream);
  308. }
  309. void CObjectTypeInfoVI::ResetGlobalReadHook(void) const
  310. {
  311.     GetNCVariantInfo()->ResetGlobalReadHook();
  312. }
  313. void CObjectTypeInfoVI::SetPathReadHook(CObjectIStream* stream, const string& path,
  314.                                         CReadChoiceVariantHook* hook) const
  315. {
  316.     GetNCVariantInfo()->SetPathReadHook(stream, path, hook);
  317. }
  318. void CObjectTypeInfoVI::SetLocalWriteHook(CObjectOStream& stream,
  319.                                           CWriteChoiceVariantHook* hook) const
  320. {
  321.     GetNCVariantInfo()->SetLocalWriteHook(stream, hook);
  322. }
  323. void CObjectTypeInfoVI::SetGlobalWriteHook(CWriteChoiceVariantHook* hook) const
  324. {
  325.     GetNCVariantInfo()->SetGlobalWriteHook(hook);
  326. }
  327. void CObjectTypeInfoVI::ResetLocalWriteHook(CObjectOStream& stream) const
  328. {
  329.     GetNCVariantInfo()->ResetLocalWriteHook(stream);
  330. }
  331. void CObjectTypeInfoVI::ResetGlobalWriteHook(void) const
  332. {
  333.     GetNCVariantInfo()->ResetGlobalWriteHook();
  334. }
  335. void CObjectTypeInfoVI::SetPathWriteHook(CObjectOStream* stream, const string& path,
  336.                                          CWriteChoiceVariantHook* hook) const
  337. {
  338.     GetNCVariantInfo()->SetPathWriteHook(stream, path, hook);
  339. }
  340. void CObjectTypeInfoVI::SetLocalSkipHook(CObjectIStream& stream,
  341.                                          CSkipChoiceVariantHook* hook) const
  342. {
  343.     GetNCVariantInfo()->SetLocalSkipHook(stream, hook);
  344. }
  345. void CObjectTypeInfoVI::SetGlobalSkipHook(CSkipChoiceVariantHook* hook) const
  346. {
  347.     GetNCVariantInfo()->SetGlobalSkipHook(hook);
  348. }
  349. void CObjectTypeInfoVI::ResetLocalSkipHook(CObjectIStream& stream) const
  350. {
  351.     GetNCVariantInfo()->ResetLocalSkipHook(stream);
  352. }
  353. void CObjectTypeInfoVI::SetPathSkipHook(CObjectIStream* stream, const string& path,
  354.                                          CSkipChoiceVariantHook* hook) const
  355. {
  356.     GetNCVariantInfo()->SetPathSkipHook(stream, path, hook);
  357. }
  358. void CObjectTypeInfoVI::ResetGlobalSkipHook(void) const
  359. {
  360.     GetNCVariantInfo()->ResetGlobalSkipHook();
  361. }
  362. void CObjectTypeInfoVI::SetLocalCopyHook(CObjectStreamCopier& stream,
  363.                                          CCopyChoiceVariantHook* hook) const
  364. {
  365.     GetNCVariantInfo()->SetLocalCopyHook(stream, hook);
  366. }
  367. void CObjectTypeInfoVI::SetGlobalCopyHook(CCopyChoiceVariantHook* hook) const
  368. {
  369.     GetNCVariantInfo()->SetGlobalCopyHook(hook);
  370. }
  371. void CObjectTypeInfoVI::ResetLocalCopyHook(CObjectStreamCopier& stream) const
  372. {
  373.     GetNCVariantInfo()->ResetLocalCopyHook(stream);
  374. }
  375. void CObjectTypeInfoVI::ResetGlobalCopyHook(void) const
  376. {
  377.     GetNCVariantInfo()->ResetGlobalCopyHook();
  378. }
  379. void CObjectTypeInfoVI::SetPathCopyHook(CObjectStreamCopier* stream, const string& path,
  380.                                          CCopyChoiceVariantHook* hook) const
  381. {
  382.     GetNCVariantInfo()->SetPathCopyHook(stream, path, hook);
  383. }
  384. void CObjectTypeInfoCV::SetLocalReadHook(CObjectIStream& stream,
  385.                                          CReadChoiceVariantHook* hook) const
  386. {
  387.     GetNCVariantInfo()->SetLocalReadHook(stream, hook);
  388. }
  389. void CObjectTypeInfoCV::SetGlobalReadHook(CReadChoiceVariantHook* hook) const
  390. {
  391.     GetNCVariantInfo()->SetGlobalReadHook(hook);
  392. }
  393. void CObjectTypeInfoCV::ResetLocalReadHook(CObjectIStream& stream) const
  394. {
  395.     GetNCVariantInfo()->ResetLocalReadHook(stream);
  396. }
  397. void CObjectTypeInfoCV::ResetGlobalReadHook(void) const
  398. {
  399.     GetNCVariantInfo()->ResetGlobalReadHook();
  400. }
  401. void CObjectTypeInfoCV::SetPathReadHook(CObjectIStream* stream, const string& path,
  402.                                         CReadChoiceVariantHook* hook) const
  403. {
  404.     GetNCVariantInfo()->SetPathReadHook(stream, path, hook);
  405. }
  406. void CObjectTypeInfoCV::SetLocalWriteHook(CObjectOStream& stream,
  407.                                           CWriteChoiceVariantHook* hook) const
  408. {
  409.     GetNCVariantInfo()->SetLocalWriteHook(stream, hook);
  410. }
  411. void CObjectTypeInfoCV::SetGlobalWriteHook(CWriteChoiceVariantHook* hook) const
  412. {
  413.     GetNCVariantInfo()->SetGlobalWriteHook(hook);
  414. }
  415. void CObjectTypeInfoCV::ResetLocalWriteHook(CObjectOStream& stream) const
  416. {
  417.     GetNCVariantInfo()->ResetLocalWriteHook(stream);
  418. }
  419. void CObjectTypeInfoCV::ResetGlobalWriteHook(void) const
  420. {
  421.     GetNCVariantInfo()->ResetGlobalWriteHook();
  422. }
  423. void CObjectTypeInfoCV::SetPathWriteHook(CObjectOStream* stream, const string& path,
  424.                                          CWriteChoiceVariantHook* hook) const
  425. {
  426.     GetNCVariantInfo()->SetPathWriteHook(stream, path, hook);
  427. }
  428. void CObjectTypeInfoCV::SetLocalCopyHook(CObjectStreamCopier& stream,
  429.                                          CCopyChoiceVariantHook* hook) const
  430. {
  431.     GetNCVariantInfo()->SetLocalCopyHook(stream, hook);
  432. }
  433. void CObjectTypeInfoCV::SetGlobalCopyHook(CCopyChoiceVariantHook* hook) const
  434. {
  435.     GetNCVariantInfo()->SetGlobalCopyHook(hook);
  436. }
  437. void CObjectTypeInfoCV::ResetLocalCopyHook(CObjectStreamCopier& stream) const
  438. {
  439.     GetNCVariantInfo()->ResetLocalCopyHook(stream);
  440. }
  441. void CObjectTypeInfoCV::ResetGlobalCopyHook(void) const
  442. {
  443.     GetNCVariantInfo()->ResetGlobalCopyHook();
  444. }
  445. void CObjectTypeInfoCV::SetPathCopyHook(CObjectStreamCopier* stream, const string& path,
  446.                                         CCopyChoiceVariantHook* hook) const
  447. {
  448.     GetNCVariantInfo()->SetPathCopyHook(stream, path, hook);
  449. }
  450. void CObjectTypeInfoCV::Init(const CConstObjectInfo& object)
  451. {
  452.     m_ChoiceTypeInfo = object.GetChoiceTypeInfo();
  453.     m_VariantIndex = object.GetCurrentChoiceVariantIndex();
  454. }
  455. pair<TConstObjectPtr, TTypeInfo> CConstObjectInfoCV::GetVariantPair(void) const
  456. {
  457.     const CVariantInfo* variantInfo = GetVariantInfo();
  458.     return make_pair(variantInfo->GetVariantPtr(m_Object.GetObjectPtr()),
  459.                      variantInfo->GetTypeInfo());
  460. }
  461. pair<TObjectPtr, TTypeInfo> CObjectInfoCV::GetVariantPair(void) const
  462. {
  463.     TObjectPtr choicePtr = m_Object.GetObjectPtr();
  464.     const CChoiceTypeInfo* choiceTypeInfo = m_Object.GetChoiceTypeInfo();
  465.     TMemberIndex index = GetVariantIndex();
  466.     choiceTypeInfo->SetIndex(choicePtr, index);
  467.     const CVariantInfo* variantInfo = choiceTypeInfo->GetVariantInfo(index);
  468.     return make_pair(variantInfo->GetVariantPtr(choicePtr),
  469.                      variantInfo->GetTypeInfo());
  470. }
  471. END_NCBI_SCOPE