LocARNA-1.9.2
|
00001 #ifndef LOCARNA_TYPE_WRAPPER_HH 00002 #define LOCARNA_TYPE_WRAPPER_HH 00003 00004 #ifdef HAVE_CONFIG_H 00005 #include <config.h> 00006 #endif 00007 00008 namespace LocARNA { 00015 template <class T> 00016 class type_wrapper { 00017 T val_; 00018 00019 public: 00023 type_wrapper() : val_() {} 00024 00028 explicit type_wrapper(const T &i) : val_(i) {} 00029 00033 type_wrapper(const type_wrapper &idx) : val_(idx.val()) {} 00034 00043 const T & 00044 val() const { 00045 return val_; 00046 } 00047 00053 bool 00054 operator==(const type_wrapper &x) const { 00055 return val_ == x.val_; 00056 } 00057 00063 bool 00064 operator!=(const type_wrapper &x) const { 00065 return val_ != x.val_; 00066 } 00067 00073 bool 00074 operator<=(const type_wrapper &x) const { 00075 return val_ <= x.val_; 00076 } 00077 00083 bool 00084 operator<(const type_wrapper &x) const { 00085 return val_ < x.val_; 00086 } 00087 00093 bool 00094 operator>=(const type_wrapper &x) const { 00095 return val_ >= x.val_; 00096 } 00097 00103 bool 00104 operator>(const type_wrapper &x) const { 00105 return val_ > x.val_; 00106 } 00107 00113 type_wrapper 00114 operator+(const type_wrapper &x) const { 00115 return type_wrapper(val_ + x.val_); 00116 } 00117 00123 type_wrapper 00124 operator-(const type_wrapper &x) const { 00125 return type_wrapper(val_ - x.val_); 00126 } 00127 00133 type_wrapper 00134 operator+(const T &x) const { 00135 return type_wrapper(val_ + x); 00136 } 00137 00143 type_wrapper 00144 operator-(const T &x) const { 00145 return type_wrapper(val_ - x); 00146 } 00147 00152 const type_wrapper &operator++() { 00153 ++val_; 00154 return *this; 00155 } 00156 00161 const type_wrapper &operator--() { 00162 --val_; 00163 return *this; 00164 } 00165 00170 const type_wrapper &operator++(int) { 00171 type_wrapper<T> tmp(*this); 00172 ++val_; 00173 return tmp; 00174 } 00175 00180 const type_wrapper &operator--(int) { 00181 type_wrapper<T> tmp(*this); 00182 --val_; 00183 return tmp; 00184 } 00185 00186 }; // end class type_wrapper 00187 00188 template <class T> 00189 std::ostream & 00190 operator<<(std::ostream &out, const type_wrapper<T> &x) { 00191 out << x.val(); 00192 return out; 00193 } 00194 00195 } // end namespace LocARNA 00196 00197 #endif // LOCARNA_TYPE_WRAPPER_HH