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

📄 test_serial.cpp

📁 ncbi源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* * =========================================================================== * PRODUCTION $Log: test_serial.cpp,v $ * PRODUCTION Revision 1000.2  2004/06/01 19:44:51  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.64 * PRODUCTION * =========================================================================== *//*  $Id: test_serial.cpp,v 1000.2 2004/06/01 19:44:51 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: *   ....... * */#include <ncbi_pch.hpp>#include "test_serial.hpp"#include "serialobject.hpp"#include <serial/serial.hpp>#include <serial/serialasn.hpp>#include <serial/objistr.hpp>#include <serial/objostr.hpp>#include <serial/object.hpp>#include <serial/iterator.hpp>#include <serial/objhook.hpp>#include "cppwebenv.hpp"#include <serial/stdtypes.hpp>#include <serial/classinfo.hpp>#include <serial/choice.hpp>#include <serial/ptrinfo.hpp>#include <serial/continfo.hpp>#if HAVE_NCBI_C# include <asn.h># include "twebenv.h"#else# include "webenv/Web_Env.hpp"#endif#include <test/test_assert.h>  /* This header must go last */int main(int argc, char** argv){    CTestSerial().AppMain(argc, argv);	return 0;}void PrintAsn(CNcbiOstream& out, const CConstObjectInfo& object);class CWriteSerialObjectHook : public CWriteObjectHook{public:    CWriteSerialObjectHook(CTestSerialObject* hooked)        : m_HookedObject(hooked) {}    void WriteObject(CObjectOStream& out,                     const CConstObjectInfo& object);private:    CTestSerialObject* m_HookedObject;};void CWriteSerialObjectHook::WriteObject(CObjectOStream& out,                                         const CConstObjectInfo& object){    const CTestSerialObject& obj = *reinterpret_cast<const CTestSerialObject*>        (object.GetObjectPtr());        if (&obj != m_HookedObject) {        // This is not the object we would like to process.        // Use default write method.        LOG_POST("CWriteSerialObjectHook::WriteObject()"            " -- using default writer");        DefaultWrite(out, object);        return;    }    // Special object processing    // Write object open tag    out.BeginClass(object.GetClassTypeInfo());    // Iterate object members    for (CConstObjectInfo::CMemberIterator member =        object.BeginMembers(); member; ++member) {        if (member.GetAlias() == "m_Name") {            // This member will be written using CharBlock instead of the            // default method.            LOG_POST("CWriteSerialObjectHook::WriteObject()"                " -- using CharBlock to write " << member.GetAlias());            // Write the special member            out.BeginClassMember(member.GetMemberInfo()->GetId());            // Start char block, specify output stream and block size            CObjectOStream::CharBlock cb(out, obj.m_Name.size());                cb.Write(obj.m_Name.c_str(), obj.m_Name.size());               // End char block and member            cb.End();            out.EndClassMember();        }        else {            // Do not need special processing for this member -- use            // default write method. Do not write unset members (although            // it is possible).            if ( member.IsSet() ) {                LOG_POST("CWriteSerialObjectHook::WriteObject()"                    " -- using default member writer for " <<                    member.GetAlias());                out.WriteClassMember(member);            }        }    }    // Close the object    out.EndClass();}class CReadSerialObjectHook : public CReadObjectHook{public:    CReadSerialObjectHook(CTestSerialObject* hooked)        : m_HookedObject(hooked) {}    void ReadObject(CObjectIStream& in,                    const CObjectInfo& object);private:    CTestSerialObject* m_HookedObject;};void CReadSerialObjectHook::ReadObject(CObjectIStream& in,                                       const CObjectInfo& object){    const CTestSerialObject& obj = *reinterpret_cast<const CTestSerialObject*>        (object.GetObjectPtr());        if (&obj != m_HookedObject) {        // Use default read method.        LOG_POST("CReadSerialObjectHook::ReadObject()"            " -- using default reader");        DefaultRead(in, object);        return;    }    LOG_POST("CReadSerialObjectHook::ReadObject()"        " -- using overloaded reader");    // Read the object manually, member by member.    for ( CIStreamClassMemberIterator i(in, object); i; ++i ) {        const CObjectTypeInfo::CMemberIterator& nextMember = *i;        LOG_POST("CReadSerialObjectHook::ReadObject()"            " -- using default member reader for " <<            nextMember.GetAlias());        // Special pre-read processing may be put here        in.ReadClassMember(CObjectInfoMI(object, nextMember.GetMemberIndex()));        // Special post-read processing may be put here    }}class CWriteSerialObject_NameHook : public CWriteClassMemberHook{public:    virtual void WriteClassMember(CObjectOStream& out,                                  const CConstObjectInfoMI& member);};void CWriteSerialObject_NameHook::WriteClassMember    (CObjectOStream& out, const CConstObjectInfoMI& member){    // No special processing -- just report writing the member    const string& name = *static_cast<const string*>        (member.GetMember().GetObjectPtr());    LOG_POST("CWriteSerialObject_NameHook::WriteClassMember()"        " -- writing m_Name: " << name);    DefaultWrite(out, member);}class CReadSerialObject_NameHook : public CReadClassMemberHook{public:    virtual void ReadClassMember(CObjectIStream& in,                                 const CObjectInfoMI& member);};void CReadSerialObject_NameHook::ReadClassMember    (CObjectIStream& in, const CObjectInfoMI& member){    // No special processing -- just report reading the member    DefaultRead(in, member);    const string& name = *reinterpret_cast<const string*>        (member.GetMember().GetObjectPtr());    LOG_POST("CReadSerialObject_NameHook::ReadClassMember()"        " -- reading m_Name: " << name);}void TestHooks(CTestSerialObject& obj){    // Test object hooks    char* buf = 0;    {{        CNcbiOstrstream ostrs;        auto_ptr<CObjectOStream> os(CObjectOStream::Open            (eSerial_AsnText, ostrs));        CObjectHookGuard<CTestSerialObject> w_hook            (*(new CWriteSerialObjectHook(&obj)), &(*os));        *os << obj;		  os->FlushBuffer();		  ostrs << '\0';		  buf = ostrs.str();    }}    {{        CNcbiIstrstream istrs(buf);        auto_ptr<CObjectIStream> is(CObjectIStream::Open            (eSerial_AsnText, istrs));        CTestSerialObject obj_copy;        CObjectHookGuard<CTestSerialObject> r_hook            (*(new CReadSerialObjectHook(&obj_copy)), &(*is));        *is >> obj_copy;#if HAVE_NCBI_C        // Can not use SerialEquals<> with C-objects#else        _ASSERT(SerialEquals<CTestSerialObject>(obj, obj_copy));#endif    }}    delete[] buf;    // Test member hooks    char* buf2 = 0;    {{        CNcbiOstrstream ostrs;        auto_ptr<CObjectOStream> os(CObjectOStream::Open            (eSerial_AsnText, ostrs));        CObjectHookGuard<CTestSerialObject> w_hook            ("m_Name", *(new CWriteSerialObject_NameHook), &(*os));        *os << obj;		  os->FlushBuffer();		  ostrs << '\0';        buf2 = ostrs.str();    }}    {{        CNcbiIstrstream istrs(buf2);        auto_ptr<CObjectIStream> is(CObjectIStream::Open            (eSerial_AsnText, istrs));        CTestSerialObject obj_copy;        CObjectHookGuard<CTestSerialObject> r_hook            ("m_Name", *(new CReadSerialObject_NameHook), &(*is));        *is >> obj_copy;#if HAVE_NCBI_C        // Can not use SerialEquals<> with C-objects#else        _ASSERT(SerialEquals<CTestSerialObject>(obj, obj_copy));#endif    }}    delete[] buf2;}int CTestSerial::Run(void){    CNcbiOfstream diag("test_serial.log");    SetDiagStream(&diag);    try {#if HAVE_NCBI_C        WebEnv* env = 0;        {            {                auto_ptr<CObjectIStream> in(CObjectIStream::Open("webenv.ent",                                                                 eSerial_AsnText));                in->Read(&env, GetSequenceTypeRef(&env).Get());            }            {                auto_ptr<CObjectOStream> out(CObjectOStream::Open("webenv.bino",                                                                  eSerial_AsnBinary));                out->Write(&env, GetSequenceTypeRef(&env).Get());            }            {                // C-style Object must be clean before loading: using new WebEnv instance                WebEnv* env2 = 0;                auto_ptr<CObjectIStream> in(CObjectIStream::Open("webenv.bin",                                                                 eSerial_AsnBinary));                in->Read(&env2, GetSequenceTypeRef(&env2).Get());                auto_ptr<CObjectOStream> out(CObjectOStream::Open("webenv.ento",                                                                  eSerial_AsnText));                out->Write(&env2, GetSequenceTypeRef(&env2).Get());            }            {                CNcbiOfstream out("webenv.ento2");                PrintAsn(out,                         CConstObjectInfo(&env,                                          GetSequenceTypeRef(&env).Get()));            }        }#else        CRef<CWeb_Env> env(new CWeb_Env);        {            {                auto_ptr<CObjectIStream> in(CObjectIStream::Open("webenv.ent",                                                                 eSerial_AsnText));                *in >> *env;            }            {                auto_ptr<CObjectOStream> out(CObjectOStream::Open("webenv.bino",                                                                  eSerial_AsnBinary));                *out << *env;            }            {                CRef<CWeb_Env> env2(new CWeb_Env);                auto_ptr<CObjectIStream> in(CObjectIStream::Open("webenv.bin",                                                                 eSerial_AsnBinary));                *in >> *env2;                auto_ptr<CObjectOStream> out(CObjectOStream::Open("webenv.ento",                                                                  eSerial_AsnText));                out->SetAutoSeparator(false);                *out << *env2;            }        }        {            CNcbiOfstream out("test_serial.asno2");            PrintAsn(out, ConstObjectInfo(*env));        }#endif        CTestSerialObject write;        CTestSerialObject2 write1;        _TRACE("CTestSerialObject(object1): " << long(&write));        _TRACE("CTestSerialObject2(object2): " << long(&write1));        _TRACE("CTestSerialObject(object2): " <<               long(static_cast<CTestSerialObject*>(&write1)));        write.m_Name = "name";        write.m_HaveName = false;        //        write.m_NamePtr = &write1.m_Name;        write.m_Size = -1;        write.m_Attributes.push_back("m_Attributes");        write.m_Attributes.push_back("m_Size");        write.m_Attributes.push_back("m_");        write.m_Next = &write1;        const char* s = "data";        write.m_Data.insert(write.m_Data.begin(), s, s + 4);        write.m_Offsets.push_back(25);        write.m_Offsets.push_back(-1024);        write.m_Names[0] = "zero";        write.m_Names[1] = "one";        write.m_Names[2] = "two";        write.m_Names[3] = "three";        write.m_Names[10] = "ten";        write.m_WebEnv = env;        write1.m_Name = "write1";        write1.m_HaveName = true;        write1.m_NamePtr = new string("test");        write1.m_Size = 0x7fff;        write1.m_Attributes.push_back("write1");        //        write1.m_Next = &write1;        write1.m_WebEnv = 0;        write1.m_Name2 = "name2";        TestHooks(write);        const CTestSerialObject& cwrite = write;        CTypeIterator<CTestSerialObject> j1; j1 = Begin(write);        CTypeIterator<CTestSerialObject> j2(Begin(write));        CTypeIterator<CTestSerialObject> j3 = Begin(write);        //j1.Erase();        CTypeConstIterator<CTestSerialObject> k1; k1 = Begin(write);        CTypeConstIterator<CTestSerialObject> k2(Begin(write));        CTypeConstIterator<CTestSerialObject> k3 = ConstBegin(write);        //k1.Erase();        CTypeConstIterator<CTestSerialObject> l1; l1 = ConstBegin(write);        CTypeConstIterator<CTestSerialObject> l2(ConstBegin(write));        CTypeConstIterator<CTestSerialObject> l3 = ConstBegin(write);        CTypeConstIterator<CTestSerialObject> m1; m1 = ConstBegin(cwrite);        CTypeConstIterator<CTestSerialObject> m2(ConstBegin(cwrite));

⌨️ 快捷键说明

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