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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: pack_string.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 17:28:59  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.1
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef PACK_STRING__HPP_INCLUDED
  10. #define PACK_STRING__HPP_INCLUDED
  11. /*  $Id: pack_string.hpp,v 1000.0 2003/10/29 17:28:59 gouriano Exp $
  12. * ===========================================================================
  13. *                            PUBLIC DOMAIN NOTICE
  14. *               National Center for Biotechnology Information
  15. *
  16. *  This software/database is a "United States Government Work" under the
  17. *  terms of the United States Copyright Act.  It was written as part of
  18. *  the author's official duties as a United States Government employee and
  19. *  thus cannot be copyrighted.  This software/database is freely available
  20. *  to the public for use. The National Library of Medicine and the U.S.
  21. *  Government have not placed any restriction on its use or reproduction.
  22. *
  23. *  Although all reasonable efforts have been taken to ensure the accuracy
  24. *  and reliability of the software and data, the NLM and the U.S.
  25. *  Government do not and cannot warrant the performance or results that
  26. *  may be obtained by using this software or data. The NLM and the U.S.
  27. *  Government disclaim all warranties, express or implied, including
  28. *  warranties of performance, merchantability or fitness for any particular
  29. *  purpose.
  30. *
  31. *  Please cite the author in any work or product based on this material.
  32. * ===========================================================================
  33. *
  34. *  Author:  Eugene Vasilchenko
  35. *
  36. *  File Description: Data reader from Pubseq_OS
  37. *
  38. */
  39. #include <serial/objhook.hpp>
  40. #include <serial/objecttype.hpp>
  41. #include <serial/objistr.hpp>
  42. #include <string>
  43. #include <set>
  44. BEGIN_NCBI_SCOPE
  45. class NCBI_XSERIAL_EXPORT CPackString
  46. {
  47. public:
  48.     CPackString(void);
  49.     CPackString(size_t length_limit, size_t count_limit);
  50.     ~CPackString(void);
  51.     struct SNode {
  52.         SNode(const string& s)
  53.             : m_Length(s.size()),
  54.               m_Chars(s.c_str()),
  55.               m_CompressedIn(0)
  56.             {
  57.             }
  58.         SNode(const SNode& n)
  59.             : m_Length(n.m_Length),
  60.               m_Chars(n.m_Chars),
  61.               m_CompressedIn(0)
  62.             {
  63.             }
  64.         SNode(const char* str, size_t len)
  65.             : m_Length(len),
  66.               m_Chars(str),
  67.               m_CompressedIn(0)
  68.             {
  69.             }
  70.         int x_Compare(const char* ptr) const
  71.             {
  72.                 return memcmp(m_Chars, ptr, m_Length);
  73.             }
  74.         bool operator<(const SNode& n) const
  75.             {
  76.                 return m_Length < n.m_Length ||
  77.                     m_Length == n.m_Length && x_Compare(n.m_Chars) < 0;
  78.             }
  79.         bool operator==(const SNode& n) const
  80.             {
  81.                 return m_Length == n.m_Length && x_Compare(n.m_Chars) == 0;
  82.             }
  83.         void AssignTo(string& s) const;
  84.         void SetString(const string& s) const;
  85.         void SetString(void) const;
  86.         const string& GetString(void) const
  87.             {
  88.                 return m_String;
  89.             }
  90.         size_t GetCount(void) const
  91.             {
  92.                 return m_CompressedIn;
  93.             }
  94.         
  95.     private:
  96.         SNode& operator=(const SNode&);
  97.         size_t m_Length;
  98.         const char* m_Chars;
  99.         string m_String;
  100.         mutable size_t m_CompressedIn;
  101.     };
  102.     typedef SNode TKey;
  103.     typedef set<TKey> TStrings;
  104.     typedef TStrings::iterator iterator;
  105.     
  106.     void ReadString(CObjectIStream& in, string& s);
  107.     // return true if src was updated
  108.     static bool Assign(string& s, const string& src);
  109.     size_t GetLengthLimit(void) const;
  110.     size_t GetCountLimit(void) const;
  111.     size_t GetCount(void) const;
  112.     // return true if the string is new in cache
  113.     bool Pack(string& s);
  114.     bool Pack(string& s, const char* data, size_t size);
  115.     
  116.     pair<iterator, bool> Locate(const char* data, size_t size);
  117.     void AddOld(string& s, const iterator& iter);
  118.     bool AddNew(string& s, const char* data, size_t size, iterator iter);
  119.     void Skipped(void);
  120.     static bool s_GetEnvFlag(const char* env, bool def_val);
  121.     static bool TryStringPack(void);
  122.     CNcbiOstream& DumpStatistics(CNcbiOstream& out) const;
  123. private:
  124.     CPackString(const CPackString&);
  125.     CPackString& operator=(const CPackString&);
  126.     static void x_RefCounterError(void);
  127.     // return true if src was updated
  128.     static bool x_Assign(string& s, const string& src);
  129.     size_t m_LengthLimit;
  130.     size_t m_CountLimit;
  131.     size_t m_Skipped;
  132.     size_t m_CompressedIn;
  133.     size_t m_CompressedOut;
  134.     set<SNode> m_Strings;
  135. };
  136. class NCBI_XSERIAL_EXPORT CPackStringClassHook : public CReadClassMemberHook
  137. {
  138. public:
  139.     CPackStringClassHook(void);
  140.     CPackStringClassHook(size_t length_limit, size_t count_limit);
  141.     ~CPackStringClassHook(void);
  142.     
  143.     void ReadClassMember(CObjectIStream& in, const CObjectInfoMI& member);
  144. private:
  145.     CPackString m_PackString;
  146. };
  147. class NCBI_XSERIAL_EXPORT CPackStringChoiceHook : public CReadChoiceVariantHook
  148. {
  149. public:
  150.     CPackStringChoiceHook(void);
  151.     CPackStringChoiceHook(size_t length_limit, size_t count_limit);
  152.     ~CPackStringChoiceHook(void);
  153.     void ReadChoiceVariant(CObjectIStream& in, const CObjectInfoCV& variant);
  154. private:
  155.     CPackString m_PackString;
  156. };
  157. /////////////////////////////////////////////////////////////////////////////
  158. // CPackString
  159. /////////////////////////////////////////////////////////////////////////////
  160. inline
  161. size_t CPackString::GetLengthLimit(void) const
  162. {
  163.     return m_LengthLimit;
  164. }
  165. inline
  166. size_t CPackString::GetCountLimit(void) const
  167. {
  168.     return m_CountLimit;
  169. }
  170. inline
  171. size_t CPackString::GetCount(void) const
  172. {
  173.     return m_CompressedOut;
  174. }
  175. inline
  176. bool CPackString::Assign(string& s, const string& src)
  177. {
  178.     s = src;
  179.     if ( s.c_str() != src.c_str() ) {
  180.         return x_Assign(s, src);
  181.     }
  182.     else {
  183.         return false;
  184.     }
  185. }
  186. inline
  187. void CPackString::SNode::AssignTo(string& s) const
  188. {
  189.     ++m_CompressedIn;
  190.     if ( CPackString::Assign(s, m_String) ) {
  191.         const_cast<SNode*>(this)->m_Chars = m_String.c_str();
  192.     }
  193. }
  194. inline
  195. void CPackString::SNode::SetString(const string& s) const
  196. {
  197.     _ASSERT(m_String.empty());
  198.     _ASSERT(s.size() == m_Length && x_Compare(s.c_str()) == 0);
  199.     const_cast<SNode*>(this)->m_String = s;
  200.     const_cast<SNode*>(this)->m_Chars = m_String.c_str();
  201. }
  202. inline
  203. void CPackString::SNode::SetString(void) const
  204. {
  205.     _ASSERT(m_String.empty());
  206.     const_cast<SNode*>(this)->m_String.assign(m_Chars, m_Length);
  207.     const_cast<SNode*>(this)->m_Chars = m_String.c_str();
  208. }
  209. inline
  210. void CPackString::ReadString(CObjectIStream& in, string& s)
  211. {
  212.     in.ReadString(s, *this);
  213. }
  214. inline
  215. pair<CPackString::iterator, bool>
  216. CPackString::Locate(const char* data, size_t size)
  217. {
  218.     pair<iterator, bool> ret;
  219.     _ASSERT(size <= GetLengthLimit());
  220.     SNode key(data, size);
  221.     ret.first = m_Strings.lower_bound(key);
  222.     ret.second = ret.first != m_Strings.end() && *ret.first == key;
  223.     return ret;
  224. }
  225. inline
  226. void CPackString::AddOld(string& s, const iterator& iter)
  227. {
  228.     ++m_CompressedIn;
  229.     iter->AssignTo(s);
  230. }
  231. inline
  232. void CPackString::Skipped(void)
  233. {
  234.     ++m_Skipped;
  235. }
  236. inline
  237. CNcbiOstream& operator<<(CNcbiOstream& out, const CPackString& pack_string)
  238. {
  239.     return pack_string.DumpStatistics(out);
  240. }
  241. inline
  242. void CPackStringClassHook::ReadClassMember(CObjectIStream& in,
  243.                                            const CObjectInfoMI& member)
  244. {
  245.     m_PackString.ReadString(in, *CType<string>::GetUnchecked(*member));
  246. }
  247. inline
  248. void CPackStringChoiceHook::ReadChoiceVariant(CObjectIStream& in,
  249.                                               const CObjectInfoCV& variant)
  250. {
  251.     m_PackString.ReadString(in, *CType<string>::GetUnchecked(*variant));
  252. }
  253. END_NCBI_SCOPE
  254. /*
  255.  * $Log: pack_string.hpp,v $
  256.  * Revision 1000.0  2003/10/29 17:28:59  gouriano
  257.  * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.1
  258.  *
  259.  * Revision 1.1  2003/08/19 18:32:38  vasilche
  260.  * Optimized reading and writing strings.
  261.  * Avoid string reallocation when checking char values.
  262.  * Try to reuse old string data when string reference counting is not working.
  263.  *
  264.  * Revision 1.4  2003/08/15 19:19:15  vasilche
  265.  * Fixed memory leak in string packing hooks.
  266.  * Fixed processing of 'partial' flag of features.
  267.  * Allow table packing of non-point SNP.
  268.  * Allow table packing of SNP with long alleles.
  269.  *
  270.  * Revision 1.3  2003/08/14 20:05:18  vasilche
  271.  * Simple SNP features are stored as table internally.
  272.  * They are recreated when needed using CFeat_CI.
  273.  *
  274.  * Revision 1.2  2003/07/22 21:55:11  vasilche
  275.  * Allow correct packing with limited reference counter (MSVC - 254 max).
  276.  *
  277.  * Revision 1.1  2003/07/17 20:07:55  vasilche
  278.  * Reduced memory usage by feature indexes.
  279.  * SNP data is loaded separately through PUBSEQ_OS.
  280.  * String compression for SNP data.
  281.  *
  282.  */
  283. #endif // PACK_STRING__HPP_INCLUDED