diff options
Diffstat (limited to 'lib/pmx_helper.hpp')
-rw-r--r-- | lib/pmx_helper.hpp | 263 |
1 files changed, 0 insertions, 263 deletions
diff --git a/lib/pmx_helper.hpp b/lib/pmx_helper.hpp deleted file mode 100644 index b44345c..0000000 --- a/lib/pmx_helper.hpp +++ /dev/null @@ -1,263 +0,0 @@ -// -// Copyright 2012 Josh Blum -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. - -#ifndef INCLUDED_LIBGRAS_PMX_HELPER_HPP -#define INCLUDED_LIBGRAS_PMX_HELPER_HPP - -#include <PMC/PMC.hpp> -#include <PMC/Containers.hpp> -#include <gruel/pmt.h> -#include <boost/foreach.hpp> - -namespace pmt -{ - -inline pmt_t pmc_to_pmt(const PMCC &p) -{ - //the container is null - if (not p) return pmt::pmt_t(); - - #define decl_pmc_to_pmt(type, conv) if (p.is<type >()) return conv(p.as<type >()) - - //bool - decl_pmc_to_pmt(bool, pmt_from_bool); - - //string - decl_pmc_to_pmt(std::string, pmt_string_to_symbol); - - //numeric types - decl_pmc_to_pmt(int8_t, pmt_from_long); - decl_pmc_to_pmt(int16_t, pmt_from_long); - decl_pmc_to_pmt(int32_t, pmt_from_long); - decl_pmc_to_pmt(uint8_t, pmt_from_long); - decl_pmc_to_pmt(uint16_t, pmt_from_long); - decl_pmc_to_pmt(uint32_t, pmt_from_long); - decl_pmc_to_pmt(int64_t, pmt_from_uint64); - decl_pmc_to_pmt(uint64_t, pmt_from_uint64); - decl_pmc_to_pmt(float, pmt_from_double); - decl_pmc_to_pmt(double, pmt_from_double); - #define pmt_from_complex(x) pmt_make_rectangular((x).real(), (x).imag()) - decl_pmc_to_pmt(std::complex<float>, pmt_from_complex); - decl_pmc_to_pmt(std::complex<double>, pmt_from_complex); - - //pair container - if (p.is<PMCPair>()) - { - const PMCPair &pr = p.as<PMCPair>(); - return pmt_cons(pmc_to_pmt(pr.first), pmc_to_pmt(pr.second)); - } - - //fucking tuples -/* -for i in range(11): - args = list() - for j in range(i): - args.append('pmc_to_pmt(p.as<PMCTuple<%d> >()[%d])'%(i, j)) - print ' if (p.is<PMCTuple<%d> >())'%i - print ' return pmt_make_tuple(%s);'%(', '.join(args),) -*/ - if (p.is<PMCTuple<0> >()) - return pmt_make_tuple(); - if (p.is<PMCTuple<1> >()) - return pmt_make_tuple(pmc_to_pmt(p.as<PMCTuple<1> >()[0])); - if (p.is<PMCTuple<2> >()) - return pmt_make_tuple(pmc_to_pmt(p.as<PMCTuple<2> >()[0]), pmc_to_pmt(p.as<PMCTuple<2> >()[1])); - if (p.is<PMCTuple<3> >()) - return pmt_make_tuple(pmc_to_pmt(p.as<PMCTuple<3> >()[0]), pmc_to_pmt(p.as<PMCTuple<3> >()[1]), pmc_to_pmt(p.as<PMCTuple<3> >()[2])); - if (p.is<PMCTuple<4> >()) - return pmt_make_tuple(pmc_to_pmt(p.as<PMCTuple<4> >()[0]), pmc_to_pmt(p.as<PMCTuple<4> >()[1]), pmc_to_pmt(p.as<PMCTuple<4> >()[2]), pmc_to_pmt(p.as<PMCTuple<4> >()[3])); - if (p.is<PMCTuple<5> >()) - return pmt_make_tuple(pmc_to_pmt(p.as<PMCTuple<5> >()[0]), pmc_to_pmt(p.as<PMCTuple<5> >()[1]), pmc_to_pmt(p.as<PMCTuple<5> >()[2]), pmc_to_pmt(p.as<PMCTuple<5> >()[3]), pmc_to_pmt(p.as<PMCTuple<5> >()[4])); - if (p.is<PMCTuple<6> >()) - return pmt_make_tuple(pmc_to_pmt(p.as<PMCTuple<6> >()[0]), pmc_to_pmt(p.as<PMCTuple<6> >()[1]), pmc_to_pmt(p.as<PMCTuple<6> >()[2]), pmc_to_pmt(p.as<PMCTuple<6> >()[3]), pmc_to_pmt(p.as<PMCTuple<6> >()[4]), pmc_to_pmt(p.as<PMCTuple<6> >()[5])); - if (p.is<PMCTuple<7> >()) - return pmt_make_tuple(pmc_to_pmt(p.as<PMCTuple<7> >()[0]), pmc_to_pmt(p.as<PMCTuple<7> >()[1]), pmc_to_pmt(p.as<PMCTuple<7> >()[2]), pmc_to_pmt(p.as<PMCTuple<7> >()[3]), pmc_to_pmt(p.as<PMCTuple<7> >()[4]), pmc_to_pmt(p.as<PMCTuple<7> >()[5]), pmc_to_pmt(p.as<PMCTuple<7> >()[6])); - if (p.is<PMCTuple<8> >()) - return pmt_make_tuple(pmc_to_pmt(p.as<PMCTuple<8> >()[0]), pmc_to_pmt(p.as<PMCTuple<8> >()[1]), pmc_to_pmt(p.as<PMCTuple<8> >()[2]), pmc_to_pmt(p.as<PMCTuple<8> >()[3]), pmc_to_pmt(p.as<PMCTuple<8> >()[4]), pmc_to_pmt(p.as<PMCTuple<8> >()[5]), pmc_to_pmt(p.as<PMCTuple<8> >()[6]), pmc_to_pmt(p.as<PMCTuple<8> >()[7])); - if (p.is<PMCTuple<9> >()) - return pmt_make_tuple(pmc_to_pmt(p.as<PMCTuple<9> >()[0]), pmc_to_pmt(p.as<PMCTuple<9> >()[1]), pmc_to_pmt(p.as<PMCTuple<9> >()[2]), pmc_to_pmt(p.as<PMCTuple<9> >()[3]), pmc_to_pmt(p.as<PMCTuple<9> >()[4]), pmc_to_pmt(p.as<PMCTuple<9> >()[5]), pmc_to_pmt(p.as<PMCTuple<9> >()[6]), pmc_to_pmt(p.as<PMCTuple<9> >()[7]), pmc_to_pmt(p.as<PMCTuple<9> >()[8])); - if (p.is<PMCTuple<10> >()) - return pmt_make_tuple(pmc_to_pmt(p.as<PMCTuple<10> >()[0]), pmc_to_pmt(p.as<PMCTuple<10> >()[1]), pmc_to_pmt(p.as<PMCTuple<10> >()[2]), pmc_to_pmt(p.as<PMCTuple<10> >()[3]), pmc_to_pmt(p.as<PMCTuple<10> >()[4]), pmc_to_pmt(p.as<PMCTuple<10> >()[5]), pmc_to_pmt(p.as<PMCTuple<10> >()[6]), pmc_to_pmt(p.as<PMCTuple<10> >()[7]), pmc_to_pmt(p.as<PMCTuple<10> >()[8]), pmc_to_pmt(p.as<PMCTuple<10> >()[9])); - - //vector container - if (p.is<PMCList>()) - { - const PMCList &l = p.as<PMCList>(); - pmt_t v = pmt_make_vector(l.size(), pmt_t()); - for (size_t i = 0; i < l.size(); i++) - { - pmt_vector_set(v, i, pmc_to_pmt(l[i])); - } - return v; - } - - //numeric arrays - #define decl_pmc_to_pmt_numeric_array(type, suffix) \ - if (p.is<std::vector<type> >()) return pmt_init_ ## suffix ## vector(p.as<std::vector<type> >().size(), &p.as<std::vector<type> >()[0]) - decl_pmc_to_pmt_numeric_array(uint8_t, u8); - decl_pmc_to_pmt_numeric_array(uint16_t, u16); - decl_pmc_to_pmt_numeric_array(uint32_t, u32); - decl_pmc_to_pmt_numeric_array(uint64_t, u64); - decl_pmc_to_pmt_numeric_array(int8_t, s8); - decl_pmc_to_pmt_numeric_array(int16_t, s16); - decl_pmc_to_pmt_numeric_array(int32_t, s32); - decl_pmc_to_pmt_numeric_array(int64_t, s64); - decl_pmc_to_pmt_numeric_array(float, f32); - decl_pmc_to_pmt_numeric_array(double, f64); - decl_pmc_to_pmt_numeric_array(std::complex<float>, c32); - decl_pmc_to_pmt_numeric_array(std::complex<double>, c64); - - //dictionary container - if (p.is<PMCDict>()) - { - const PMCDict &m = p.as<PMCDict>(); - pmt_t d = pmt_make_dict(); - BOOST_FOREACH(const PMCPair &pr, m) - { - d = pmt_dict_add(d, pmc_to_pmt(pr.first), pmc_to_pmt(pr.second)); - } - return d; - } - - //set container - if (p.is<PMCSet>()) - { - const PMCSet &s = p.as<PMCSet>(); - pmt_t l = PMT_NIL; - BOOST_FOREACH(const PMCC &elem, s) - { - l = pmt_list_add(l, pmc_to_pmt(elem)); - } - return l; - } - - //is it already a pmt? - if (p.is<pmt_t>()) return p.as<pmt_t>(); - - //backup plan... boost::any - return pmt_make_any(p); - -} - -inline PMCC pmt_to_pmc(const pmt_t &p) -{ - //if the container null? - if (not p) return PMC(); - - #define decl_pmt_to_pmc(check, conv) if (check(p)) return PMC::make(conv(p)) - - //bool - decl_pmt_to_pmc(pmt_is_bool, pmt_to_bool); - - //string - decl_pmt_to_pmc(pmt_is_symbol, pmt_symbol_to_string); - - //numeric types - decl_pmt_to_pmc(pmt_is_integer, pmt_to_long); - decl_pmt_to_pmc(pmt_is_uint64, pmt_to_uint64); - decl_pmt_to_pmc(pmt_is_real, pmt_to_double); - decl_pmt_to_pmc(pmt_is_complex, pmt_to_complex); - - //is it a boost any holding a PMCC? - if (pmt_is_any(p)) - { - const boost::any a = pmt_any_ref(p); - if (a.type() == typeid(PMCC)) return boost::any_cast<PMCC>(a); - } - - //pair container - if (pmt_is_pair(p)) - { - PMCPair pr(pmt_to_pmc(pmt_car(p)), pmt_to_pmc(pmt_cdr(p))); - return PMC::make(pr); - } - - //fucking tuples - #define decl_pmt_to_pmc_tuple(n) \ - if (pmt_is_tuple(p) and pmt_length(p) == n) \ - { \ - PMCTuple<n> t; \ - for (size_t i = 0; i < n; i++) t[i] = pmt_to_pmc(pmt_tuple_ref(p, i)); \ - return PMC::make(t); \ - } - decl_pmt_to_pmc_tuple(0); - decl_pmt_to_pmc_tuple(1); - decl_pmt_to_pmc_tuple(2); - decl_pmt_to_pmc_tuple(3); - decl_pmt_to_pmc_tuple(4); - decl_pmt_to_pmc_tuple(5); - decl_pmt_to_pmc_tuple(6); - decl_pmt_to_pmc_tuple(7); - decl_pmt_to_pmc_tuple(8); - decl_pmt_to_pmc_tuple(9); - decl_pmt_to_pmc_tuple(10); - - //vector container - if (pmt_is_vector(p)) - { - PMCList l(pmt_length(p)); - for (size_t i = 0; i < l.size(); i++) - { - l[i] = pmt_to_pmc(pmt_vector_ref(p, i)); - } - return PMC::make(l); - } - - //numeric arrays - #define decl_pmt_to_pmc_numeric_array(type, suffix) \ - if (pmt_is_ ## suffix ## vector(p)) \ - { \ - size_t n; const type* i = pmt_ ## suffix ## vector_elements(p, n); \ - return PMC::make(std::vector<type>(i, i+n)); \ - } - decl_pmt_to_pmc_numeric_array(uint8_t, u8); - decl_pmt_to_pmc_numeric_array(uint16_t, u16); - decl_pmt_to_pmc_numeric_array(uint32_t, u32); - decl_pmt_to_pmc_numeric_array(uint64_t, u64); - decl_pmt_to_pmc_numeric_array(int8_t, s8); - decl_pmt_to_pmc_numeric_array(int16_t, s16); - decl_pmt_to_pmc_numeric_array(int32_t, s32); - decl_pmt_to_pmc_numeric_array(int64_t, s64); - decl_pmt_to_pmc_numeric_array(float, f32); - decl_pmt_to_pmc_numeric_array(double, f64); - decl_pmt_to_pmc_numeric_array(std::complex<float>, c32); - decl_pmt_to_pmc_numeric_array(std::complex<double>, c64); - - //dictionary container - if (pmt_is_dict(p)) - { - PMCDict m; - pmt_t items = pmt_dict_items(p); - for (size_t i = 0; i < pmt_length(items); i++) - { - pmt_t item = pmt_nth(i, items); - PMCC key = pmt_to_pmc(pmt_car(item)); - PMCC val = pmt_to_pmc(pmt_cdr(item)); - m[key] = val; - } - return PMC::make(m); - } - - //set container - //FIXME no pmt_is_list... - - //backup plan... store the pmt - return PMC::make(p); -} - -} - -#endif /*INCLUDED_LIBGRAS_PMX_HELPER_HPP*/ |