Imported Upstream version 14.45.0
[platform/upstream/libzypp.git] / zypp / base / ProvideNumericId.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/base/ProvideNumericId.h
10  *
11 */
12 #ifndef ZYPP_BASE_PROVIDENUMERICID_H
13 #define ZYPP_BASE_PROVIDENUMERICID_H
14
15 ///////////////////////////////////////////////////////////////////
16 namespace zypp
17 { /////////////////////////////////////////////////////////////////
18   ///////////////////////////////////////////////////////////////////
19   namespace base
20   { /////////////////////////////////////////////////////////////////
21
22     ///////////////////////////////////////////////////////////////////
23     //
24     //  CLASS NAME : ProvideNumericId
25     //
26     /** Base class for objects providing a numeric Id.
27      * The ctor creates a NumericId from some static counter.
28      *
29      * The only assertion is that \c 0 is not used as an Id,
30      * \b unless the derived class explicitly requests this by
31      * using \ref ProvideNumericId( const void *const ).
32      *
33      * Why should you want to use \c 0 as an Id? E.g if your class
34      * provides some (singleton) No-object. Might be desirable to
35      * make the No-object have No-Id.
36      *
37      * \code
38      * struct Foo : public base::ProvideNumericId<Foo,unsigned>
39      * {};
40      * Foo foo;
41      * foo.numericId(); // returns foo's NumericId.
42      * \endcode
43     */
44     template<class _Derived, class _NumericIdType>
45       struct ProvideNumericId
46       {
47       public:
48         /** \return The objects numeric Id. */
49         _NumericIdType numericId() const
50         { return _numericId; }
51
52       protected:
53         /** Default ctor */
54         ProvideNumericId()
55         : _numericId( nextId() )
56         {}
57         /** Copy ctor */
58         ProvideNumericId( const ProvideNumericId & /*rhs*/ )
59         : _numericId( nextId() )
60         {}
61         /** Assign */
62         ProvideNumericId & operator=( const ProvideNumericId & /*rhs*/ )
63         { return *this; }
64         /** Dtor */
65         ~ProvideNumericId()
66         {}
67       protected:
68         /** No-Id ctor (0).
69          * Explicitly request Id \c 0. Use it with care!
70         */
71         ProvideNumericId( const void *const )
72         : _numericId( 0 )
73         {}
74       private:
75         /** Provide the next Id to use. */
76         static _NumericIdType nextId()
77         {
78           static _NumericIdType _staticCounter = 0;
79           // Assert not returning 0
80           return ++_staticCounter;
81         }
82         /**  */
83         const _NumericIdType _numericId;
84       };
85     ///////////////////////////////////////////////////////////////////
86
87     /////////////////////////////////////////////////////////////////
88   } // namespace base
89   ///////////////////////////////////////////////////////////////////
90   /////////////////////////////////////////////////////////////////
91 } // namespace zypp
92 ///////////////////////////////////////////////////////////////////
93 #endif // ZYPP_BASE_PROVIDENUMERICID_H