Imported Upstream version 16.3.2
[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,TInitial>
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 TInitial default to 0 then remove base/Counter.h
39   */
40   template<class Tp, Tp TInitial>
41     class DefaultIntegral
42     {
43     public:
44       typedef Tp value_type;
45
46     public:
47       DefaultIntegral( Tp val_r = TInitial )
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       /** The initial value. */
61       constexpr Tp initial() const { return TInitial; }
62
63       /** Reset to the defined initial value. */
64       DefaultIntegral & reset() { _val = TInitial; return *this; }
65
66       /** \name Arithmetic operations.
67        * \c + \c - \c * \c / are provided via conversion to Tp.
68       */
69       //@{
70       DefaultIntegral & operator=( Tp rhs )  {  _val = rhs; return *this; }
71       DefaultIntegral & operator+=( Tp rhs ) { _val += rhs; return *this; }
72       DefaultIntegral & operator-=( Tp rhs ) { _val -= rhs; return *this; }
73       DefaultIntegral & operator*=( Tp rhs ) { _val *= rhs; return *this; }
74       DefaultIntegral & operator/=( Tp rhs ) { _val /= rhs; return *this; }
75
76       DefaultIntegral & operator++(/*prefix*/) { ++_val; return *this; }
77       DefaultIntegral & operator--(/*prefix*/) { --_val; return *this; }
78
79       DefaultIntegral operator++(int/*postfix*/) { return _val++; }
80       DefaultIntegral operator--(int/*postfix*/) { return _val--; }
81       //@}
82
83     private:
84       Tp _val;
85     };
86
87     /** \relates DefaultIntegral \c true initialized \c bool  */
88     typedef DefaultIntegral<bool,true>  TrueBool;
89
90     /** \relates DefaultIntegral \c false initialized \c bool */
91     typedef DefaultIntegral<bool,false> FalseBool;
92
93     /** \relates DefaultIntegral \c zero initialized \c integral */
94     template<typename TIntegral>
95     using ZeroInit = DefaultIntegral<TIntegral,TIntegral(0)>;
96
97     template<class Tp, Tp TInitial>
98     std::string asString( const DefaultIntegral<Tp,TInitial> & obj )
99     { return asString( obj.get() ); }
100
101   /////////////////////////////////////////////////////////////////
102 } // namespace zypp
103 ///////////////////////////////////////////////////////////////////
104 #endif // ZYPP_BASE_DEFAULTINTEGRAL_H