SMT-RAT  24.02
Toolbox for Strategic and Parallel Satisfiability-Modulo-Theories Solving
Value.h
Go to the documentation of this file.
1 /**
2  * @file Value.h
3  * @author Florian Corzilius <corzilius@cs.rwth-aachen.de>
4  * @since 2012-04-05
5  * @version 2014-10-01
6  */
7 
8 #pragma once
9 
10 #include <string.h>
11 #include <assert.h>
12 #include <sstream>
13 
14 namespace smtrat
15 {
16  namespace lra
17  {
18  /**
19  *
20  */
21  template<class T>
22  class Value
23  {
24  private:
25  ///
27  ///
29 
30  public:
31 
32  /**
33  *
34  */
35  Value();
36 
37  /**
38  *
39  * @param _num
40  */
41  Value( const T& _num );
42 
43  /**
44  *
45  * @param _num1
46  * @param _num2
47  */
48  Value( const T& _num1, const T& _num2 );
49 
50  /**
51  *
52  * @param _orig
53  */
54  Value( const Value<T>& _orig );
55 
56  /**
57  *
58  */
59  virtual ~Value();
60 
61  /**
62  * Copy the content of the given value to this one.
63  * @param _value The value to copy.
64  * @return This value after copying.
65  */
66  Value<T>& operator=( const Value<T>& _value );
67 
68  /**
69  *
70  * @param _value
71  * @return
72  */
73  Value<T> operator +( const Value<T>& _value ) const;
74 
75  /**
76  *
77  * @param _value
78  */
79  void operator +=( const Value<T>& _value );
80 
81  /**
82  *
83  * @param _value
84  * @return
85  */
86  Value<T> operator -( const Value<T>& _value ) const;
87 
88  /**
89  *
90  * @param _value
91  */
92  void operator -=( const Value<T>& _value );
93 
94  /**
95  *
96  * @param _a
97  * @return
98  */
99  Value<T> operator *( const T& _a ) const;
100 
101  /**
102  *
103  * @param _value
104  */
105  Value<T> operator *( const Value<T>& _value ) const;
106 
107  /**
108  *
109  * @param _value
110  */
111  void operator *=( const Value<T>& _value );
112 
113  /**
114  *
115  * @param _a
116  */
117  void operator *=( const T& _a );
118 
119  /**
120  *
121  * @param _a
122  * @return
123  */
124  Value<T> operator /( const T& _a ) const;
125 
126  /**
127  *
128  * @param _a
129  */
130  void operator /=( const T& _a );
131 
132  /**
133  *
134  * @param _value
135  * @return
136  */
137  bool operator <( const Value<T>& _value ) const;
138  bool operator >( const Value<T>& _value ) const
139  {
140  return _value < *this;
141  }
142 
143  /**
144  *
145  * @param _value
146  * @return
147  */
148  bool operator <=( const Value<T>& _value ) const;
149  bool operator >=( const Value<T>& _value ) const
150  {
151  return _value <= *this;
152  }
153 
154  /**
155  *
156  * @param _value
157  * @return
158  */
159  bool operator ==( const Value<T>& _value ) const;
160  bool operator !=( const Value<T>& _value ) const
161  {
162  return !(*this == _value);
163  }
164 
165  /**
166  *
167  * @param _a
168  * @return
169  */
170  bool operator ==( const T& _a ) const;
171  bool operator !=( const T& _a ) const
172  {
173  return !(*this == _a);
174  }
175 
176  /**
177  *
178  * @param _a
179  * @return
180  */
181  bool operator <( const T& _a ) const;
182 
183  /**
184  *
185  * @param _a
186  * @return
187  */
188  bool operator >( const T& _a ) const;
189 
190  /**
191  *
192  * @param _a
193  * @return
194  */
195  bool operator <=( const T& _a ) const;
196 
197  /**
198  *
199  * @param _a
200  * @return
201  */
202  bool operator >=( const T& _a ) const;
203 
204  /**
205  *
206  * @return
207  */
208  const std::string toString() const;
209 
210  /**
211  * @return
212  */
213  const T& mainPart() const
214  {
215  return mMainPart;
216  }
217 
218  /**
219  * @return
220  */
221  const T& deltaPart() const
222  {
223  return mDeltaPart;
224  }
225 
226  const Value<T>& abs_()
227  {
228  if( *this < T(0) )
229  (*this) *= T( -1 );
230  return *this;
231  }
232 
233  Value<T> abs() const
234  {
235  if(this->mainPart() < 0){
236  if(this->deltaPart() < 0 ){
237  return Value<T>(-this->mainPart(), -this->deltaPart());
238  }
239  else{
240  return Value<T>(-this->mainPart(), this->deltaPart());
241  }
242  }
243  else{
244  if(this->deltaPart() < 0 ){
245  return Value<T>(this->mainPart(), -this->deltaPart());
246  }
247  else{
248  return Value<T>(this->mainPart(), this->deltaPart());
249  }
250  }
251  }
252 
253  bool is_zero() const
254  {
255  return mMainPart == T(0) && mDeltaPart == T(0);
256  }
257 
258  /**
259  * Computes the sign: 0 if main & delta part are unequal 0. Else +/- 1 determined by the sign of main part (if set) else delta part.
260  */
261  T sign() const;
262 
263  /**
264  *
265  * @param _out
266  */
267  void print( std::ostream& _out = std::cout ) const;
268  };
269  template <typename T1>
270  std::ostream& operator<<( std::ostream& _out, const Value<T1>& _value );
271  } // end namspace lra
272 } // end namspace smtrat
273 
274 #include "Value.tpp"
const T & deltaPart() const
Definition: Value.h:221
void operator*=(const Value< T > &_value)
bool operator<=(const Value< T > &_value) const
Value< T > operator+(const Value< T > &_value) const
Value(const T &_num1, const T &_num2)
Value< T > operator/(const T &_a) const
T sign() const
Computes the sign: 0 if main & delta part are unequal 0.
bool operator==(const Value< T > &_value) const
void operator-=(const Value< T > &_value)
const Value< T > & abs_()
Definition: Value.h:226
bool operator<(const Value< T > &_value) const
Value(const Value< T > &_orig)
void print(std::ostream &_out=std::cout) const
bool is_zero() const
Definition: Value.h:253
const T & mainPart() const
Definition: Value.h:213
const std::string toString() const
Value(const T &_num)
void operator+=(const Value< T > &_value)
Value< T > abs() const
Definition: Value.h:233
void operator/=(const T &_a)
Value< T > operator*(const T &_a) const
Value< T > operator-(const Value< T > &_value) const
bool operator>=(const Value< T > &_value) const
Definition: Value.h:149
bool operator!=(const Value< T > &_value) const
Definition: Value.h:160
bool operator>(const Value< T > &_value) const
Definition: Value.h:138
Value< T > & operator=(const Value< T > &_value)
Copy the content of the given value to this one.
std::ostream & operator<<(std::ostream &_out, const Numeric &_value)
Prints the given Numerics representation on the given output stream.
Definition: Numeric.cpp:455
Class to create the formulas for axioms.