1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/base/DefaultIntegral.h
12 #ifndef ZYPP_BASE_DEFAULTINTEGRAL_H
13 #define ZYPP_BASE_DEFAULTINTEGRAL_H
16 #include <boost/static_assert.hpp>
17 #include <boost/type_traits/is_integral.hpp>
19 ///////////////////////////////////////////////////////////////////
21 { /////////////////////////////////////////////////////////////////
24 ///////////////////////////////////////////////////////////////////
26 // CLASS NAME : DefaultIntegral<Tp,TInitial>
28 /** Integral type with defined initial value when default constructed.
31 * typedef DefaultIntegral<unsigned,0> Counter;
32 * std::map<KeyType,Counter> stats;
37 * \todo maybe specialize for bool, add logical and bit operators
38 * \todo let TInitial default to 0 then remove base/Counter.h
40 template<class Tp, Tp TInitial>
44 typedef Tp value_type;
47 DefaultIntegral( Tp val_r = TInitial )
49 { BOOST_STATIC_ASSERT(boost::is_integral<Tp>::value); }
51 /** Conversion to Tp. */
53 Tp & get() { return _val; }
54 Tp get() const { return _val; }
56 operator Tp &() { return get(); }
57 operator Tp () const { return get(); }
60 /** The initial value. */
61 constexpr Tp initial() const { return TInitial; }
63 /** Reset to the defined initial value. */
64 DefaultIntegral & reset() { _val = TInitial; return *this; }
66 /** \name Arithmetic operations.
67 * \c + \c - \c * \c / are provided via conversion to Tp.
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; }
76 DefaultIntegral & operator++(/*prefix*/) { ++_val; return *this; }
77 DefaultIntegral & operator--(/*prefix*/) { --_val; return *this; }
79 DefaultIntegral operator++(int/*postfix*/) { return _val++; }
80 DefaultIntegral operator--(int/*postfix*/) { return _val--; }
87 /** \relates DefaultIntegral \c true initialized \c bool */
88 typedef DefaultIntegral<bool,true> TrueBool;
90 /** \relates DefaultIntegral \c false initialized \c bool */
91 typedef DefaultIntegral<bool,false> FalseBool;
93 /** \relates DefaultIntegral \c zero initialized \c integral */
94 template<typename TIntegral>
95 using ZeroInit = DefaultIntegral<TIntegral,TIntegral(0)>;
97 template<class Tp, Tp TInitial>
98 std::string asString( const DefaultIntegral<Tp,TInitial> & obj )
99 { return asString( obj.get() ); }
101 /////////////////////////////////////////////////////////////////
103 ///////////////////////////////////////////////////////////////////
104 #endif // ZYPP_BASE_DEFAULTINTEGRAL_H