24inline varname::varname(
const std::vector<std::string>& names)
28template<
class charT,
class Traits>
30std::basic_ostream<charT,Traits>&
31operator<<(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);
41template<
class charT,
class Traits>
43std::vector<std::string>*
get_varname(std::basic_ostream<charT,Traits>& os)
45 return (std::vector<std::string>*)os.pword(varname::xindex);
58inline dimchange::dimchange(
size_t intdim,
size_t realdim)
60 ap_dimchange_init(&c, intdim, realdim);
63inline 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));
69inline 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);
76inline 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++)
89inline dimchange::~dimchange()
91 ap_dimchange_clear(&c);
98inline dimchange& dimchange::operator= (
const dimchange& x)
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));
108inline dimchange& dimchange::operator= (
const ap_dim_t d[])
110 memcpy(c.dim, d,
sizeof(ap_dim_t) * (c.intdim + c.realdim));
114inline 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++)
126inline size_t dimchange::get_intdim()
const
131inline size_t dimchange::get_realdim()
const
136inline 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)");
142inline 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)");
148inline ap_dim_t& dimchange::operator[](
size_t dim)
153inline const ap_dim_t& dimchange::operator[](
size_t dim)
const
162inline 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;
179inline void dimchange::print(FILE* stream)
const
181 ap_dimchange_fprint(stream,
const_cast<ap_dimchange_t*
>(&c));
188inline void dimchange::add_invert()
190 ap_dimchange_add_invert(&c);
193inline dimchange dimchange::operator- ()
const
195 dimchange r = *
this; ap_dimchange_add_invert(&r.c);
204inline const ap_dimchange_t* dimchange::get_ap_dimchange_t()
const
209inline ap_dimchange_t* dimchange::get_ap_dimchange_t()
223inline dimperm::dimperm(
size_t size)
225 ap_dimperm_init(&c, size);
228inline 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));
234inline dimperm::dimperm(
id t)
236 ap_dimperm_init(&c, t.size);
237 ap_dimperm_set_id(&c);
240inline 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));
247inline dimperm::dimperm(
const dimperm& x,
const dimperm& y)
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) );
253inline 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++)
264inline dimperm::~dimperm()
266 ap_dimperm_clear(&c);
273inline dimperm& dimperm::operator= (
const dimperm& x)
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);
285inline dimperm& dimperm::operator= (
id t)
287 if (t.size!=c.size) {
288 ap_dimperm_clear(&c);
289 ap_dimperm_init(&c, t.size);
291 ap_dimperm_set_id(&c);
295inline dimperm& dimperm::operator= (
const ap_dim_t d[])
297 memcpy(c.dim, d,
sizeof(ap_dim_t) * c.size);
301inline 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];
315inline size_t dimperm::size()
const
320inline ap_dim_t& dimperm::operator[](
size_t dim)
325inline const ap_dim_t& dimperm::operator[](
size_t dim)
const
330inline ap_dim_t& dimperm::get(
size_t dim)
332 if (dim >= c.size)
throw std::out_of_range(
"apron::dimperm::get(size_t)");
336inline 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)");
346inline 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;
368inline void dimperm::print(FILE* stream)
const
370 ap_dimperm_fprint(stream,
const_cast<ap_dimperm_t*
>(&c));
379inline dimperm& dimperm::operator*= (
const dimperm& y)
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));
392inline 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));
404inline void dimperm::invert()
407 ap_dimperm_invert(&c, &tmp.c);
410inline dimperm dimperm::operator- ()
const
413 ap_dimperm_invert(&r.c,
const_cast<ap_dimperm_t*
>(&c));
422inline const ap_dimperm_t* dimperm::get_ap_dimperm_t()
const
427inline ap_dimperm_t* dimperm::get_ap_dimperm_t()
std::vector< std::string > * get_varname(std::basic_ostream< charT, Traits > &os)
Definition apxx_dimension_inline.hh:43
std::basic_ostream< charT, Traits > & operator<<(std::basic_ostream< charT, Traits > &os, const varname &v)
Definition apxx_dimension_inline.hh:31
dimperm operator*(const dimperm &x, const dimperm &y)
Definition apxx_dimension_inline.hh:392