⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 typeref.cpp

📁 ncbi源码
💻 CPP
字号:
/* * =========================================================================== * PRODUCTION $Log: typeref.cpp,v $ * PRODUCTION Revision 1000.1  2004/06/01 19:42:05  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13 * PRODUCTION * =========================================================================== *//*  $Id: typeref.cpp,v 1000.1 2004/06/01 19:42:05 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:*   !!! PUT YOUR DESCRIPTION HERE !!!** ---------------------------------------------------------------------------* $Log: typeref.cpp,v $* Revision 1000.1  2004/06/01 19:42:05  gouriano* PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13** Revision 1.13  2004/05/17 21:03:04  gorelenk* Added include of PCH ncbi_pch.hpp** Revision 1.12  2003/03/10 18:54:26  gouriano* use new structured exceptions (based on CException)** Revision 1.11  2003/02/12 16:43:39  vasilche* Use CTypeRef instead of TTypeInfo.** Revision 1.10  2003/02/12 15:06:29  vasilche* Added missing CTypeRef constructors for map/multimap.** Revision 1.9  2002/09/19 20:05:44  vasilche* Safe initialization of static mutexes** Revision 1.8  2002/08/30 16:20:56  vasilche* Avoid MT lock in CTypeRef::Get()** Revision 1.7  2002/08/14 17:14:57  grichenk* Another improvement to MT-safety** Revision 1.6  2002/08/13 13:56:06  grichenk* Improved MT-safety in CTypeInfo and CTypeRef** Revision 1.5  2000/09/26 17:38:23  vasilche* Fixed incomplete choiceptr implementation.* Removed temporary comments.** Revision 1.4  1999/12/17 19:05:05  vasilche* Simplified generation of GetTypeInfo methods.** Revision 1.3  1999/09/14 18:54:22  vasilche* Fixed bugs detected by gcc & egcs.* Removed unneeded includes.** Revision 1.2  1999/08/13 15:53:52  vasilche* C++ analog of asntool: datatool** Revision 1.1  1999/06/04 20:51:52  vasilche* First compilable version of serialization.** ===========================================================================*/#include <ncbi_pch.hpp>#include <serial/typeref.hpp>#include <serial/typeinfo.hpp>#include <serial/exception.hpp>#include <corelib/ncbithr.hpp>BEGIN_NCBI_SCOPEDEFINE_STATIC_MUTEX(s_TypeRefMutex);CTypeRef::CTypeRef(TGet1Proc getter, const CTypeRef& arg)    : m_Getter(sx_GetResolve), m_ReturnData(0){    m_ResolveData = new CGet1TypeInfoSource(getter, arg);}CTypeRef::CTypeRef(TGet2Proc getter,                   const CTypeRef& arg1, const CTypeRef& arg2)    : m_Getter(sx_GetResolve), m_ReturnData(0){    m_ResolveData = new CGet2TypeInfoSource(getter, arg1, arg2);}CTypeRef::CTypeRef(TGet2Proc getter,                  const CTypeRef& arg1,                  TGet1Proc getter2, const CTypeRef& arg2)    : m_Getter(sx_GetResolve), m_ReturnData(0){    m_ResolveData = new CGet2TypeInfoSource(getter,                                            arg1,                                            CTypeRef(getter2, arg2));}CTypeRef::CTypeRef(TGet2Proc getter,                   TGet1Proc getter1, const CTypeRef& arg1,                   const CTypeRef& arg2)    : m_Getter(sx_GetResolve), m_ReturnData(0){    m_ResolveData = new CGet2TypeInfoSource(getter,                                            CTypeRef(getter1, arg1),                                            arg2);}CTypeRef::CTypeRef(TGet2Proc getter,                   TGet1Proc getter1, const CTypeRef& arg1,                   TGet1Proc getter2, const CTypeRef& arg2)    : m_Getter(sx_GetResolve), m_ReturnData(0){    m_ResolveData = new CGet2TypeInfoSource(getter,                                            CTypeRef(getter1, arg1),                                            CTypeRef(getter2, arg2));}CTypeRef& CTypeRef::operator=(const CTypeRef& typeRef){    if ( this != &typeRef ) {        Unref();        Assign(typeRef);    }    return *this;}void CTypeRef::Unref(void){    if ( m_Getter == sx_GetResolve ) {        CMutexGuard guard(s_TypeRefMutex);        if ( m_Getter == sx_GetResolve ) {            m_Getter = sx_GetAbort;            if ( m_ResolveData->m_RefCount.Add(-1) <= 0 ) {                delete m_ResolveData;                m_ResolveData = 0;            }        }    }    m_Getter = sx_GetAbort;    m_ReturnData = 0;}void CTypeRef::Assign(const CTypeRef& typeRef){    if ( typeRef.m_ReturnData ) {        m_ReturnData = typeRef.m_ReturnData;        m_Getter = sx_GetReturn;    }    else {        CMutexGuard guard(s_TypeRefMutex);        m_ReturnData = typeRef.m_ReturnData;        m_Getter = typeRef.m_Getter;        if ( m_Getter == sx_GetProc ) {            m_GetProcData = typeRef.m_GetProcData;        }        else if ( m_Getter == sx_GetResolve ) {            (m_ResolveData = typeRef.m_ResolveData)->m_RefCount.Add(1);        }    }}TTypeInfo CTypeRef::sx_GetAbort(const CTypeRef& typeRef){    CMutexGuard guard(s_TypeRefMutex);    if (typeRef.m_Getter != sx_GetAbort)        return typeRef.m_Getter(typeRef);    NCBI_THROW(CSerialException,eFail, "uninitialized type ref");}TTypeInfo CTypeRef::sx_GetReturn(const CTypeRef& typeRef){    return typeRef.m_ReturnData;}TTypeInfo CTypeRef::sx_GetProc(const CTypeRef& typeRef){    CMutexGuard guard(s_TypeRefMutex);    if (typeRef.m_Getter != sx_GetProc)        return typeRef.m_Getter(typeRef);    TTypeInfo typeInfo = typeRef.m_GetProcData();    if ( !typeInfo )        NCBI_THROW(CSerialException,eFail, "cannot resolve type ref");    const_cast<CTypeRef&>(typeRef).m_ReturnData = typeInfo;    const_cast<CTypeRef&>(typeRef).m_Getter = sx_GetReturn;    return typeInfo;}TTypeInfo CTypeRef::sx_GetResolve(const CTypeRef& typeRef){    CMutexGuard guard(s_TypeRefMutex);    if (typeRef.m_Getter != sx_GetResolve)        return typeRef.m_Getter(typeRef);    TTypeInfo typeInfo = typeRef.m_ResolveData->GetTypeInfo();    if ( !typeInfo )        NCBI_THROW(CSerialException,eFail, "cannot resolve type ref");    if ( typeRef.m_ResolveData->m_RefCount.Add(-1) <= 0 ) {        delete typeRef.m_ResolveData;        const_cast<CTypeRef&>(typeRef).m_ResolveData = 0;    }    const_cast<CTypeRef&>(typeRef).m_ReturnData = typeInfo;    const_cast<CTypeRef&>(typeRef).m_Getter = sx_GetReturn;    return typeInfo;}CTypeInfoSource::CTypeInfoSource(void){    m_RefCount.Set(1);}CTypeInfoSource::~CTypeInfoSource(void){    _ASSERT(m_RefCount.Get() == 0);}CGet1TypeInfoSource::CGet1TypeInfoSource(CTypeRef::TGet1Proc getter,                                         const CTypeRef& arg)    : m_Getter(getter), m_Argument(arg){}CGet1TypeInfoSource::~CGet1TypeInfoSource(void){}TTypeInfo CGet1TypeInfoSource::GetTypeInfo(void){    return m_Getter(m_Argument.Get());}CGet2TypeInfoSource::CGet2TypeInfoSource(CTypeRef::TGet2Proc getter,                                         const CTypeRef& arg1,                                         const CTypeRef& arg2)    : m_Getter(getter), m_Argument1(arg1), m_Argument2(arg2){}CGet2TypeInfoSource::~CGet2TypeInfoSource(void){}TTypeInfo CGet2TypeInfoSource::GetTypeInfo(void){    return m_Getter(m_Argument1.Get(), m_Argument2.Get());}END_NCBI_SCOPE

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -