backup
[platform/upstream/libzypp.git] / zypp / ResTraits.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/ResTraits.h
10  *
11 */
12 #ifndef ZYPP_RESTRAITS_H
13 #define ZYPP_RESTRAITS_H
14
15 #include "zypp/base/PtrTypes.h"
16 #include "zypp/base/KindOf.h"
17
18 ///////////////////////////////////////////////////////////////////
19 namespace zypp
20 { /////////////////////////////////////////////////////////////////
21
22   /** \defgroup ZYPP_RESOLVABLE_SMART_POINTER_TYPES
23    * Resolvable smart pointer types.
24    *
25    * Forward declaration of all Resolvable smart pointer
26    * types provided in \c ResTraits.h (recommended in header files):
27    * \code
28    * #include<zypp/ResTraits.h>
29    *
30    * Resolvable_Ptr                      // Resolvable *
31    * ResTraits<Resolvable>::PtrType      // same as above
32    *
33    * Resolvable_constPtr                 // const Resolvable *
34    * ResTraits<Resolvable>::constPtrType // same as above
35    * \endcode
36    *
37    * Synonym, but requires \c Resolvable.h being included:
38    * \code
39    * #include<zypp/Resolvable.h>
40    *
41    * Resolvable::Ptr        // same as Resolvable_Ptr but requires Resolvable.h
42    * Resolvable::constPtr   // same as Resolvable_constPtr but requires Resolvable.h
43    * \endcode
44    *
45    * \note When adding a \c NewResolvable type here, dont forgett to
46    * put <tt>IMPL_PTR_TYPE(NewResolvable);</tt> into the \c NewResolvable.cc.
47    */
48   //@{
49   DEFINE_PTR_TYPE( Resolvable );
50   DEFINE_PTR_TYPE( ResObject );
51
52   DEFINE_PTR_TYPE( Atom );
53   DEFINE_PTR_TYPE( Package );
54   DEFINE_PTR_TYPE( SrcPackage );
55   DEFINE_PTR_TYPE( Selection );
56   DEFINE_PTR_TYPE( Pattern );
57   DEFINE_PTR_TYPE( Product );
58   DEFINE_PTR_TYPE( Patch );
59   DEFINE_PTR_TYPE( Script );
60   DEFINE_PTR_TYPE( Message );
61   DEFINE_PTR_TYPE( Language );
62
63   DEFINE_PTR_TYPE( SystemResObject );
64   //@}
65
66   /** Base of ResTraits. Defines the Resolvable::Kind type. */
67   struct ResolvableTraits
68   {
69     typedef KindOf<Resolvable>  KindType;
70   };
71
72   /** ResTraits. Defines common types and the Kind value. */
73   template<typename _Res>
74     struct ResTraits : public ResolvableTraits
75     {
76       typedef intrusive_ptr<_Res>       PtrType;
77       typedef intrusive_ptr<const _Res> constPtrType;
78
79       static const KindType kind;
80     };
81
82   /** ResTraits specialisation for Resolvable.
83    * Resolvable is common base and has no Kind value.
84   */
85   template<>
86     struct ResTraits<Resolvable> : public ResolvableTraits
87     {
88       typedef intrusive_ptr<Resolvable>       PtrType;
89       typedef intrusive_ptr<const Resolvable> constPtrType;
90     };
91
92   /** ResTraits specialisation for ResObject.
93    * ResObject is common base and has no Kind value.
94   */
95   template<>
96     struct ResTraits<ResObject> : public ResolvableTraits
97     {
98       typedef intrusive_ptr<ResObject>       PtrType;
99       typedef intrusive_ptr<const ResObject> constPtrType;
100     };
101
102   /////////////////////////////////////////////////////////////////
103 } // namespace zypp
104 ///////////////////////////////////////////////////////////////////
105 #endif // ZYPP_RESTRAITS_H