asn_converter.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:5k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: asn_converter.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2003/11/17 22:11:17  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [ORIGINAL] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CTOOLS___ASN_CONVERTER__HPP
  10. #define CTOOLS___ASN_CONVERTER__HPP
  11. /*  $Id: asn_converter.hpp,v 1000.1 2003/11/17 22:11:17 gouriano Exp $
  12. * ===========================================================================
  13. *
  14. *                            PUBLIC DOMAIN NOTICE
  15. *               National Center for Biotechnology Information
  16. *
  17. *  This software/database is a "United States Government Work" under the
  18. *  terms of the United States Copyright Act.  It was written as part of
  19. *  the author's official duties as a United States Government employee and
  20. *  thus cannot be copyrighted.  This software/database is freely available
  21. *  to the public for use. The National Library of Medicine and the U.S.
  22. *  Government have not placed any restriction on its use or reproduction.
  23. *
  24. *  Although all reasonable efforts have been taken to ensure the accuracy
  25. *  and reliability of the software and data, the NLM and the U.S.
  26. *  Government do not and cannot warrant the performance or results that
  27. *  may be obtained by using this software or data. The NLM and the U.S.
  28. *  Government disclaim all warranties, express or implied, including
  29. *  warranties of performance, merchantability or fitness for any particular
  30. *  purpose.
  31. *
  32. *  Please cite the author in any work or product based on this material.
  33. *
  34. * ===========================================================================
  35. *
  36. * Authors:  Denis Vakatov, Aaron Ucko
  37. *
  38. * File Description:
  39. *   Templates for converting ASN.1-based objects between NCBI's C and C++
  40. *   in-memory layouts.
  41. *
  42. */
  43. #include <connect/ncbi_conn_stream.hpp>
  44. #include <ctools/asn_connection.h>
  45. #include <serial/objistrasnb.hpp>
  46. #include <serial/objostrasnb.hpp>
  47. #include <serial/serial.hpp>
  48. /** @addtogroup CToolsASNConv
  49.  *
  50.  * @{
  51.  */
  52. BEGIN_NCBI_SCOPE
  53. #define DECLARE_ASN_CONVERTER(TCpp, TC, name) 
  54. CAsnConverter<TCpp, TC> name((AsnWriteFunc)TC##AsnWrite, (AsnReadFunc)TC##AsnRead)
  55. template <typename TCpp, typename TC>
  56. class CAsnConverter
  57. {
  58. public:
  59.     typedef AsnWriteFunc FWrite;
  60.     typedef AsnReadFunc  FRead;
  61.     CAsnConverter(FWrite writer, FRead reader)
  62.         : m_Write(writer), m_Read(reader) { }
  63.     // Creates and returns a new object if cpp_obj is null.
  64.     TCpp* FromC(const TC* c_obj, TCpp* cpp_obj = 0);
  65.     // Always returns a new object, as that's how C readers work.
  66.     TC*   ToC  (const TCpp& cpp_obj);
  67. private:
  68.     FWrite m_Write;
  69.     FRead  m_Read;
  70. };
  71. /* @} */
  72. ///////////////////////////////////////////////////////////////////////////
  73. // inline functions
  74. template <typename TCpp, typename TC>
  75. inline TCpp* CAsnConverter<TCpp, TC>::FromC(const TC* c_obj, TCpp* cpp_obj)
  76. {
  77.     if ( !c_obj ) {
  78.         return 0;
  79.     }
  80.     CONNECTOR      connector = MEMORY_CreateConnector(0);
  81.     CConn_IOStream conn_stream(connector);
  82.     AsnIoPtr aip = CreateAsnConn(conn_stream.GetCONN(), eAsnConn_Output,
  83.                                  eAsnConn_Binary);
  84.     m_Write(const_cast<TC*>(c_obj), aip, 0);
  85.     AsnIoFlush(aip);
  86.     CRef<TCpp> cpp_ref(cpp_obj ? cpp_obj : new TCpp);
  87.     CObjectIStreamAsnBinary ois(conn_stream);
  88.     ois >> *cpp_ref;
  89.     return cpp_ref.Release();
  90. }
  91. template <typename TCpp, typename TC>
  92. inline TC* CAsnConverter<TCpp, TC>::ToC(const TCpp& cpp_obj)
  93. {
  94.     CONNECTOR      connector = MEMORY_CreateConnector(0);
  95.     CConn_IOStream conn_stream(connector);
  96.     CObjectOStreamAsnBinary oos(conn_stream);
  97.     oos << cpp_obj;
  98.     oos.Flush();
  99.     AsnIoPtr aip = CreateAsnConn(conn_stream.GetCONN(), eAsnConn_Input,
  100.                                  eAsnConn_Binary);
  101.     return (TC*)m_Read(aip, 0);
  102. }
  103. END_NCBI_SCOPE
  104. /*
  105.  * ===========================================================================
  106.  *
  107.  * $Log: asn_converter.hpp,v $
  108.  * Revision 1000.1  2003/11/17 22:11:17  gouriano
  109.  * PRODUCTION: UPGRADED [ORIGINAL] Dev-tree R1.5
  110.  *
  111.  * Revision 1.5  2003/11/13 16:00:05  lavr
  112.  * Guard macro changed; log moved to end
  113.  *
  114.  * Revision 1.4  2003/06/12 15:58:06  lavr
  115.  * +#include <serial/serial.hpp>
  116.  *
  117.  * Revision 1.3  2003/05/28 14:53:51  lavr
  118.  * Reduce the number of included headers
  119.  *
  120.  * Revision 1.2  2003/04/11 17:46:30  siyan
  121.  * Added doxygen support
  122.  * 
  123.  * Revision 1.1  2002/08/08 18:18:01  ucko
  124.  * Add central template class for converting ASN.1-based objects between
  125.  * C and C++ representations.
  126.  *
  127.  *
  128.  * ===========================================================================
  129.  */
  130. #endif /* CTOOLS___ASN_CONVERTER__HPP */