Imported Upstream version 15.0.0
[platform/upstream/libzypp.git] / zypp / base / DefaultIntegral.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/base/DefaultIntegral.h
10  *
11 */
12 #ifndef ZYPP_BASE_DEFAULTINTEGRAL_H
13 #define ZYPP_BASE_DEFAULTINTEGRAL_H
14
15 #include <iosfwd>
16 #include <boost/static_assert.hpp>
17 #include <boost/type_traits/is_integral.hpp>
18
19 ///////////////////////////////////////////////////////////////////
20 namespace zypp
21 { /////////////////////////////////////////////////////////////////
22
23
24   ///////////////////////////////////////////////////////////////////
25   //
26   //  CLASS NAME : DefaultIntegral<_Tp,_Initial>
27   //
28   /** Integral type with defined initial value when default constructed.
29    *
30    * \code
31    * typedef DefaultIntegral<unsigned,0> Counter;
32    * std::map<KeyType,Counter> stats;
33    * for ( all keys  )
34    *   ++(stats[key]);
35    * \endcode
36    *
37    * \todo maybe specialize for bool, add logical and bit operators
38    * \todo let _Initial default to 0 then remove base/Counter.h
39   */
40   template<class _Tp, _Tp _Initial>
41     class DefaultIntegral
42     {
43     public:
44       typedef _Tp value_type;
45
46     public:
47       DefaultIntegral( _Tp val_r = _Initial )
48       : _val( val_r )
49       { BOOST_STATIC_ASSERT(boost::is_integral<_Tp>::value); }
50
51       /** Conversion to _Tp. */
52       //@{
53       _Tp & get()       { return _val; }
54       _Tp   get() const { return _val; }
55
56       operator _Tp &()       { return get(); }
57       operator _Tp  () const { return get(); }
58       //@}
59
60       /** Reset to the defined initial value. */
61       DefaultIntegral & reset() { _val = _Initial; return *this; }
62
63       /** \name Arithmetic operations.
64        * \c + \c - \c * \c / are provided via conversion to _Tp.
65       */
66       //@{
67       DefaultIntegral & operator=( _Tp rhs )  {  _val = rhs; return *this; }
68       DefaultIntegral & operator+=( _Tp rhs ) { _val += rhs; return *this; }
69       DefaultIntegral & operator-=( _Tp rhs ) { _val -= rhs; return *this; }
70       DefaultIntegral & operator*=( _Tp rhs ) { _val *= rhs; return *this; }
71       DefaultIntegral & operator/=( _Tp rhs ) { _val /= rhs; return *this; }
72
73       DefaultIntegral & operator++(/*prefix*/) { ++_val; return *this; }
74       DefaultIntegral & operator--(/*prefix*/) { --_val; return *this; }
75
76       DefaultIntegral operator++(int/*postfix*/) { return _val++; }
77       DefaultIntegral operator--(int/*postfix*/) { return _val--; }
78       //@}
79
80     private:
81       _Tp _val;
82     };
83
84   /////////////////////////////////////////////////////////////////
85 } // namespace zypp
86 ///////////////////////////////////////////////////////////////////
87 #endif // ZYPP_BASE_DEFAULTINTEGRAL_H