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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: objistr.inl,v $
  4.  * PRODUCTION Revision 1000.4  2004/04/12 17:15:04  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.30
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #if defined(OBJISTR__HPP)  &&  !defined(OBJISTR__INL)
  10. #define OBJISTR__INL
  11. /*  $Id: objistr.inl,v 1000.4 2004/04/12 17:15:04 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. ESerialDataFormat CObjectIStream::GetDataFormat(void) const
  43. {
  44.     return m_DataFormat;
  45. }
  46. inline
  47. CObjectIStream* CObjectIStream::Open(const string& fileName,
  48.                                      ESerialDataFormat format)
  49. {
  50.     return Open(format, fileName);
  51. }
  52. inline
  53. CObjectIStream::TFailFlags CObjectIStream::GetFailFlags(void) const
  54. {
  55.     return m_Fail;
  56. }
  57. inline
  58. bool CObjectIStream::fail(void) const
  59. {
  60.     return GetFailFlags() != 0;
  61. }
  62. inline
  63. CObjectIStream::TFailFlags CObjectIStream::ClearFailFlags(TFailFlags flags)
  64. {
  65.     TFailFlags old = GetFailFlags();
  66.     m_Fail &= ~flags;
  67.     return old;
  68. }
  69. inline
  70. CObjectIStream::TFlags CObjectIStream::GetFlags(void) const
  71. {
  72.     return m_Flags;
  73. }
  74. inline
  75. CObjectIStream::TFlags CObjectIStream::SetFlags(TFlags flags)
  76. {
  77.     TFlags old = GetFlags();
  78.     m_Flags |= flags;
  79.     return old;
  80. }
  81. inline
  82. CObjectIStream::TFlags CObjectIStream::ClearFlags(TFlags flags)
  83. {
  84.     TFlags old = GetFlags();
  85.     m_Flags &= ~flags;
  86.     return old;
  87. }
  88. inline
  89. void CObjectIStream::ReadObject(TObjectPtr object, TTypeInfo typeInfo)
  90. {
  91.     typeInfo->ReadData(*this, object);
  92. }
  93. inline
  94. void CObjectIStream::SkipObject(TTypeInfo typeInfo)
  95. {
  96.     typeInfo->SkipData(*this);
  97. }
  98. inline
  99. bool CObjectIStream::DetectLoops(void) const
  100. {
  101.     return m_Objects;
  102. }
  103. inline
  104. CObjectIStream& CObjectIStream::ByteBlock::GetStream(void) const
  105. {
  106.     return m_Stream;
  107. }
  108. inline
  109. bool CObjectIStream::ByteBlock::KnownLength(void) const
  110. {
  111.     return m_KnownLength;
  112. }
  113. inline
  114. size_t CObjectIStream::ByteBlock::GetExpectedLength(void) const
  115. {
  116.     return m_Length;
  117. }
  118. inline
  119. void CObjectIStream::ByteBlock::SetLength(size_t length)
  120. {
  121.     m_Length = length;
  122.     m_KnownLength = true;
  123. }
  124. inline
  125. void CObjectIStream::ByteBlock::EndOfBlock(void)
  126. {
  127.     _ASSERT(!KnownLength());
  128.     m_Length = 0;
  129. }
  130. inline
  131. CObjectIStream& CObjectIStream::CharBlock::GetStream(void) const
  132. {
  133.     return m_Stream;
  134. }
  135. inline
  136. bool CObjectIStream::CharBlock::KnownLength(void) const
  137. {
  138.     return m_KnownLength;
  139. }
  140. inline
  141. size_t CObjectIStream::CharBlock::GetExpectedLength(void) const
  142. {
  143.     return m_Length;
  144. }
  145. inline
  146. void CObjectIStream::CharBlock::SetLength(size_t length)
  147. {
  148.     m_Length = length;
  149.     m_KnownLength = true;
  150. }
  151. inline
  152. void CObjectIStream::CharBlock::EndOfBlock(void)
  153. {
  154.     _ASSERT(!KnownLength());
  155.     m_Length = 0;
  156. }
  157. // standard readers
  158. // bool
  159. inline
  160. void CObjectIStream::ReadStd(bool& data)
  161. {
  162.     data = ReadBool();
  163. }
  164. inline
  165. void CObjectIStream::SkipStd(const bool &)
  166. {
  167.     SkipBool();
  168. }
  169. // char
  170. inline
  171. void CObjectIStream::ReadStd(char& data)
  172. {
  173.     data = ReadChar();
  174. }
  175. inline
  176. void CObjectIStream::SkipStd(const char& )
  177. {
  178.     SkipChar();
  179. }
  180. // integer numbers
  181. #if SIZEOF_CHAR == 1
  182. inline
  183. void CObjectIStream::ReadStd(signed char& data)
  184. {
  185.     data = ReadInt1();
  186. }
  187. inline
  188. void CObjectIStream::ReadStd(unsigned char& data)
  189. {
  190.     data = ReadUint1();
  191. }
  192. inline
  193. void CObjectIStream::SkipStd(const signed char& )
  194. {
  195.     SkipInt1();
  196. }
  197. inline
  198. void CObjectIStream::SkipStd(const unsigned char& )
  199. {
  200.     SkipUint1();
  201. }
  202. #else
  203. #  error Unsupported size of char - must be 1
  204. #endif
  205. #if SIZEOF_SHORT == 2
  206. inline
  207. void CObjectIStream::ReadStd(short& data)
  208. {
  209.     data = ReadInt2();
  210. }
  211. inline
  212. void CObjectIStream::ReadStd(unsigned short& data)
  213. {
  214.     data = ReadUint2();
  215. }
  216. inline
  217. void CObjectIStream::SkipStd(const short& )
  218. {
  219.     SkipInt2();
  220. }
  221. inline
  222. void CObjectIStream::SkipStd(const unsigned short& )
  223. {
  224.     SkipUint2();
  225. }
  226. #else
  227. #  error Unsupported size of short - must be 2
  228. #endif
  229. #if SIZEOF_INT == 4
  230. inline
  231. void CObjectIStream::ReadStd(int& data)
  232. {
  233.     data = ReadInt4();
  234. }
  235. inline
  236. void CObjectIStream::ReadStd(unsigned& data)
  237. {
  238.     data = ReadUint4();
  239. }
  240. inline
  241. void CObjectIStream::SkipStd(const int& )
  242. {
  243.     SkipInt4();
  244. }
  245. inline
  246. void CObjectIStream::SkipStd(const unsigned& )
  247. {
  248.     SkipUint4();
  249. }
  250. #else
  251. #  error Unsupported size of int - must be 4
  252. #endif
  253. #if SIZEOF_LONG == 4
  254. inline
  255. void CObjectIStream::ReadStd(long& data)
  256. {
  257.     data = ReadInt4();
  258. }
  259. inline
  260. void CObjectIStream::ReadStd(unsigned long& data)
  261. {
  262.     data = ReadUint4();
  263. }
  264. inline
  265. void CObjectIStream::SkipStd(const long& )
  266. {
  267.     SkipInt4();
  268. }
  269. inline
  270. void CObjectIStream::SkipStd(const unsigned long& )
  271. {
  272.     SkipUint4();
  273. }
  274. #endif
  275. inline
  276. void CObjectIStream::ReadStd(Int8& data)
  277. {
  278.     data = ReadInt8();
  279. }
  280. inline
  281. void CObjectIStream::ReadStd(Uint8& data)
  282. {
  283.     data = ReadUint8();
  284. }
  285. inline
  286. void CObjectIStream::SkipStd(const Int8& )
  287. {
  288.     SkipInt8();
  289. }
  290. inline
  291. void CObjectIStream::SkipStd(const Uint8& )
  292. {
  293.     SkipUint8();
  294. }
  295. // float numbers
  296. inline
  297. void CObjectIStream::ReadStd(float& data)
  298. {
  299.     data = ReadFloat();
  300. }
  301. inline
  302. void CObjectIStream::ReadStd(double& data)
  303. {
  304.     data = ReadDouble();
  305. }
  306. inline
  307. void CObjectIStream::SkipStd(const float& )
  308. {
  309.     SkipFloat();
  310. }
  311. inline
  312. void CObjectIStream::SkipStd(const double& )
  313. {
  314.     SkipDouble();
  315. }
  316. #if SIZEOF_LONG_DOUBLE != 0
  317. inline
  318. void CObjectIStream::ReadStd(long double& data)
  319. {
  320.     data = ReadLDouble();
  321. }
  322. inline
  323. void CObjectIStream::SkipStd(const long double& )
  324. {
  325.     SkipLDouble();
  326. }
  327. #endif
  328. // string
  329. inline
  330. void CObjectIStream::ReadStd(string& data)
  331. {
  332.     ReadString(data);
  333. }
  334. inline
  335. void CObjectIStream::SkipStd(const string& )
  336. {
  337.     SkipString();
  338. }
  339. inline
  340. void CObjectIStream::ReadStd(CStringUTF8& data)
  341. {
  342.     ReadString(data, eStringTypeUTF8);
  343. }
  344. inline
  345. void CObjectIStream::SkipStd(CStringUTF8& )
  346. {
  347.     SkipString(eStringTypeUTF8);
  348. }
  349. // C string
  350. inline
  351. void CObjectIStream::ReadStd(char* & data)
  352. {
  353.     data = ReadCString();
  354. }
  355. inline
  356. void CObjectIStream::ReadStd(const char* & data)
  357. {
  358.     data = ReadCString();
  359. }
  360. inline
  361. void CObjectIStream::SkipStd(char* const& )
  362. {
  363.     SkipCString();
  364. }
  365. inline
  366. void CObjectIStream::SkipStd(const char* const& )
  367. {
  368.     SkipCString();
  369. }
  370. inline
  371. bool GoodVisibleChar(char c)
  372. {
  373.     return c >= ' ' && c <= '~';
  374. }
  375. inline
  376. void FixVisibleChar(char& c, EFixNonPrint fix_method, size_t at_line)
  377. {
  378.     if ( !GoodVisibleChar(c) ) {
  379.         c = ReplaceVisibleChar(c, fix_method, at_line);
  380.     }
  381. }
  382. inline
  383. void CObjectIStream::SetVerifyData(ESerialVerifyData verify)
  384. {
  385.     if (m_VerifyData == eSerialVerifyData_Never ||
  386.         m_VerifyData == eSerialVerifyData_Always ||
  387.         m_VerifyData == eSerialVerifyData_DefValueAlways) {
  388.         return;
  389.     }
  390.     m_VerifyData = (verify == eSerialVerifyData_Default) ?
  391.                    x_GetVerifyDataDefault() : verify;
  392. }
  393. inline
  394. ESerialVerifyData CObjectIStream::GetVerifyData(void) const
  395. {
  396.     switch (m_VerifyData) {
  397.     default:
  398.         break;
  399.     case eSerialVerifyData_No:
  400.     case eSerialVerifyData_Never:
  401.         return eSerialVerifyData_No;
  402.     case eSerialVerifyData_Yes:
  403.     case eSerialVerifyData_Always:
  404.         return eSerialVerifyData_Yes;
  405.     case eSerialVerifyData_DefValue:
  406.     case eSerialVerifyData_DefValueAlways:
  407.         return eSerialVerifyData_DefValue;
  408.     }
  409.     return ms_VerifyDataDefault;
  410. }
  411. inline
  412. void CObjectIStream::SetSkipUnknownMembers(ESerialSkipUnknown skip)
  413. {
  414.     if (m_SkipUnknown == eSerialSkipUnknown_Never ||
  415.         m_SkipUnknown == eSerialSkipUnknown_Always) {
  416.         return;
  417.     }
  418.     m_SkipUnknown = (skip == eSerialSkipUnknown_Default) ?
  419.                     x_GetSkipUnknownDefault() : skip;
  420. }
  421. inline
  422. ESerialSkipUnknown CObjectIStream::GetSkipUnknownMembers(void)
  423. {
  424.     switch (m_SkipUnknown) {
  425.     default:
  426.         break;
  427.     case eSerialSkipUnknown_No:
  428.     case eSerialSkipUnknown_Never:
  429.         return eSerialSkipUnknown_No;
  430.     case eSerialSkipUnknown_Yes:
  431.     case eSerialSkipUnknown_Always:
  432.         return eSerialSkipUnknown_Yes;
  433.     }
  434.     return ms_SkipUnknownDefault;
  435. }
  436. inline
  437. bool CObjectIStream::HaveMoreData(void)
  438. {
  439.     return m_Input.PeekChar() != EOF;
  440. }
  441. inline
  442. CStreamDelayBufferGuard::CStreamDelayBufferGuard(CObjectIStream& istr) 
  443.     : m_ObjectIStream(&istr) 
  444. {
  445.     istr.StartDelayBuffer();
  446. }
  447. inline
  448. CStreamDelayBufferGuard::~CStreamDelayBufferGuard()
  449. {
  450.     if (m_ObjectIStream)
  451.         m_ObjectIStream->EndDelayBuffer();
  452. }
  453. inline
  454. CRef<CByteSource> CStreamDelayBufferGuard::EndDelayBuffer(void)
  455. {
  456.     CObjectIStream* tmp = m_ObjectIStream;
  457.     m_ObjectIStream = 0;
  458.     return tmp->EndDelayBuffer();
  459. }
  460. inline
  461. void CStreamDelayBufferGuard::EndDelayBuffer(CDelayBuffer& buffer,
  462.                                              const CItemInfo* itemInfo, 
  463.                                              TObjectPtr objectPtr)
  464. {
  465.     m_ObjectIStream->EndDelayBuffer(buffer, itemInfo, objectPtr);
  466.     m_ObjectIStream = 0;
  467. }
  468. #endif /* def OBJISTR__HPP  &&  ndef OBJISTR__INL */
  469. /* ---------------------------------------------------------------------------
  470. * $Log: objistr.inl,v $
  471. * Revision 1000.4  2004/04/12 17:15:04  gouriano
  472. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.30
  473. *
  474. * Revision 1.30  2004/03/23 15:39:52  gouriano
  475. * Added setup options for skipping unknown data members
  476. *
  477. * Revision 1.29  2004/03/05 20:28:37  gouriano
  478. * make it possible to skip unknown data fields
  479. *
  480. * Revision 1.28  2004/02/09 18:21:52  gouriano
  481. * enforced checking environment vars when setting initialization
  482. * verification parameters
  483. *
  484. * Revision 1.27  2003/11/26 19:59:37  vasilche
  485. * GetPosition() and GetDataFormat() methods now are implemented
  486. * in parent classes CObjectIStream and CObjectOStream to avoid
  487. * pure virtual method call in destructors.
  488. *
  489. * Revision 1.26  2003/11/19 15:42:10  vasilche
  490. * Added CObjectIStream::HaveMoreData().
  491. *
  492. * Revision 1.25  2003/11/13 14:06:45  gouriano
  493. * Elaborated data verification on read/write/get to enable skipping mandatory class data members
  494. *
  495. * Revision 1.24  2003/09/24 20:55:13  kuznets
  496. * Implemented CStreamDelayBufferGuard
  497. *
  498. * Revision 1.23  2003/09/10 20:57:23  gouriano
  499. * added possibility to ignore missing mandatory members on reading
  500. *
  501. * Revision 1.22  2003/08/19 18:32:37  vasilche
  502. * Optimized reading and writing strings.
  503. * Avoid string reallocation when checking char values.
  504. * Try to reuse old string data when string reference counting is not working.
  505. *
  506. * Revision 1.21  2003/05/22 20:08:41  gouriano
  507. * added UTF8 strings
  508. *
  509. * Revision 1.20  2002/12/23 18:38:51  dicuccio
  510. * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  511. * Moved all CVS logs to the end.
  512. *
  513. * Revision 1.19  2002/10/25 14:49:29  vasilche
  514. * NCBI C Toolkit compatibility code extracted to libxcser library.
  515. * Serial streams flags names were renamed to fXxx.
  516. *
  517. * Names of flags
  518. *
  519. * Revision 1.18  2001/10/17 20:41:19  grichenk
  520. * Added CObjectOStream::CharBlock class
  521. *
  522. * Revision 1.17  2001/07/17 14:52:39  kholodov
  523. * Fixed: replaced int argument by size_t in CheckVisibleChar() and
  524. * ReplaceVisibleChar to avoid truncation in 64 bit mode.
  525. *
  526. * Revision 1.16  2001/06/11 14:34:55  grichenk
  527. * Added support for numeric tags in ASN.1 specifications and data streams.
  528. *
  529. * Revision 1.15  2001/06/07 17:12:46  grichenk
  530. * Redesigned checking and substitution of non-printable characters
  531. * in VisibleString
  532. *
  533. * Revision 1.14  2001/05/17 14:59:17  lavr
  534. * Typos corrected
  535. *
  536. * Revision 1.13  2000/12/15 21:28:47  vasilche
  537. * Moved some typedefs/enums from corelib/ncbistd.hpp.
  538. * Added flags to CObjectIStream/CObjectOStream: eFlagAllowNonAsciiChars.
  539. * TByte typedef replaced by Uint1.
  540. *
  541. * Revision 1.12  2000/12/15 15:38:00  vasilche
  542. * Added support of Int8 and long double.
  543. * Enum values now have type Int4 instead of long.
  544. *
  545. * Revision 1.11  2000/10/20 15:51:26  vasilche
  546. * Fixed data error processing.
  547. * Added interface for constructing container objects directly into output stream.
  548. * object.hpp, object.inl and object.cpp were split to
  549. * objectinfo.*, objecttype.*, objectiter.* and objectio.*.
  550. *
  551. * Revision 1.10  2000/10/03 17:22:34  vasilche
  552. * Reduced header dependency.
  553. * Reduced size of debug libraries on WorkShop by 3 times.
  554. * Fixed tag allocation for parent classes.
  555. * Fixed CObject allocation/deallocation in streams.
  556. * Moved instantiation of several templates in separate source file.
  557. *
  558. * Revision 1.9  2000/09/29 16:18:13  vasilche
  559. * Fixed binary format encoding/decoding on 64 bit compulers.
  560. * Implemented CWeakMap<> for automatic cleaning map entries.
  561. * Added cleaning local hooks via CWeakMap<>.
  562. * Renamed ReadTypeName -> ReadFileHeader, ENoTypeName -> ENoFileHeader.
  563. * Added some user interface methods to CObjectIStream, CObjectOStream and
  564. * CObjectStreamCopier.
  565. *
  566. * Revision 1.8  2000/09/18 20:00:05  vasilche
  567. * Separated CVariantInfo and CMemberInfo.
  568. * Implemented copy hooks.
  569. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  570. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  571. *
  572. * Revision 1.7  2000/08/15 19:44:40  vasilche
  573. * Added Read/Write hooks:
  574. * CReadObjectHook/CWriteObjectHook for objects of specified type.
  575. * CReadClassMemberHook/CWriteClassMemberHook for specified members.
  576. * CReadChoiceVariantHook/CWriteChoiceVariant for specified choice variants.
  577. * CReadContainerElementHook/CWriteContainerElementsHook for containers.
  578. *
  579. * Revision 1.6  2000/06/16 20:01:20  vasilche
  580. * Avoid use of unexpected_exception() which is unimplemented on Mac.
  581. *
  582. * Revision 1.5  2000/05/24 20:08:13  vasilche
  583. * Implemented XML dump.
  584. *
  585. * Revision 1.4  2000/05/09 16:38:33  vasilche
  586. * CObject::GetTypeInfo now moved to CObjectGetTypeInfo::GetTypeInfo to reduce possible errors.
  587. * Added write context to CObjectOStream.
  588. * Inlined most of methods of helping class Member, Block, ByteBlock etc.
  589. *
  590. * Revision 1.3  2000/05/04 16:22:23  vasilche
  591. * Cleaned and optimized blocks and members.
  592. *
  593. * ===========================================================================
  594. */