seq_id_handle.cpp
来自「ncbi源码」· C++ 代码 · 共 395 行
CPP
395 行
/* * =========================================================================== * PRODUCTION $Log: seq_id_handle.cpp,v $ * PRODUCTION Revision 1000.3 2004/06/01 19:24:02 gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.21 * PRODUCTION * =========================================================================== *//* $Id: seq_id_handle.cpp,v 1000.3 2004/06/01 19:24:02 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: Aleksey Grichenko, Eugene Vasilchenko** File Description:* Seq-id handle for Object Manager**/#include <ncbi_pch.hpp>#include <corelib/ncbiobj.hpp>#include <corelib/ncbimtx.hpp>#include <corelib/ncbiatomic.hpp>#include <objmgr/seq_id_handle.hpp>#include <objmgr/seq_id_mapper.hpp>#include <objmgr/impl/seq_id_tree.hpp>#include <serial/typeinfo.hpp>BEGIN_NCBI_SCOPEBEGIN_SCOPE(objects)/////////////////////////////////////////////////////////////////////////////// CSeq_id_Info////#define NCBI_SLOW_ATOMIC_SWAP#ifdef NCBI_SLOW_ATOMIC_SWAPDEFINE_STATIC_FAST_MUTEX(sx_GetSeqIdMutex);#endifCConstRef<CSeq_id> CSeq_id_Info::GetGiSeqId(int gi) const{ CConstRef<CSeq_id> ret;#if defined NCBI_SLOW_ATOMIC_SWAP CFastMutexGuard guard(sx_GetSeqIdMutex); ret = m_Seq_id; const_cast<CSeq_id_Info*>(this)->m_Seq_id.Reset(); if ( !ret || !ret->ReferencedOnlyOnce() ) { ret.Reset(new CSeq_id); } const_cast<CSeq_id_Info*>(this)->m_Seq_id = ret;#else const_cast<CSeq_id_Info*>(this)->m_Seq_id.AtomicReleaseTo(ret); if ( !ret || !ret->ReferencedOnlyOnce() ) { ret.Reset(new CSeq_id); } const_cast<CSeq_id_Info*>(this)->m_Seq_id.AtomicResetFrom(ret);#endif const_cast<CSeq_id&>(*ret).SetGi(gi); return ret;}CSeq_id_Info::~CSeq_id_Info(void){ _ASSERT(m_Counter.Get() == 0 && m_Tree); m_Tree = 0;}void CSeq_id_Info::x_RemoveLastReference(void) const{ m_Tree->DropInfo(this);}//////////////////////////////////////////////////////////////////////// CSeq_id_Handle:://CConstRef<CSeq_id> CSeq_id_Handle::GetSeqId(void) const{ _ASSERT(m_Info); CConstRef<CSeq_id> ret; if ( IsGi() ) { ret = m_Info->GetGiSeqId(GetGi()); } else { ret = m_Info->GetSeqId(); } return ret;}CConstRef<CSeq_id> CSeq_id_Handle::GetSeqIdOrNull(void) const{ CConstRef<CSeq_id> ret; if ( IsGi() ) { _ASSERT(m_Info); ret = m_Info->GetGiSeqId(GetGi()); } else if ( m_Info ) { ret = m_Info->GetSeqId(); } return ret;}CSeq_id_Handle CSeq_id_Handle::GetGiHandle(int gi){ return CSeq_id_Mapper::GetSeq_id_Mapper().GetGiHandle(gi);}CSeq_id_Handle CSeq_id_Handle::GetHandle(const CSeq_id& id){ return CSeq_id_Mapper::GetSeq_id_Mapper().GetHandle(id);}#ifdef _DEBUGstatic int s_GetDebugSeqIds(void){ const char* env = getenv("NCBI_OBJMGR_DEBUG_SEQID"); if ( !env || !*env ) return 0; if ( *env >= '0' && *env <= '9' ) return *env - '0'; return 1;}static int s_DebugSeqIds(void){ static int debug = s_GetDebugSeqIds(); return debug;}static int s_GetDebugSeqIdsCounter(void){ const char* env = getenv("NCBI_OBJMGR_DEBUG_SEQID_COUNTER"); if ( !env || !*env ) return 0; try { return NStr::StringToInt(env); } catch ( ... ) { return 0; }}static int s_DebugSeqIdsCounter(void){ static int debug = s_GetDebugSeqIdsCounter(); return debug;}DEFINE_STATIC_FAST_MUTEX(s_RegisterMutex);typedef map<const CSeq_id_Handle*, int> TRegisterSet;static TRegisterSet* s_RegisterSet = 0;static int s_Counter = 0;#endifvoid CSeq_id_Handle::x_Register(void){#ifdef _DEBUG int debug = s_DebugSeqIds(); if ( debug ) { CFastMutexGuard guard(s_RegisterMutex); if ( debug >= 5 ) { ERR_POST(Warning << "Register of CSeq_id_Handle: "<<this); } if ( ++s_Counter == s_DebugSeqIdsCounter() ) { _ASSERT("CSeq_id_Handle counter" && 0); } if ( !s_RegisterSet ) s_RegisterSet = new TRegisterSet; pair<TRegisterSet::iterator, bool> ins = s_RegisterSet->insert(TRegisterSet::value_type(this, s_Counter)); if ( !ins.second ) { ERR_POST("Double register of CSeq_id_Handle: "<<this<< " index: "<<s_Counter<< ", first index: " << ins.first->second); } }#endif}void CSeq_id_Handle::x_Deregister(void){#ifdef _DEBUG int debug = s_DebugSeqIds(); if ( debug ) { CFastMutexGuard guard(s_RegisterMutex); if ( debug >= 5 ) { ERR_POST(Warning << "Deregister of CSeq_id_Handle: "<<this); } if ( !s_RegisterSet || !s_RegisterSet->erase(this) ) { ERR_POST("Deregister of non-registered CSeq_id_Handle: "<<this); } if ( s_RegisterSet && s_RegisterSet->empty() ) { delete s_RegisterSet; s_RegisterSet = 0; } }#endif}void CSeq_id_Handle::DumpRegister(const char* _DEBUG_ARG(msg)){#ifdef _DEBUG if ( s_DebugSeqIds() ) { CFastMutexGuard guard(s_RegisterMutex); if ( s_RegisterSet && !s_RegisterSet->empty() ) { ERR_POST("CSeq_id_Handle::x_DumpRegister: " << msg); ITERATE ( TRegisterSet, it, *s_RegisterSet ) { ERR_POST(" CSeq_id_Handle: "<<it->first<< " was registered at index: "<<it->second); } } }#endif}bool CSeq_id_Handle::x_Match(const CSeq_id_Handle& handle) const{ // Different mappers -- handle can not be equal if ( !*this ) { return !handle; } if ( !handle ) return false; return GetSeqId()->Match(*handle.GetSeqId());}bool CSeq_id_Handle::IsBetter(const CSeq_id_Handle& h) const{ return CSeq_id_Mapper::GetSeq_id_Mapper().x_IsBetter(*this, h);}bool CSeq_id_Handle::operator==(const CSeq_id& id) const{ if ( IsGi() ) { return id.IsGi() && id.GetGi() == GetGi(); } return *this == CSeq_id_Mapper::GetSeq_id_Mapper().GetHandle(id);}string CSeq_id_Handle::AsString() const{ CNcbiOstrstream os; if ( IsGi() ) { os << "gi|" << GetGi(); } else if ( m_Info ) { m_Info->GetSeqId()->WriteAsFasta(os); } else { os << "unknown"; } return CNcbiOstrstreamToString(os);}END_SCOPE(objects)END_NCBI_SCOPE/** ---------------------------------------------------------------------------* $Log: seq_id_handle.cpp,v $* Revision 1000.3 2004/06/01 19:24:02 gouriano* PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.21** Revision 1.21 2004/05/21 21:42:13 gorelenk* Added PCH ncbi_pch.hpp** Revision 1.20 2004/03/24 18:30:30 vasilche* Fixed edit API.* Every *_Info object has its own shallow copy of original object.** Revision 1.19 2004/02/19 17:25:34 vasilche* Use CRef<> to safely hold pointer to CSeq_id_Info.* CSeq_id_Info holds pointer to owner CSeq_id_Which_Tree.* Reduce number of calls to CSeq_id_Handle.GetSeqId().** Revision 1.18 2004/01/22 20:10:41 vasilche* 1. Splitted ID2 specs to two parts.* ID2 now specifies only protocol.* Specification of ID2 split data is moved to seqsplit ASN module.* For now they are still reside in one resulting library as before - libid2.* As the result split specific headers are now in objects/seqsplit.* 2. Moved ID2 and ID1 specific code out of object manager.* Protocol is processed by corresponding readers.* ID2 split parsing is processed by ncbi_xreader library - used by all readers.* 3. Updated OBJMGR_LIBS correspondingly.** Revision 1.17 2004/01/07 20:42:01 grichenk* Fixed matching of accession to accession.version** Revision 1.16 2003/11/26 17:56:00 vasilche* Implemented ID2 split in ID1 cache.* Fixed loading of splitted annotations.** Revision 1.15 2003/10/07 13:43:23 vasilche* Added proper handling of named Seq-annots.* Added feature search from named Seq-annots.* Added configurable adaptive annotation search (default: gene, cds, mrna).* Fixed selection of blobs for loading from GenBank.* Added debug checks to CSeq_id_Mapper for easier finding lost CSeq_id_Handles.* Fixed leaked split chunks annotation stubs.* Moved some classes definitions in separate *.cpp files.** Revision 1.14 2003/09/30 16:22:03 vasilche* Updated internal object manager classes to be able to load ID2 data.* SNP blobs are loaded as ID2 split blobs - readers convert them automatically.* Scope caches results of requests for data to data loaders.* Optimized CSeq_id_Handle for gis.* Optimized bioseq lookup in scope.* Reduced object allocations in annotation iterators.* CScope is allowed to be destroyed before other objects using this scope are* deleted (feature iterators, bioseq handles etc).* Optimized lookup for matching Seq-ids in CSeq_id_Mapper.* Added 'adaptive' option to objmgr_demo application.** Revision 1.13 2003/06/10 19:06:35 vasilche* Simplified CSeq_id_Mapper and CSeq_id_Handle.** Revision 1.11 2003/04/24 16:12:38 vasilche* Object manager internal structures are splitted more straightforward.* Removed excessive header dependencies.** Revision 1.10 2003/03/14 19:10:41 grichenk* + SAnnotSelector::EIdResolving; fixed operator=() for several classes** Revision 1.9 2002/12/26 20:55:18 dicuccio* Moved seq_id_mapper.hpp, tse_info.hpp, and bioseq_info.hpp -> include/ tree** Revision 1.8 2002/12/26 16:39:24 vasilche* Object manager class CSeqMap rewritten.** Revision 1.7 2002/07/08 20:51:02 grichenk* Moved log to the end of file* Replaced static mutex (in CScope, CDataSource) with the mutex* pool. Redesigned CDataSource data locking.** Revision 1.6 2002/05/29 21:21:13 gouriano* added debug dump** Revision 1.5 2002/05/06 03:28:47 vakatov* OM/OM1 renaming** Revision 1.4 2002/03/15 18:10:08 grichenk* Removed CRef<CSeq_id> from CSeq_id_Handle, added* key to seq-id map th CSeq_id_Mapper** Revision 1.3 2002/02/21 19:27:06 grichenk* Rearranged includes. Added scope history. Added searching for the* best seq-id match in data sources and scopes. Updated tests.** Revision 1.2 2002/02/12 19:41:42 grichenk* Seq-id handles lock/unlock moved to CSeq_id_Handle 'ctors.** Revision 1.1 2002/01/23 21:57:22 grichenk* Splitted id_handles.hpp*** ===========================================================================*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?