📄 pack_string.hpp
字号:
/* * =========================================================================== * PRODUCTION $Log: pack_string.hpp,v $ * PRODUCTION Revision 1000.0 2003/10/29 17:28:59 gouriano * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.1 * PRODUCTION * =========================================================================== */#ifndef PACK_STRING__HPP_INCLUDED#define PACK_STRING__HPP_INCLUDED/* $Id: pack_string.hpp,v 1000.0 2003/10/29 17:28:59 gouriano Exp $* ===========================================================================* PUBLIC DOMAIN NOTICE* National Center for Biotechnology Information** This software/database is a "United States Government Work" under the* terms of the United States Copyright Act. It was written as part of* the author's official duties as a United States Government employee and* thus cannot be copyrighted. This software/database is freely available* to the public for use. The National Library of Medicine and the U.S.* Government have not placed any restriction on its use or reproduction.** Although all reasonable efforts have been taken to ensure the accuracy* and reliability of the software and data, the NLM and the U.S.* Government do not and cannot warrant the performance or results that* may be obtained by using this software or data. The NLM and the U.S.* Government disclaim all warranties, express or implied, including* warranties of performance, merchantability or fitness for any particular* purpose.** Please cite the author in any work or product based on this material.* ===========================================================================** Author: Eugene Vasilchenko** File Description: Data reader from Pubseq_OS**/#include <serial/objhook.hpp>#include <serial/objecttype.hpp>#include <serial/objistr.hpp>#include <string>#include <set>BEGIN_NCBI_SCOPEclass NCBI_XSERIAL_EXPORT CPackString{public: CPackString(void); CPackString(size_t length_limit, size_t count_limit); ~CPackString(void); struct SNode { SNode(const string& s) : m_Length(s.size()), m_Chars(s.c_str()), m_CompressedIn(0) { } SNode(const SNode& n) : m_Length(n.m_Length), m_Chars(n.m_Chars), m_CompressedIn(0) { } SNode(const char* str, size_t len) : m_Length(len), m_Chars(str), m_CompressedIn(0) { } int x_Compare(const char* ptr) const { return memcmp(m_Chars, ptr, m_Length); } bool operator<(const SNode& n) const { return m_Length < n.m_Length || m_Length == n.m_Length && x_Compare(n.m_Chars) < 0; } bool operator==(const SNode& n) const { return m_Length == n.m_Length && x_Compare(n.m_Chars) == 0; } void AssignTo(string& s) const; void SetString(const string& s) const; void SetString(void) const; const string& GetString(void) const { return m_String; } size_t GetCount(void) const { return m_CompressedIn; } private: SNode& operator=(const SNode&); size_t m_Length; const char* m_Chars; string m_String; mutable size_t m_CompressedIn; }; typedef SNode TKey; typedef set<TKey> TStrings; typedef TStrings::iterator iterator; void ReadString(CObjectIStream& in, string& s); // return true if src was updated static bool Assign(string& s, const string& src); size_t GetLengthLimit(void) const; size_t GetCountLimit(void) const; size_t GetCount(void) const; // return true if the string is new in cache bool Pack(string& s); bool Pack(string& s, const char* data, size_t size); pair<iterator, bool> Locate(const char* data, size_t size); void AddOld(string& s, const iterator& iter); bool AddNew(string& s, const char* data, size_t size, iterator iter); void Skipped(void); static bool s_GetEnvFlag(const char* env, bool def_val); static bool TryStringPack(void); CNcbiOstream& DumpStatistics(CNcbiOstream& out) const;private: CPackString(const CPackString&); CPackString& operator=(const CPackString&); static void x_RefCounterError(void); // return true if src was updated static bool x_Assign(string& s, const string& src); size_t m_LengthLimit; size_t m_CountLimit; size_t m_Skipped; size_t m_CompressedIn; size_t m_CompressedOut; set<SNode> m_Strings;};class NCBI_XSERIAL_EXPORT CPackStringClassHook : public CReadClassMemberHook{public: CPackStringClassHook(void); CPackStringClassHook(size_t length_limit, size_t count_limit); ~CPackStringClassHook(void); void ReadClassMember(CObjectIStream& in, const CObjectInfoMI& member);private: CPackString m_PackString;};class NCBI_XSERIAL_EXPORT CPackStringChoiceHook : public CReadChoiceVariantHook{public: CPackStringChoiceHook(void); CPackStringChoiceHook(size_t length_limit, size_t count_limit); ~CPackStringChoiceHook(void); void ReadChoiceVariant(CObjectIStream& in, const CObjectInfoCV& variant);private: CPackString m_PackString;};/////////////////////////////////////////////////////////////////////////////// CPackString/////////////////////////////////////////////////////////////////////////////inlinesize_t CPackString::GetLengthLimit(void) const{ return m_LengthLimit;}inlinesize_t CPackString::GetCountLimit(void) const{ return m_CountLimit;}inlinesize_t CPackString::GetCount(void) const{ return m_CompressedOut;}inlinebool CPackString::Assign(string& s, const string& src){ s = src; if ( s.c_str() != src.c_str() ) { return x_Assign(s, src); } else { return false; }}inlinevoid CPackString::SNode::AssignTo(string& s) const{ ++m_CompressedIn; if ( CPackString::Assign(s, m_String) ) { const_cast<SNode*>(this)->m_Chars = m_String.c_str(); }}inlinevoid CPackString::SNode::SetString(const string& s) const{ _ASSERT(m_String.empty()); _ASSERT(s.size() == m_Length && x_Compare(s.c_str()) == 0); const_cast<SNode*>(this)->m_String = s; const_cast<SNode*>(this)->m_Chars = m_String.c_str();}inlinevoid CPackString::SNode::SetString(void) const{ _ASSERT(m_String.empty()); const_cast<SNode*>(this)->m_String.assign(m_Chars, m_Length); const_cast<SNode*>(this)->m_Chars = m_String.c_str();}inlinevoid CPackString::ReadString(CObjectIStream& in, string& s){ in.ReadString(s, *this);}inlinepair<CPackString::iterator, bool>CPackString::Locate(const char* data, size_t size){ pair<iterator, bool> ret; _ASSERT(size <= GetLengthLimit()); SNode key(data, size); ret.first = m_Strings.lower_bound(key); ret.second = ret.first != m_Strings.end() && *ret.first == key; return ret;}inlinevoid CPackString::AddOld(string& s, const iterator& iter){ ++m_CompressedIn; iter->AssignTo(s);}inlinevoid CPackString::Skipped(void){ ++m_Skipped;}inlineCNcbiOstream& operator<<(CNcbiOstream& out, const CPackString& pack_string){ return pack_string.DumpStatistics(out);}inlinevoid CPackStringClassHook::ReadClassMember(CObjectIStream& in, const CObjectInfoMI& member){ m_PackString.ReadString(in, *CType<string>::GetUnchecked(*member));}inlinevoid CPackStringChoiceHook::ReadChoiceVariant(CObjectIStream& in, const CObjectInfoCV& variant){ m_PackString.ReadString(in, *CType<string>::GetUnchecked(*variant));}END_NCBI_SCOPE/* * $Log: pack_string.hpp,v $ * Revision 1000.0 2003/10/29 17:28:59 gouriano * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.1 * * Revision 1.1 2003/08/19 18:32:38 vasilche * Optimized reading and writing strings. * Avoid string reallocation when checking char values. * Try to reuse old string data when string reference counting is not working. * * Revision 1.4 2003/08/15 19:19:15 vasilche * Fixed memory leak in string packing hooks. * Fixed processing of 'partial' flag of features. * Allow table packing of non-point SNP. * Allow table packing of SNP with long alleles. * * Revision 1.3 2003/08/14 20:05:18 vasilche * Simple SNP features are stored as table internally. * They are recreated when needed using CFeat_CI. * * Revision 1.2 2003/07/22 21:55:11 vasilche * Allow correct packing with limited reference counter (MSVC - 254 max). * * Revision 1.1 2003/07/17 20:07:55 vasilche * Reduced memory usage by feature indexes. * SNP data is loaded separately through PUBSEQ_OS. * String compression for SNP data. * */#endif // PACK_STRING__HPP_INCLUDED
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -