24 inline varname::varname(
const std::vector<std::string>& names)
28 template<
class charT,
class Traits>
30 std::basic_ostream<charT,Traits>&
31 operator<<(std::basic_ostream<charT,Traits>& os,
const varname& v)
33 std::vector<std::string>*& vv =
34 (std::vector<std::string>*&)os.pword(varname::xindex);
36 if (v.names.size()) vv =
new std::vector<std::string>(v.names);
41 template<
class charT,
class Traits>
43 std::vector<std::string>*
get_varname(std::basic_ostream<charT,Traits>& os)
45 return (std::vector<std::string>*)os.pword(varname::xindex);
58 inline dimchange::dimchange(
size_t intdim,
size_t realdim)
60 ap_dimchange_init(&c, intdim, realdim);
63 inline dimchange::dimchange(
size_t intdim,
size_t realdim,
const ap_dim_t d[])
65 ap_dimchange_init(&c, intdim, realdim);
66 memcpy(c.dim, d,
sizeof(ap_dim_t) * (intdim + realdim));
69 inline dimchange::dimchange(
const dimchange& x,
bool inv)
71 ap_dimchange_init(&c, x.
c.intdim, x.
c.realdim);
72 memcpy(c.dim, x.
c.dim,
sizeof(ap_dim_t) * (x.
c.intdim + x.
c.realdim));
73 if (inv) ap_dimchange_add_invert(&c);
76 inline dimchange::dimchange(
size_t intdim,
size_t realdim,
const std::vector<ap_dim_t>& d)
78 if (d.size()<intdim+realdim)
79 throw std::invalid_argument(
"apron::dimchange::dimchange(size_t, size_t, const vector<ap_dim_t>&) vector too short");
80 ap_dimchange_init(&c, intdim, realdim);
81 for (
size_t i=0; i<intdim+realdim; i++)
89 inline dimchange::~dimchange()
91 ap_dimchange_clear(&c);
101 ap_dimchange_clear(&c);
102 ap_dimchange_init(&c, x.
c.intdim, x.
c.realdim);
103 memcpy(c.dim, x.
c.dim,
sizeof(ap_dim_t) * (x.
c.intdim + x.
c.realdim));
108 inline dimchange& dimchange::operator= (
const ap_dim_t d[])
110 memcpy(c.dim, d,
sizeof(ap_dim_t) * (c.intdim + c.realdim));
114 inline dimchange& dimchange::operator= (
const std::vector<ap_dim_t>& d)
116 if (d.size()<c.intdim+c.realdim)
117 throw std::invalid_argument(
"apron::dimchange::operator=(const vector<ap_dim_t>&) vector too short");
118 for (
size_t i=0; i<c.intdim+c.realdim; i++)
126 inline size_t dimchange::get_intdim()
const
131 inline size_t dimchange::get_realdim()
const
136 inline ap_dim_t& dimchange::get(
size_t dim)
138 if (
dim >= c.intdim + c.realdim)
throw std::out_of_range(
"apron::dimchange::get(size_t)");
142 inline const ap_dim_t& dimchange::get(
size_t dim)
const
144 if (
dim >= c.intdim + c.realdim)
throw std::out_of_range(
"apron::dimchange::get(size_t)");
148 inline ap_dim_t& dimchange::operator[](
size_t dim)
153 inline const ap_dim_t& dimchange::operator[](
size_t dim)
const
162 inline std::ostream&
operator<< (std::ostream& os,
const dimchange& s)
165 os <<
"dimchange: intdim=" << s.c.intdim <<
", realdim=" << s.c.realdim << std::endl;
167 size_t sz = (*names).size();
168 for (
size_t i=0;i<s.c.intdim+s.c.realdim;i++)
169 if (s.c.dim[i] < sz) os << (*names)[s.c.dim[i]] <<
" ";
170 else os <<
"x" << s.c.dim[i] <<
" ";
173 for (
size_t i=0;i<s.c.intdim+s.c.realdim;i++)
174 os <<
"x" << s.c.dim[i] <<
" ";
176 return os << std::endl;
179 inline void dimchange::print(FILE* stream)
const
181 ap_dimchange_fprint(stream,
const_cast<ap_dimchange_t*
>(&c));
188 inline void dimchange::add_invert()
190 ap_dimchange_add_invert(&c);
195 dimchange r = *
this; ap_dimchange_add_invert(&r.
c);
204 inline const ap_dimchange_t* dimchange::get_ap_dimchange_t()
const
209 inline ap_dimchange_t* dimchange::get_ap_dimchange_t()
223 inline dimperm::dimperm(
size_t size)
225 ap_dimperm_init(&c, size);
228 inline dimperm::dimperm(
size_t size,
const ap_dim_t d[])
230 ap_dimperm_init(&c, size);
231 memcpy(c.dim, d,
sizeof(ap_dim_t) * (size));
234 inline dimperm::dimperm(
id t)
236 ap_dimperm_init(&c, t.
size);
237 ap_dimperm_set_id(&c);
240 inline dimperm::dimperm(
const dimperm& x,
bool inv)
242 ap_dimperm_init(&c, x.
c.size);
243 if (inv) ap_dimperm_invert(&c,
const_cast<ap_dimperm_t*
>(&x.
c));
244 else memcpy(c.dim, x.
c.dim,
sizeof(ap_dim_t) * (x.
c.size));
249 ap_dimperm_init(&c, x.
c.size);
250 ap_dimperm_compose( &c,
const_cast<ap_dimperm_t*
>(&x.
c),
const_cast<ap_dimperm_t*
>(&y.
c) );
253 inline dimperm::dimperm(
const std::vector<ap_dim_t>& d)
255 ap_dimperm_init(&c, d.size());
256 for (
size_t i=0; i<d.size(); i++)
264 inline dimperm::~dimperm()
266 ap_dimperm_clear(&c);
276 if (x.
c.size!=c.size) {
277 ap_dimperm_clear(&c);
278 ap_dimperm_init(&c, x.
c.size);
280 memcpy(c.dim, x.
c.dim,
sizeof(ap_dim_t) * c.size);
287 if (t.
size!=c.size) {
288 ap_dimperm_clear(&c);
289 ap_dimperm_init(&c, t.
size);
291 ap_dimperm_set_id(&c);
295 inline dimperm& dimperm::operator= (
const ap_dim_t d[])
297 memcpy(c.dim, d,
sizeof(ap_dim_t) * c.size);
301 inline dimperm& dimperm::operator= (
const std::vector<ap_dim_t>& d)
303 if (c.size!=d.size()) {
304 ap_dimperm_clear(&c);
305 ap_dimperm_init(&c, d.size());
307 for (
size_t i=0; i<c.size; i++) c.dim[i] = d[i];
315 inline size_t dimperm::size()
const
320 inline ap_dim_t& dimperm::operator[](
size_t dim)
325 inline const ap_dim_t& dimperm::operator[](
size_t dim)
const
330 inline ap_dim_t& dimperm::get(
size_t dim)
332 if (
dim >= c.size)
throw std::out_of_range(
"apron::dimperm::get(size_t)");
336 inline const ap_dim_t& dimperm::get(
size_t dim)
const
338 if (
dim >= c.size)
throw std::out_of_range(
"apron::dimperm::get(size_t)");
346 inline std::ostream&
operator<< (std::ostream& os,
const dimperm& s)
349 os <<
"dimperm: size=" << s.c.size << std::endl;
351 size_t sz = (*names).size();
352 for (
size_t i=0;i<s.c.size;i++) {
353 if (i<sz) os << (*names)[i];
356 if (s.c.dim[i]<sz) os << (*names)[s.c.dim[i]];
357 else os <<
"x" << s.c.dim[i];
362 for (
size_t i=0;i<s.c.size;i++)
363 os <<
"x" << i <<
" -> " <<
"x" << s.c.dim[i] << std::endl;
368 inline void dimperm::print(FILE* stream)
const
370 ap_dimperm_fprint(stream,
const_cast<ap_dimperm_t*
>(&c));
381 if (c.size!=y.
c.size)
382 throw std::invalid_argument(
"apron::dimperm::operator*= (const dimperm&) size mismatch");
385 ap_dimperm_compose(&c, &c,
const_cast<ap_dimperm_t*
>(&tmp.
c));
388 ap_dimperm_compose(&c, &c,
const_cast<ap_dimperm_t*
>(&y.
c));
392 inline dimperm
operator* (
const dimperm& x,
const dimperm& y)
394 if (x.c.size!=y.c.size)
395 throw std::invalid_argument(
"apron::dimperm::operator* (const dimperm&, const dimperm&) size mismatch");
396 dimperm r = x.c.size;
397 ap_dimperm_compose(&r.c,
const_cast<ap_dimperm_t*
>(&x.c),
const_cast<ap_dimperm_t*
>(&y.c));
404 inline void dimperm::invert()
407 ap_dimperm_invert(&c, &tmp.
c);
413 ap_dimperm_invert(&r.
c,
const_cast<ap_dimperm_t*
>(&c));
422 inline const ap_dimperm_t* dimperm::get_ap_dimperm_t()
const
427 inline ap_dimperm_t* dimperm::get_ap_dimperm_t()