APRONXX 0.9.15
/home/mine/apron/apronxx/apxx_linexpr1_inline.hh
Go to the documentation of this file.
1/* -*- C++ -*-
2 * apxx_linexpr1_inline.hh
3 *
4 * APRON Library / C++ inline functions
5 *
6 * DO NOT INCLUDE THIS FILE DIRECTLY
7 *
8 * Copyright (C) Antoine Mine' 2007
9 *
10 */
11/* This file is part of the APRON Library, released under LGPL license
12 with an exception allowing the redistribution of statically linked
13 executables.
14
15 Please read the COPYING file packaged in the distribution.
16*/
17
18
19/* ================================= */
20/* linexpr1 */
21/* ================================= */
22
23
24
25/* constructors */
26/* ============ */
27
28inline linexpr1::linexpr1(ap_linexpr1_t& p) : l(p)
29{
30}
31
32inline linexpr1::linexpr1(const environment& e, const linexpr0& x)
33{
34 l = ap_linexpr1_of_linexpr0(const_cast<ap_environment_t*>(e.get_ap_environment_t()),
35 ap_linexpr0_copy(const_cast<ap_linexpr0_t*>(x.get_ap_linexpr0_t())));
36}
37
38inline linexpr1::linexpr1(const environment& e, ap_linexpr_discr_t lin_discr, size_t size)
39{
40 l = ap_linexpr1_make(const_cast<ap_environment_t*>(e.get_ap_environment_t()),
41 lin_discr, size);
42}
43
44inline linexpr1::linexpr1(const linexpr1& x)
45{
46 l = ap_linexpr1_copy(const_cast<ap_linexpr1_t*>(&x.l));
47}
48
49inline linexpr1::linexpr1(const linexpr1& x, const environment& e)
50{
51 bool r =
52 ap_linexpr1_extend_environment(&l,
53 const_cast<ap_linexpr1_t*>(&x.l),
54 const_cast<ap_environment_t*>(e.get_ap_environment_t()));
55 if (r) throw std::invalid_argument("apron::linexpr1::linexpr1(const linexpr1&, environment&) not a super-environment");
56}
57
58
59/* destructor */
60/* ========== */
61
62
63inline linexpr1::~linexpr1()
64{
65 ap_linexpr1_clear(&l);
66}
67
68
69/* assignment */
70/* ========== */
71
72inline linexpr1& linexpr1::operator=(const linexpr1& x)
73{
74 ap_linexpr1_t ll = ap_linexpr1_copy(const_cast<ap_linexpr1_t*>(&x.l));
75 ap_linexpr1_clear(&l);
76 l = ll;
77 return *this;
78}
79
80
81/* dimension operations */
82/* ==================== */
83
84inline void linexpr1::extend_environment(const environment& e)
85{
86 bool r =
87 ap_linexpr1_extend_environment_with(&l,
88 const_cast<ap_environment_t*>(e.get_ap_environment_t()));
89 if (r) throw std::invalid_argument("apron::linexpr1::extend_environment(const environment&) not a super-environment");
90}
91
92
93/* access */
94/* ====== */
95
96
97inline environment linexpr1::get_environment() const
98{
99 return ap_environment_copy(ap_linexpr1_envref(const_cast<ap_linexpr1_t*>(&l)));
100}
101
102inline const linexpr0& linexpr1::get_linexpr0() const
103{
104 return reinterpret_cast<linexpr0&>(*ap_linexpr1_linexpr0ref(const_cast<ap_linexpr1_t*>(&l)));
105}
106
107inline linexpr0& linexpr1::get_linexpr0()
108{
109 return reinterpret_cast<linexpr0&>(*ap_linexpr1_linexpr0ref(&l));
110}
111
112inline size_t linexpr1::size() const
113{
114 return ap_linexpr0_size(ap_linexpr1_linexpr0ref(const_cast<ap_linexpr1_t*>(&l)));
115}
116
117inline ap_linexpr_discr_t linexpr1::get_discr() const
118{
119 return ap_linexpr1_linexpr0ref(const_cast<ap_linexpr1_t*>(&l))->discr;
120}
121
122inline coeff& linexpr1::get_cst()
123{
124 return reinterpret_cast<coeff&>(*ap_linexpr1_cstref(&l));
125}
126
127inline const coeff& linexpr1::get_cst() const
128{
129 return reinterpret_cast<coeff&>(*ap_linexpr1_cstref(const_cast<ap_linexpr1_t*>(&l)));
130}
131
132inline coeff& linexpr1::operator[](const var& var)
133{
134 ap_coeff_t* x = ap_linexpr1_coeffref(&l,
135 const_cast<ap_var_t>(var.get_ap_var_t()));
136 if (!x) throw std::invalid_argument("apron::linexpr1::operator[](const var&) variable not in environment");
137 return reinterpret_cast<coeff&>(*x);
138}
139
140inline const coeff& linexpr1::operator[](const var& var) const
141{
142 ap_coeff_t* x = ap_linexpr1_coeffref(const_cast<ap_linexpr1_t*>(&l),
143 const_cast<ap_var_t>(var.get_ap_var_t()));
144 if (!x) throw std::invalid_argument("apron::linexpr1::operator[](const var&) variable not in environment");
145 return reinterpret_cast<coeff&>(*x);
146}
147
148
149/* print */
150/* ===== */
151
152inline std::ostream& operator<<(std::ostream& os, const linexpr1& s)
153{
154 bool first = true;
155 for (linexpr1::const_iterator i=s.begin();i.valid();++i) {
156 if (print_coeff_sign(os, i.get_coeff(), first, false))
157 os << i.get_var();
158 }
159 print_coeff_sign(os, s.get_cst(), first, true);
160 if (first) os << "0";
161 return os;
162}
163
164inline void linexpr1::print(FILE* stream) const
165{
166 ap_linexpr1_fprint(stream, const_cast<ap_linexpr1_t*>(&l));
167}
168
169
170/* tests */
171/* ===== */
172
173inline bool linexpr1::is_integer() const
174{
175 return ap_linexpr1_is_integer(const_cast<ap_linexpr1_t*>(&l));
176}
177
178inline bool linexpr1::is_real() const
179{
180 return ap_linexpr1_is_real(const_cast<ap_linexpr1_t*>(&l));
181}
182
183inline ap_linexpr_type_t linexpr1::get_type() const
184{
185 return ap_linexpr1_type(const_cast<ap_linexpr1_t*>(&l));
186}
187
188inline bool linexpr1::is_linear() const
189{
190 return ap_linexpr1_is_linear(const_cast<ap_linexpr1_t*>(&l));
191}
192
193inline bool linexpr1::is_quasilinear() const
194{
195 return ap_linexpr1_is_quasilinear(const_cast<ap_linexpr1_t*>(&l));
196}
197
198
199/* iterators */
200/* ========= */
201
202inline void linexpr1::const_iterator::skip_AP_DIM_MAX()
203{
204 if (l->linexpr0->discr == AP_LINEXPR_DENSE) return;
205 while (pos < l->linexpr0->size && l->linexpr0->p.linterm[pos].dim == AP_DIM_MAX) pos++;
206}
207
208inline linexpr1::const_iterator::const_iterator(ap_linexpr1_t* e)
209 : l(e), pos(0)
210{
211 skip_AP_DIM_MAX();
212}
213
214inline linexpr1::const_iterator::const_iterator(const linexpr1& e)
215{
216 l = const_cast<ap_linexpr1_t*>(e.get_ap_linexpr1_t());
217 pos = 0;
218 skip_AP_DIM_MAX();
219}
220
221inline linexpr1::const_iterator::const_iterator(const const_iterator& i)
222 : l(i.l), pos(i.pos)
223{}
224
225
226inline linexpr1::iterator::iterator(ap_linexpr1_t* e)
227 : linexpr1::const_iterator(e)
228{}
229
230inline linexpr1::iterator::iterator(linexpr1& e)
231 : linexpr1::const_iterator(e.get_ap_linexpr1_t())
232{}
233
234inline linexpr1::iterator::iterator(const iterator& i)
235 : linexpr1::const_iterator(i.l)
236{}
237
238inline linexpr1::const_iterator& linexpr1::const_iterator::operator=(const const_iterator& i)
239{
240 l = i.l;
241 pos = i.pos;
242 return *this;
243}
244
245inline linexpr1::iterator& linexpr1::iterator::operator=(const iterator& i)
246{
247 l = i.l;
248 pos = i.pos;
249 return *this;
250}
251
252inline ap_dim_t linexpr1::const_iterator::get_dim() const
253{
254 if (pos >= l->linexpr0->size) throw std::out_of_range("apron::linexpr1::const_iterator::get_dim()");
255 if (l->linexpr0->discr == AP_LINEXPR_DENSE) return pos;
256 else return l->linexpr0->p.linterm[pos].dim;
257}
258
259inline const var& linexpr1::const_iterator::get_var() const
260{
261 ap_dim_t d;
262 if (pos >= l->linexpr0->size) throw std::out_of_range("apron::linexpr1::const_iterator::get_var()");
263 if (l->linexpr0->discr == AP_LINEXPR_DENSE) d = pos;
264 else d = l->linexpr0->p.linterm[pos].dim;
265 return *reinterpret_cast<var*>(&l->env->var_of_dim[d]);
266}
267
268inline const coeff& linexpr1::const_iterator::get_coeff() const
269{
270 if (pos >= l->linexpr0->size) throw std::out_of_range("apron::linexpr1::const_iterator::get_coeff()");
271 if (l->linexpr0->discr == AP_LINEXPR_DENSE) return reinterpret_cast<coeff&>(l->linexpr0->p.coeff[pos]);
272 else return reinterpret_cast<coeff&>(l->linexpr0->p.linterm[pos].coeff);
273}
274
275inline coeff& linexpr1::iterator::get_coeff() const
276{
277 if (pos >= l->linexpr0->size) throw std::out_of_range("apron::linexpr1::iterator::get_coeff()");
278 if (l->linexpr0->discr == AP_LINEXPR_DENSE) return reinterpret_cast<coeff&>(l->linexpr0->p.coeff[pos]);
279 else return reinterpret_cast<coeff&>(l->linexpr0->p.linterm[pos].coeff);
280}
281
282inline void linexpr1::const_iterator::next()
283{
284 pos++;
285 skip_AP_DIM_MAX();
286}
287
288inline void linexpr1::const_iterator::operator++()
289{
290 next();
291}
292
293inline bool linexpr1::const_iterator::valid() const
294{
295 return pos < l->linexpr0->size;
296}
297
298inline linexpr1::const_iterator linexpr1::begin() const
299{
300 return const_iterator(*this);
301}
302
303inline linexpr1::iterator linexpr1::begin()
304{
305 return iterator(*this);
306}
307
308
309/* other operators */
310/* =============== */
311
312inline void linexpr1::minimize()
313{
314 ap_linexpr1_minimize(&l);
315}
316
317
318/* C-level compatibility */
319/* ===================== */
320
321inline const ap_linexpr1_t* linexpr1::get_ap_linexpr1_t() const
322{
323 return &l;
324}
325
326inline ap_linexpr1_t* linexpr1::get_ap_linexpr1_t()
327{
328 return &l;
329}
static bool print_coeff_sign(std::ostream &os, const coeff &c, bool &first, bool cst)
Definition apxx_linexpr0_inline.hh:206
std::ostream & operator<<(std::ostream &os, const linexpr1 &s)
Definition apxx_linexpr1_inline.hh:152