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

📄 objstack.cpp

📁 ncbi源码
💻 CPP
字号:
/* * =========================================================================== * PRODUCTION $Log: objstack.cpp,v $ * PRODUCTION Revision 1000.2  2004/06/01 19:41:21  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.18 * PRODUCTION * =========================================================================== *//*  $Id: objstack.cpp,v 1000.2 2004/06/01 19:41:21 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: objstack.cpp,v $* Revision 1000.2  2004/06/01 19:41:21  gouriano* PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.18** Revision 1.18  2004/05/17 21:03:03  gorelenk* Added include of PCH ncbi_pch.hpp** Revision 1.17  2004/01/13 16:46:45  vasilche* Added const for a constant.** Revision 1.16  2004/01/05 14:25:22  gouriano* Added possibility to set serialization hooks by stack path** Revision 1.15  2003/10/27 19:18:03  grichenk* Reformatted object stream error messages** Revision 1.14  2003/07/02 18:07:29  gouriano* check for stack depth in GetStackTraceASN (not to abort when stack is empty)** Revision 1.13  2003/05/22 15:59:04  gouriano* corrected message in GetFrameInfo** Revision 1.12  2003/05/16 18:02:17  gouriano* revised exception error messages** Revision 1.11  2003/03/26 16:14:23  vasilche* Removed TAB symbols. Some formatting.** Revision 1.10  2003/03/10 18:54:26  gouriano* use new structured exceptions (based on CException)** Revision 1.9  2002/12/26 19:28:00  gouriano* removed Get/SetSkipTag and eFrameAttlist - not needed any more** Revision 1.8  2002/12/12 21:11:36  gouriano* added some debug tracing** Revision 1.7  2001/05/17 15:07:08  lavr* Typos corrected** Revision 1.6  2001/01/05 20:10:51  vasilche* CByteSource, CIStrBuffer, COStrBuffer, CLightString, CChecksum, CWeakMap* were moved to util.** Revision 1.5  2000/10/20 15:51:43  vasilche* Fixed data error processing.* Added interface for constructing container objects directly into output stream.* object.hpp, object.inl and object.cpp were split to* objectinfo.*, objecttype.*, objectiter.* and objectio.*.** Revision 1.4  2000/09/01 18:16:48  vasilche* Added files to MSVC project.* Fixed errors on MSVC.** Revision 1.3  2000/09/01 13:16:20  vasilche* Implemented class/container/choice iterators.* Implemented CObjectStreamCopier for copying data without loading into memory.** Revision 1.2  2000/08/15 19:44:51  vasilche* Added Read/Write hooks:* CReadObjectHook/CWriteObjectHook for objects of specified type.* CReadClassMemberHook/CWriteClassMemberHook for specified members.* CReadChoiceVariantHook/CWriteChoiceVariant for specified choice variants.* CReadContainerElementHook/CWriteContainerElementsHook for containers.** Revision 1.1  2000/05/24 20:08:49  vasilche* Implemented XML dump.** ===========================================================================*/#include <ncbi_pch.hpp>#include <corelib/ncbistd.hpp>#include <serial/objstack.hpp>BEGIN_NCBI_SCOPEstatic const size_t KInitialStackSize = 16;CObjectStack::CObjectStack(void){    TFrame* stack = m_Stack = m_StackPtr = new TFrame[KInitialStackSize];    m_StackEnd = stack + KInitialStackSize;    for ( size_t i = 0; i < KInitialStackSize; ++i ) {        m_Stack[i].Reset();    }    m_WatchPathHooks = m_PathValid = false;}CObjectStack::~CObjectStack(void){    delete[] m_Stack;}void CObjectStack::UnendedFrame(void){}void CObjectStack::ClearStack(void){    m_StackPtr = m_Stack;}string CObjectStack::GetStackTraceASN(void) const{    if (!GetStackDepth()) {        return "stack is empty";    }    _ASSERT(FetchFrameFromBottom(0).m_FrameType == TFrame::eFrameNamed);    _ASSERT(FetchFrameFromBottom(0).m_TypeInfo);    string stack = FetchFrameFromBottom(0).m_TypeInfo->GetName();    for ( size_t i = 1; i < GetStackDepth(); ++i ) {        const TFrame& frame = FetchFrameFromBottom(i);        switch ( frame.m_FrameType ) {        case TFrame::eFrameClassMember:        case TFrame::eFrameChoiceVariant:            {                if ( !frame.m_MemberId ) {                    _ASSERT(i == GetStackDepth() - 1);                }                else {                    const CMemberId& id = *frame.m_MemberId;                    stack += '.';                    if ( !id.GetName().empty() ) {                        stack += id.GetName();                    }                    else {                        stack += '[';                        stack += NStr::IntToString(id.GetTag());                        stack += ']';                    }                }            }            break;        case TFrame::eFrameArrayElement:            stack += ".E";            break;        default:            break;        }    }    return stack;}CObjectStack::TFrame& CObjectStack::PushFrameLong(void){    size_t depth = m_StackPtr - m_Stack;    size_t oldSize = m_StackEnd - m_Stack;    size_t newSize = oldSize * 2;    TFrame* newStack = new TFrame[newSize];    {        // copy old stack        for ( size_t i = 0; i < oldSize; ++i )            newStack[i] = m_Stack[i];    }    {        // clear new area of new stack        for ( size_t i = oldSize; i < newSize; ++i )            newStack[i].Reset();    }    delete[] m_Stack;    m_Stack = newStack;    m_StackEnd = newStack + newSize;    return *(m_StackPtr = (newStack + depth + 1));}void CObjectStack::x_PushStackPath(void){    if (!m_WatchPathHooks) {        m_PathValid = false;        return;    }    if (!m_PathValid) {        for ( size_t i = 1; i < GetStackDepth(); ++i ) {            const TFrame& frame = FetchFrameFromTop(i);            if (frame.HasTypeInfo()) {                // there is no "root" symbol                m_MemberPath = frame.GetTypeInfo()->GetName();                break;            }        }    }    const CMemberId& mem_id = TopFrame().GetMemberId();    if (mem_id.HasNotag() || mem_id.IsAttlist()) {        return;    }    // member separator symbol is '.'    m_MemberPath += '.';    const string& member = mem_id.GetName();    if (!member.empty()) {        m_MemberPath += member;    } else {        m_MemberPath += NStr::IntToString(mem_id.GetTag());    }    m_PathValid = true;    x_SetPathHooks(true);}void CObjectStack::x_PopStackPath(void){    if (!m_WatchPathHooks) {        m_PathValid = false;        return;    }    if (GetStackDepth() == 1) {        x_SetPathHooks(false);        m_PathValid = false;    } else {        const TFrame& top = TopFrame();        if (top.HasMemberId()) {            const CMemberId& mem_id = top.GetMemberId();            if (mem_id.HasNotag() || mem_id.IsAttlist()) {                return;            }            x_SetPathHooks(false);            // member separator symbol is '.'            m_MemberPath.erase(m_MemberPath.find_last_of('.'));        }    }}const string& CObjectStack::GetStackPath(void){    if (!m_PathValid && GetStackDepth()) {        _ASSERT(FetchFrameFromBottom(0).m_FrameType == TFrame::eFrameNamed);        _ASSERT(FetchFrameFromBottom(0).m_TypeInfo);        // there is no "root" symbol        m_MemberPath = FetchFrameFromBottom(0).GetTypeInfo()->GetName();        for ( size_t i = 1; i < GetStackDepth(); ++i ) {            const TFrame& frame = FetchFrameFromBottom(i);            if (frame.HasMemberId()) {                const CMemberId& mem_id = frame.GetMemberId();                if (mem_id.HasNotag() || mem_id.IsAttlist()) {                    continue;                }                // member separator symbol is '.'                m_MemberPath += '.';                const string& member = mem_id.GetName();                if (!member.empty()) {                    m_MemberPath += member;                } else {                    m_MemberPath += NStr::IntToString(mem_id.GetTag());                }            }        }        m_PathValid = true;    }    return m_MemberPath;}void CObjectStack::PopErrorFrame(void){    try {        UnendedFrame();    }    catch (...) {        PopFrame();        throw;    }    PopFrame();}const char* CObjectStackFrame::GetFrameTypeName(void) const{    const char* s;    switch (GetFrameType())    {    default:                  s = "UNKNOWN";             break;    case eFrameOther:         s = "eFrameOther";         break;    case eFrameNamed:         s = "eFrameNamed";         break;    case eFrameArray:         s = "eFrameArray";         break;    case eFrameArrayElement:  s = "eFrameArrayElement";  break;    case eFrameClass:         s = "eFrameClass";         break;    case eFrameClassMember:   s = "eFrameClassMember";   break;    case eFrameChoice:        s = "eFrameChoice";        break;    case eFrameChoiceVariant: s = "eFrameChoiceVariant"; break;    }    return s;}#if defined(NCBI_SERIAL_IO_TRACE)void CObjectStack::TracePushFrame(bool push) const{    cout << endl ;    int depth = (int)GetStackDepth();    cout << depth;    for (; depth>0; --depth) {        cout.put(' ');    }    cout << (push ? "Enter " : "Leave ") << m_StackPtr->GetFrameTypeName();}#endifstring CObjectStackFrame::GetFrameInfo(void) const{    string info(" Frame type= ");    info += GetFrameTypeName();    if (m_TypeInfo) {        info += ", Object type= " + m_TypeInfo->GetName();    }    if (m_MemberId) {        info += ", Member name= " + m_MemberId->GetName();    }    return info;}string CObjectStackFrame::GetFrameName(void) const{    string info;    switch ( GetFrameType() ) {    case eFrameClassMember:    case eFrameChoiceVariant:        {            if ( m_MemberId ) {                const CMemberId& id = *m_MemberId;                info = '.';                if ( !id.GetName().empty() ) {                    info += id.GetName();                }                else {                    info += '[';                    info += NStr::IntToString(id.GetTag());                    info += ']';                }            }        }        break;    case eFrameArrayElement:        info = "[]";        break;    case eFrameArray:        info = "[]";        break;    case eFrameNamed:        info = GetTypeInfo()->GetName();        break;    default:        {            break;        }    }    return info;}END_NCBI_SCOPE

⌨️ 快捷键说明

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