Dynalib Utils
IntWrapper.h
Go to the documentation of this file.
1 //
2 // Created by Ken Kopelson on 26/10/17.
3 //
4 
5 #ifndef INTWRAPPER_H
6 #define INTWRAPPER_H
7 
8 #include "IndexConfig.h"
9 #include "IHashable.h"
10 #include "ICopyable.h"
11 #include "HashCoder.h"
12 
13 template <class T> class IntWrapper : IHashable<T>, ICopyable<IntWrapper<T>> {
14  T _value;
15 
16 public:
17  typedef T valueType;
18  IntWrapper() : _value() {}
19  IntWrapper(T v) : _value(v) {}
20  operator T() const { return _value; }
21  operator T() { return _value; }
22  IntWrapper<T>* copy() override {
23  return new IntWrapper<T>(_value);
24  }
25 
26  T getValue() { return _value; }
27 
28  int hashCode() const override {
29  auto code = HashCoder();
30  code.add(_value);
31  return code.getCode();
32  }
33  bool operator== (const T &other) const override {
34  return _value == other;
35  }
36 
37  // modifiers
38  IntWrapper& operator++ () { ++_value; return *this; }
39  IntWrapper& operator-- () { --_value; return *this; }
40  IntWrapper operator++ (int) { return IntWrapper(_value++); }
41  IntWrapper operator-- (int) { return IntWrapper(_value--); }
42 
43  // Assignment
44  IntWrapper& operator= (T v) { _value = v; return *this; }
45  IntWrapper& operator+= (T v) { _value += v; return *this; }
46  IntWrapper& operator-= (T v) { _value -= v; return *this; }
47  IntWrapper& operator*= (T v) { _value *= v; return *this; }
48  IntWrapper& operator/= (T v) { _value /= v; return *this; }
49  IntWrapper& operator%= (T v) { _value %= v; return *this; }
50  IntWrapper& operator&= (T v) { _value &= v; return *this; }
51  IntWrapper& operator|= (T v) { _value |= v; return *this; }
52  IntWrapper& operator^= (T v) { _value ^= v; return *this; }
53  IntWrapper& operator<<= (T v) { _value <<= v; return *this; }
54  IntWrapper& operator>>= (T v) { _value >>= v; return *this; }
55 
56  // accessors
57  IntWrapper operator+ () const {return IntWrapper(+_value); }
58  IntWrapper operator- () const {return IntWrapper(-_value); }
59  IntWrapper operator! () const {return IntWrapper(!_value); }
60  IntWrapper operator~ () const {return IntWrapper(~_value); }
61 
62  // friends
63  friend IntWrapper operator+ (IntWrapper iw, IntWrapper v) { return IntWrapper(iw._value + v._value); }
64  friend IntWrapper operator+ (IntWrapper iw, T v) { return IntWrapper(iw._value + v); }
65  friend IntWrapper operator+ (T v, IntWrapper iw) { return IntWrapper(v + iw._value); }
66 
67  friend IntWrapper operator- (IntWrapper iw, IntWrapper v) { return IntWrapper(iw._value - v._value); }
68  friend IntWrapper operator- (IntWrapper iw, T v) { return IntWrapper(iw._value - v); }
69  friend IntWrapper operator- (T v, IntWrapper iw) { return IntWrapper(v - iw._value); }
70 
71  friend IntWrapper operator* (IntWrapper iw, IntWrapper v) { return IntWrapper(iw._value * v._value); }
72  friend IntWrapper operator* (IntWrapper iw, T v) { return IntWrapper(iw._value * v); }
73  friend IntWrapper operator* (T v, IntWrapper iw) { return IntWrapper(v * iw._value); }
74 
75  friend IntWrapper operator/ (IntWrapper iw, IntWrapper v) { return IntWrapper(iw._value / v._value); }
76  friend IntWrapper operator/ (IntWrapper iw, T v) { return IntWrapper(iw._value / v); }
77  friend IntWrapper operator/ (T v, IntWrapper iw) { return IntWrapper(v / iw._value); }
78 
79  friend IntWrapper operator% (IntWrapper iw, IntWrapper v) { return IntWrapper(iw._value % v._value); }
80  friend IntWrapper operator% (IntWrapper iw, T v) { return IntWrapper(iw._value % v); }
81  friend IntWrapper operator% (T v, IntWrapper iw) { return IntWrapper(v % iw._value); }
82 
83  friend IntWrapper operator& (IntWrapper iw, IntWrapper v) { return IntWrapper(iw._value & v._value); }
84  friend IntWrapper operator& (IntWrapper iw, T v) { return IntWrapper(iw._value & v); }
85  friend IntWrapper operator& (T v, IntWrapper iw) { return IntWrapper(v & iw._value); }
86 
87  friend IntWrapper operator| (IntWrapper iw, IntWrapper v) { return IntWrapper(iw._value | v._value); }
88  friend IntWrapper operator| (IntWrapper iw, T v) { return IntWrapper(iw._value | v); }
89  friend IntWrapper operator| (T v, IntWrapper iw) { return IntWrapper(v | iw._value); }
90 
91  friend IntWrapper operator^ (IntWrapper iw, IntWrapper v) { return IntWrapper(iw._value ^ v._value); }
92  friend IntWrapper operator^ (IntWrapper iw, T v) { return IntWrapper(iw._value ^ v); }
93  friend IntWrapper operator^ (T v, IntWrapper iw) { return IntWrapper(v ^ iw._value); }
94 
95  friend IntWrapper operator<< (IntWrapper iw, IntWrapper v) { return IntWrapper(iw._value << v._value); }
96  friend IntWrapper operator<< (IntWrapper iw, T v) { return IntWrapper(iw._value << v); }
97  friend IntWrapper operator<< (T v, IntWrapper iw) { return IntWrapper(v << iw._value); }
98 
99  friend IntWrapper operator>> (IntWrapper iw, IntWrapper v) { return IntWrapper(iw._value >> v._value); }
100  friend IntWrapper operator>> (IntWrapper iw, T v) { return IntWrapper(iw._value >> v); }
101  friend IntWrapper operator>> (T v, IntWrapper iw) { return IntWrapper(v >> iw._value); }
102 
103  friend bool operator== (IntWrapper iw, IntWrapper v) { return iw._value == v._value; }
104  friend bool operator== (IntWrapper iw, T v) { return iw._value == v; }
105  friend bool operator== (T v, IntWrapper iw) { return v == iw._value; }
106 
107  friend bool operator!= (IntWrapper iw, IntWrapper v) { return iw._value != v._value; }
108  friend bool operator!= (IntWrapper iw, T v) { return iw._value != v; }
109  friend bool operator!= (T v, IntWrapper iw) { return v != iw._value; }
110 
111  friend bool operator< (IntWrapper iw, IntWrapper v) { return iw._value < v._value; }
112  friend bool operator< (IntWrapper iw, T v) { return iw._value < v; }
113  friend bool operator< (T v, IntWrapper iw) { return v < iw._value; }
114 
115  friend bool operator<= (IntWrapper iw, IntWrapper v) { return iw._value <= v._value; }
116  friend bool operator<= (IntWrapper iw, T v) { return iw._value <= v; }
117  friend bool operator<= (T v, IntWrapper iw) { return v <= iw._value; }
118 
119  friend bool operator> (IntWrapper iw, IntWrapper v) { return iw._value > v._value; }
120  friend bool operator> (IntWrapper iw, T v) { return iw._value > v; }
121  friend bool operator> (T v, IntWrapper iw) { return v > iw._value; }
122 
123  friend bool operator>= (IntWrapper iw, IntWrapper v) { return iw._value >= v._value; }
124  friend bool operator>= (IntWrapper iw, T v) { return iw._value >= v; }
125  friend bool operator>= (T v, IntWrapper iw) { return v >= iw._value; }
126 
127 };
128 
142 
143 #ifdef USE_LONG
145 #else
146 typedef IntWrapper<int32_t> Index;
147 #endif
148 
149 #endif //INTWRAPPER_H
IntWrapper< double > Double
Definition: IntWrapper.h:140
bool operator==(const T &other) const override
Definition: IntWrapper.h:33
friend IntWrapper operator &(IntWrapper iw, IntWrapper v)
Definition: IntWrapper.h:83
IntWrapper< float > Float
Definition: IntWrapper.h:139
Definition: IHashable.h:10
IntWrapper< long long > LongLong
Definition: IntWrapper.h:137
IntWrapper & operator<<=(T v)
Definition: IntWrapper.h:53
friend IntWrapper operator<<(IntWrapper iw, IntWrapper v)
Definition: IntWrapper.h:95
friend bool operator<(IntWrapper iw, IntWrapper v)
Definition: IntWrapper.h:111
Definition: HashCoder.h:41
friend bool operator>(IntWrapper iw, IntWrapper v)
Definition: IntWrapper.h:119
friend IntWrapper operator>>(IntWrapper iw, IntWrapper v)
Definition: IntWrapper.h:99
IntWrapper< unsigned long long > ULongLong
Definition: IntWrapper.h:138
friend bool operator!=(IntWrapper iw, IntWrapper v)
Definition: IntWrapper.h:107
IntWrapper & operator+=(T v)
Definition: IntWrapper.h:45
IntWrapper operator~() const
Definition: IntWrapper.h:60
IntWrapper(T v)
Definition: IntWrapper.h:19
IntWrapper< int > Integer
Definition: IntWrapper.h:133
IntWrapper< int64_t > Index
Definition: IntWrapper.h:144
IntWrapper & operator*=(T v)
Definition: IntWrapper.h:47
IntWrapper & operator--()
Definition: IntWrapper.h:39
IntWrapper operator-() const
Definition: IntWrapper.h:58
T valueType
Definition: IntWrapper.h:17
IntWrapper operator!() const
Definition: IntWrapper.h:59
IntWrapper< T > * copy() override
Definition: IntWrapper.h:22
IntWrapper()
Definition: IntWrapper.h:18
IntWrapper & operator=(T v)
Definition: IntWrapper.h:44
friend IntWrapper operator*(IntWrapper iw, IntWrapper v)
Definition: IntWrapper.h:71
int hashCode() const override
Definition: IntWrapper.h:28
IntWrapper< char > Char
Definition: IntWrapper.h:129
friend bool operator>=(IntWrapper iw, IntWrapper v)
Definition: IntWrapper.h:123
friend IntWrapper operator|(IntWrapper iw, IntWrapper v)
Definition: IntWrapper.h:87
Definition: IntWrapper.h:13
IntWrapper< long double > LongDouble
Definition: IntWrapper.h:141
IntWrapper< short > Short
Definition: IntWrapper.h:131
IntWrapper< long > Long
Definition: IntWrapper.h:135
IntWrapper operator+() const
Definition: IntWrapper.h:57
IntWrapper & operator &=(T v)
Definition: IntWrapper.h:50
IntWrapper & operator-=(T v)
Definition: IntWrapper.h:46
friend IntWrapper operator%(IntWrapper iw, IntWrapper v)
Definition: IntWrapper.h:79
friend bool operator<=(IntWrapper iw, IntWrapper v)
Definition: IntWrapper.h:115
friend IntWrapper operator^(IntWrapper iw, IntWrapper v)
Definition: IntWrapper.h:91
IntWrapper & operator^=(T v)
Definition: IntWrapper.h:52
IntWrapper< unsigned int > UInteger
Definition: IntWrapper.h:134
IntWrapper< unsigned short > UShort
Definition: IntWrapper.h:132
IntWrapper & operator%=(T v)
Definition: IntWrapper.h:49
IntWrapper & operator>>=(T v)
Definition: IntWrapper.h:54
T getValue()
Definition: IntWrapper.h:26
IntWrapper & operator/=(T v)
Definition: IntWrapper.h:48
IntWrapper & operator++()
Definition: IntWrapper.h:38
IntWrapper< unsigned char > UChar
Definition: IntWrapper.h:130
IntWrapper & operator|=(T v)
Definition: IntWrapper.h:51
friend IntWrapper operator/(IntWrapper iw, IntWrapper v)
Definition: IntWrapper.h:75
IntWrapper< unsigned long > ULong
Definition: IntWrapper.h:136
Definition: ICopyable.h:8