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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: objecttype.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 17:25:44  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJECTTYPE__HPP
  10. #define OBJECTTYPE__HPP
  11. /*  $Id: objecttype.hpp,v 1000.0 2003/10/29 17:25:44 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. * Author: Eugene Vasilchenko
  37. *
  38. * File Description:
  39. *   !!! PUT YOUR DESCRIPTION HERE !!!
  40. */
  41. #include <corelib/ncbistd.hpp>
  42. #include <serial/objectinfo.hpp>
  43. /** @addtogroup UserCodeSupport
  44.  *
  45.  * @{
  46.  */
  47. BEGIN_NCBI_SCOPE
  48. // forward declaration of object tree iterator templates
  49. template<class C> class CTypesIteratorBase;
  50. template<class LevelIterator> class CTreeIteratorTmpl;
  51. class CConstTreeLevelIterator;
  52. class CTreeIterator;
  53. // helper template for working with CTypesIterator and CTypesConstIterator
  54. class NCBI_XSERIAL_EXPORT CType_Base
  55. {
  56. protected:
  57.     typedef CTypesIteratorBase<CTreeIterator> CTypesIterator;
  58.     typedef CTreeIteratorTmpl<CConstTreeLevelIterator> CTreeConstIterator;
  59.     typedef CTypesIteratorBase<CTreeConstIterator> CTypesConstIterator;
  60.     static bool Match(const CObjectTypeInfo& type, TTypeInfo typeInfo)
  61.         {
  62.             return type.GetTypeInfo()->IsType(typeInfo);
  63.         }
  64.     static bool Match(const CTypesIterator& it, TTypeInfo typeInfo);
  65.     static bool Match(const CTypesConstIterator& it, TTypeInfo typeInfo);
  66.     static void AddTo(CTypesIterator& it, TTypeInfo typeInfo);
  67.     static void AddTo(CTypesConstIterator& it,  TTypeInfo typeInfo);
  68.     static TObjectPtr GetObjectPtr(const CTypesIterator& it);
  69.     static TConstObjectPtr GetObjectPtr(const CTypesConstIterator& it);
  70. };
  71. template<class C>
  72. class CType : public CType_Base
  73. {
  74.     typedef CType_Base CParent;
  75. public:
  76.     typedef typename CParent::CTypesIterator CTypesIterator;
  77.     typedef typename CParent::CTypesConstIterator CTypesConstIterator;
  78.     static TTypeInfo GetTypeInfo(void)
  79.         {
  80.             return C::GetTypeInfo();
  81.         }
  82.     operator CObjectTypeInfo(void) const
  83.         {
  84.             return GetTypeInfo();
  85.         }
  86.     static void AddTo(CTypesIterator& it)
  87.         {
  88.             CParent::AddTo(it, GetTypeInfo());
  89.         }
  90.     static void AddTo(CTypesConstIterator& it)
  91.         {
  92.             CParent::AddTo(it, GetTypeInfo());
  93.         }
  94.     static bool Match(const CObjectTypeInfo& type)
  95.         {
  96.             return CParent::Match(type, GetTypeInfo());
  97.         }
  98.     static bool Match(const CTypesIterator& it)
  99.         {
  100.             return CParent::Match(it, GetTypeInfo());
  101.         }
  102.     static bool Match(const CTypesConstIterator& it)
  103.         {
  104.             return CParent::Match(it, GetTypeInfo());
  105.         }
  106.     static C* Get(const CTypesIterator& it)
  107.         {
  108.             if ( !Match(it) )
  109.                 return 0;
  110.             return &CTypeConverter<C>::Get(GetObjectPtr(it));
  111.         }
  112.     static const C* Get(const CTypesConstIterator& it)
  113.         {
  114.             if ( !Match(it) )
  115.                 return 0;
  116.             return &CTypeConverter<C>::Get(GetObjectPtr(it));
  117.         }
  118.     static C* GetUnchecked(const CObjectInfo& object)
  119.         {
  120.             return &CTypeConverter<C>::Get(object.GetObjectPtr());
  121.         }
  122.     static const C* GetUnchecked(const CConstObjectInfo& object)
  123.         {
  124.             return &CTypeConverter<C>::Get(object.GetObjectPtr());
  125.         }
  126.     static C* Get(const CObjectInfo& object)
  127.         {
  128.             if ( !Match(object) )
  129.                 return 0;
  130.             return GetUnchecked(object);
  131.         }
  132.     static const C* Get(const CConstObjectInfo& object)
  133.         {
  134.             if ( !Match(object) )
  135.                 return 0;
  136.             return GetUnchecked(object);
  137.         }
  138. };
  139. // get starting point of object hierarchy
  140. template<class C>
  141. inline
  142. TTypeInfo ObjectType(const C& /*obj*/)
  143. {
  144.     return C::GetTypeInfo();
  145. }
  146. template<class C>
  147. inline
  148. pair<TObjectPtr, TTypeInfo> ObjectInfo(C& obj)
  149. {
  150.     return pair<TObjectPtr, TTypeInfo>(&obj, C::GetTypeInfo());
  151. }
  152. // get starting point of non-modifiable object hierarchy
  153. template<class C>
  154. inline
  155. pair<TConstObjectPtr, TTypeInfo> ConstObjectInfo(const C& obj)
  156. {
  157.     return pair<TConstObjectPtr, TTypeInfo>(&obj, C::GetTypeInfo());
  158. }
  159. template<class C>
  160. inline
  161. pair<TConstObjectPtr, TTypeInfo> ObjectInfo(const C& obj)
  162. {
  163.     return pair<TConstObjectPtr, TTypeInfo>(&obj, C::GetTypeInfo());
  164. }
  165. template<class C>
  166. inline
  167. pair<TObjectPtr, TTypeInfo> RefChoiceInfo(CRef<C>& obj)
  168. {
  169.     return pair<TObjectPtr, TTypeInfo>(&obj, C::GetRefChoiceTypeInfo());
  170. }
  171. template<class C>
  172. inline
  173. pair<TConstObjectPtr, TTypeInfo> ConstRefChoiceInfo(const CRef<C>& obj)
  174. {
  175.     return pair<TConstObjectPtr, TTypeInfo>(&obj, C::GetRefChoiceTypeInfo());
  176. }
  177. /* @} */
  178. //#include <serial/objecttype.inl>
  179. END_NCBI_SCOPE
  180. #endif  /* OBJECTTYPE__HPP */
  181. /* ---------------------------------------------------------------------------
  182. * $Log: objecttype.hpp,v $
  183. * Revision 1000.0  2003/10/29 17:25:44  gouriano
  184. * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.6
  185. *
  186. * Revision 1.6  2003/04/15 16:18:16  siyan
  187. * Added doxygen support
  188. *
  189. * Revision 1.5  2002/12/23 18:38:51  dicuccio
  190. * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  191. * Moved all CVS logs to the end.
  192. *
  193. * Revision 1.4  2002/09/17 22:26:16  grichenk
  194. * Type<> -> CType<>
  195. *
  196. * Revision 1.3  2001/05/17 14:58:44  lavr
  197. * Typos corrected
  198. *
  199. * Revision 1.2  2001/01/05 13:57:17  vasilche
  200. * Fixed overloaded method ambiguity on Mac.
  201. *
  202. * Revision 1.1  2000/10/20 15:51:26  vasilche
  203. * Fixed data error processing.
  204. * Added interface for constructing container objects directly into output stream.
  205. * object.hpp, object.inl and object.cpp were split to
  206. * objectinfo.*, objecttype.*, objectiter.* and objectio.*.
  207. *
  208. * ===========================================================================
  209. */