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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: obj_convert.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/12 18:12:36  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_CORE___OBJ_CONVERT__HPP
  10. #define GUI_CORE___OBJ_CONVERT__HPP
  11. /*  $Id: obj_convert.hpp,v 1000.1 2004/04/12 18:12:36 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:  Mike DiCuccio
  37.  *
  38.  * File Description:
  39.  *
  40.  */
  41. #include <corelib/ncbiobj.hpp>
  42. #include <objmgr/scope.hpp>
  43. #include <gui/core/idocument.hpp>
  44. BEGIN_NCBI_SCOPE
  45. //
  46. // base interface for a conversion object
  47. //
  48. class IObjConverter : public CObject
  49. {
  50. public:
  51.     typedef list< CConstRef<CObject> > TObjList;
  52.     // generic handler interface
  53.     // this, in general, feeds into the interfaces below
  54.     virtual void ToObject   (objects::CScope& scope, const CObject& obj,
  55.                              const string& type_name, TObjList& objs) const = 0;
  56.     // named conversion routines
  57.     virtual void ToSeqSubmit(objects::CScope& scope, const CObject& obj,
  58.                              TObjList& objs) const = 0;
  59.     virtual void ToSeqEntry (objects::CScope& scope, const CObject& obj,
  60.                              TObjList& objs) const = 0;
  61.     virtual void ToBioseqSet(objects::CScope& scope, const CObject& obj,
  62.                              TObjList& objs) const = 0;
  63.     virtual void ToBioseq   (objects::CScope& scope, const CObject& obj,
  64.                              TObjList& objs) const = 0;
  65.     virtual void ToSeqId    (objects::CScope& scope, const CObject& obj,
  66.                              TObjList& objs) const = 0;
  67.     virtual void ToSeqLoc   (objects::CScope& scope, const CObject& obj,
  68.                              TObjList& objs) const = 0;
  69.     virtual void ToSeqFeat  (objects::CScope& scope, const CObject& obj,
  70.                              TObjList& objs) const = 0;
  71.     virtual void ToSeqAlign (objects::CScope& scope, const CObject& obj,
  72.                              TObjList& objs) const = 0;
  73.     virtual void ToSeqAnnot (objects::CScope& scope, const CObject& obj,
  74.                              TObjList& objs) const = 0;
  75. };
  76. //
  77. // common subclass for object conversion
  78. // this class defines some basic conversions that are generically handled,
  79. // as well as provides the default switching function in ToObject()
  80. //
  81. class NCBI_GUICORE_EXPORT CObjConverter : public IObjConverter
  82. {
  83. public:
  84.     // generic object conversion switch function
  85.     void ToObject(objects::CScope& scope, const CObject& obj,
  86.                       const string& type_name, TObjList& objs) const;
  87.     // generic seq-entry -> seq-submit wrapper
  88.     void ToSeqSubmit(objects::CScope& scope, const CObject& obj,
  89.                      TObjList& objs) const;
  90.     // generic seq-id -> seq-entry function
  91.     void ToSeqEntry(objects::CScope& scope, const CObject& obj,
  92.                     TObjList& objs) const;
  93.     // generic seq-id -> bioseq function
  94.     void ToBioseq(objects::CScope& scope, const CObject& obj,
  95.                   TObjList& objs) const;
  96.     // generic seq-submit -> bioseq-set function
  97.     void ToBioseqSet(objects::CScope& scope, const CObject& obj,
  98.                      TObjList& objs) const;
  99.     // generic seq-id -> seq-loc wrapper
  100.     void ToSeqLoc(objects::CScope& scope, const CObject& obj,
  101.                   TObjList& objs) const;
  102.     // generic seq-loc -> seq-annot wrapper
  103.     void ToSeqAnnot(objects::CScope& scope, const CObject& obj,
  104.                     TObjList& objs) const;
  105.     // generic seq-loc -> seq-annot wrapper
  106.     void ToSeqFeat(objects::CScope& scope, const CObject& obj,
  107.                    TObjList& objs) const;
  108.     // generic seq-loc -> seq-annot wrapper
  109.     void ToSeqAlign(objects::CScope& scope, const CObject& obj,
  110.                     TObjList& objs) const;
  111. };
  112. //
  113. // single conversion interface
  114. //
  115. class NCBI_GUICORE_EXPORT CObjectConverter
  116. {
  117. public:
  118.     typedef IObjConverter::TObjList TObjList;
  119.     //
  120.     // single callable interface
  121.     //
  122.     static void Convert(objects::CScope& scope, const CObject& obj,
  123.                         const CTypeInfo* info, TObjList& objs);
  124.     static void Convert(objects::CScope& scope, const CObject& obj,
  125.                         const string& type_name, TObjList& objs);
  126.     // register a conversion function object
  127.     static void Register(const CTypeInfo* from_type, IObjConverter& cvt);
  128. };
  129. //
  130. // CConvertCache holds a cache of converted objects
  131. // This is useful in situation in which a given object may be requested
  132. // as a given type multiple times in a row.
  133. //
  134. class NCBI_GUICORE_EXPORT CConvertCache : public CObject
  135. {
  136. public:
  137.      // re-typedef from CObjectConvert
  138.      typedef CObjectConverter::TObjList TObjList;
  139.      // convert an object using a CTypeInfo object
  140.      virtual const TObjList& Convert(objects::CScope& scope, const CObject& obj,
  141.                                      const CTypeInfo* info);
  142.      // convert an object using a string-based type name
  143.      virtual const TObjList& Convert(objects::CScope& scope, const CObject& obj,
  144.                                      const string& type_name);
  145.     // SCacheKey holds the information relevant for a single converted
  146.     // object
  147.     struct SCacheKey
  148.     {
  149.         SCacheKey(objects::CScope& scope, const CObject& obj, 
  150.                   const string& type)
  151.         : m_Scope(&scope),
  152.           m_Obj(&obj),
  153.           m_Type(type)
  154.         {}
  155.         SCacheKey (const SCacheKey& key)
  156.         : m_Scope(key.m_Scope),
  157.           m_Obj(key.m_Obj),
  158.           m_Type(key.m_Type)
  159.         {}
  160.         CConstRef<objects::CScope>  m_Scope;
  161.         CConstRef<CObject> m_Obj;
  162.         string             m_Type;
  163.     };
  164.     // functor for sorting SCacheKey objects
  165.     struct SCacheKeySort
  166.     {
  167.         bool operator() (const SCacheKey& key1, const SCacheKey& key2) const;
  168.     };
  169. private:
  170.     // the cache itself
  171.     typedef map<SCacheKey, TObjList, SCacheKeySort> TCache;
  172.     TCache m_ObjCache;
  173.     // empty list of objects to be returned if no hits found
  174.     TObjList m_EmptyObjList;
  175. };
  176. END_NCBI_SCOPE
  177. /*
  178.  * ===========================================================================
  179.  * $Log: obj_convert.hpp,v $
  180.  * Revision 1000.1  2004/04/12 18:12:36  gouriano
  181.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.9
  182.  *
  183.  * Revision 1.9  2004/01/21 12:38:17  dicuccio
  184.  * redesigned CObjectCOnverter API to eliminate temporary object creation
  185.  *
  186.  * Revision 1.8  2004/01/20 18:09:07  dicuccio
  187.  * Export CObjectConverter
  188.  *
  189.  * Revision 1.7  2004/01/15 18:02:34  dicuccio
  190.  * API change for IObjConverter - pass-by-reference instead of return-by-value
  191.  *
  192.  * Revision 1.6  2003/10/10 18:07:07  friedman
  193.  * SCacheKey and SCacheKeySort needs to be public for solaris compile
  194.  *
  195.  * Revision 1.5  2003/10/10 17:11:48  dicuccio
  196.  * Code clean-up.  Added export specifiers, removed #ifdef'd code.  Privatized all
  197.  * internals of CConvertCache
  198.  *
  199.  * Revision 1.4  2003/10/10 16:00:45  friedman
  200.  * Added CConvertCache
  201.  *
  202.  * Revision 1.3  2003/09/30 15:19:22  dicuccio
  203.  * Added default conversions for seq-entry, bioseq
  204.  *
  205.  * Revision 1.2  2003/09/25 12:26:34  friedman
  206.  * Added:
  207.  *         ToSeqAlign
  208.  *
  209.  * Revision 1.1  2003/09/16 14:03:05  dicuccio
  210.  * Initial revision
  211.  *
  212.  * ===========================================================================
  213.  */
  214. #endif  // GUI_CORE___OBJ_CONVERT__HPP