packages feed

casadi-bindings-control-2.0.0.1: cbits/marshal.hpp

#ifndef __MARSHAL_THEM_BINDINGS_H__
#define __MARSHAL_THEM_BINDINGS_H__

#include <iostream>

template<class T1, class T2>
class Marshaling {
public:
    static T1 marshal(T2 x){ return static_cast<T1>(x); }
};

template<class T>
class Marshaling< T, T* > {
public:
    static T marshal(T* x){ return *x; }
};

template<class T>
class Marshaling< T&, T* > {
public:
    static T& marshal(T* x){ return *x; }
};

template<class T>
class Marshaling< T const &, T* > {
public:
    static T const & marshal(T* x){ return *x; }
};

template<class T1, class T2>
class Marshaling< std::vector< T1 >, std::vector< T2 > > {
  public:
  static std::vector< T1 > marshal(const std::vector< T2 > inputs){
    std::vector< T1 > vec;
    for (unsigned int k=0; k<inputs.size(); k++){
        vec.push_back( Marshaling< T1, T2 >::marshal(inputs[k]) );
    }
    return vec;
  }
};


template<class T1, class T2>
class Marshaling< T1, T2* > {
  public:
  static T1 marshal(T2* x){
      return Marshaling<T1, T2>::marshal( *x );
  }
};


/* ---------------------------------------------------------- */
/* call "new" on a bunch of stuff  */
template<class T1, class T2>
class WrapReturn {
 public:
    static T1 wrapReturn(T2 x){ return x; }
};

template<class T1, class T2>
class WrapReturn< std::vector< T1 >, std::vector< T2 > > {
  public:
  static std::vector< T1 > wrapReturn(std::vector< T2 > inputs){
    std::vector< T1 > vec;
    for (unsigned int k=0; k<inputs.size(); k++){
        vec.push_back( WrapReturn< T1, T2 >::wrapReturn(inputs[k]) );
    }
    return vec;
  }
};

template<class T1, class T2>
class WrapReturn< T1*, T2 > {
  public:
  static T1* wrapReturn(T2 x){
      return new T1( WrapReturn<T1,T2>::wrapReturn(x) );
  }
};


// some examples:

//#include <vector>
//#include <string>
//class A{};
//
//void testWrapReturn(){
//    // make a bunch of dummy inputs
//    A a = A();
//    std::vector< A > v_a = std::vector< A >();
//    std::vector< A > const v_c_a = std::vector< A >();
//    std::vector< std::vector< A > > v_v_a = std::vector< std::vector< A > >();
//    std::vector< std::vector< int > > v_v_int = std::vector< std::vector< int > >();
//    //std::vector< A >* pv_a = new std::vector< A >();
//    //std::vector< A* > v_pa = std::vector< A* >();
//    //std::vector< std::vector< A* >* >* pv_pv_pa = new std::vector< std::vector< A* >* >();
//
//    // try to use wrapReturn on the dummy inputs
//    A* o0 __attribute__((unused)) = WrapReturn< A*, A>::wrapReturn(a);
//
//
//    std::vector< A* >* o4 __attribute__((unused)) =
//        WrapReturn< std::vector< A* >*, std::vector< A > >::wrapReturn(v_a);
//
//    std::vector< A* >* o7 __attribute__((unused)) =
//        WrapReturn< std::vector< A* >*, std::vector< A > >::wrapReturn(v_c_a);
//
//
//    std::vector< std::vector< A* >* >* o5 __attribute__((unused)) =
//        WrapReturn< std::vector< std::vector< A* >* >*,
//                    std::vector< std::vector< A > >
//                    >::wrapReturn(v_v_a);
//
//
//    std::vector< std::vector< int >* >* o6 __attribute__((unused)) =
//        WrapReturn< std::vector< std::vector< int >* >*,
//                    std::vector< std::vector< int > >
//                    >::wrapReturn(v_v_int);
//    //std::vector< A > o5 = WrapReturn< std::vector< A >, std::vector< A* > >::wrapReturn(v_pa);
//    //
//    //std::vector< A > o6 = WrapReturn< std::vector< A >, std::vector< A* >* >::wrapReturn(pv_pa);
//    //std::vector< std::vector< A > > o7 =
//    //    WrapReturn< std::vector< std::vector< A > >,
//    //                std::vector< std::vector< A* >* >*
//    //                >::wrapReturn(pv_pv_pa);
//}
//
//void testMarshal(){
//    // make a bunch of dummy inputs
//    A* pa = new A();
//    std::vector< A* >* pv_pa = new std::vector< A* >();
//    std::vector< A >* pv_a = new std::vector< A >();
//    std::vector< A* > v_pa = std::vector< A* >();
//    std::vector< std::vector< A* >* >* pv_pv_pa = new std::vector< std::vector< A* >* >();
//
//    // try to use marshal on the dummy inputs
//    A o0 __attribute__((unused)) = Marshaling< A, A*>::marshal(pa);
//    A& o1 __attribute__((unused)) = Marshaling< A&, A*>::marshal(pa);
//    A const & o2 __attribute__((unused)) = Marshaling< A const &, A*>::marshal(pa);
//
//    std::vector< A > o3 = Marshaling< std::vector< A >, std::vector< A >* >::marshal(pv_a);
//    std::vector< A* > o4 = Marshaling< std::vector< A* >, std::vector< A* >* >::marshal(pv_pa);
//    std::vector< A > o5 = Marshaling< std::vector< A >, std::vector< A* > >::marshal(v_pa);
//
//    std::vector< A > o6 = Marshaling< std::vector< A >, std::vector< A* >* >::marshal(pv_pa);
//    std::vector< std::vector< A > > o7 =
//        Marshaling< std::vector< std::vector< A > >,
//                    std::vector< std::vector< A* >* >*
//                    >::marshal(pv_pv_pa);
//}


//
//
//using namespace CasADi;
//using namespace std;
//
//// test program
//int main(){
//    string name = string("x");
//    cout << "calling ssym\n";
//    Matrix< SX >* x = CasADi__ssym_TIC(&name, 1);
//    cout << "ssym results: " << *x << "\n\n";
//
//    cout << "calling .data()\n";
//    vector< SX* >* vecsx =
//        CasADi__Matrix_CasADi__SX___data(x);
//    cout << "data results: " << *vecsx << "\n";
//    cout << "data results: " << *((*vecsx)[0]) << "\n";
//    cout << "size of data: " << vecsx->size() << "\n\n";
//
//    cout << "calling SXMatrix(vector<SX*>)\n";
//    Matrix< SX >* sxmat =
//        CasADi__Matrix_CasADi__SX___SXMatrix_TIC_TIC_TIC_TIC_TIC_TIC_TIC_TIC_TIC_TIC_TIC( vecsx );
//    cout << "calling SXMatrix.getDescription()\n";
//    cout << sxmat->getDescription() << "\n";
//    cout << "\n\n===== horray =====\n";
//    return 0;
//}


#endif // __MARSHAL_THEM_BINDINGS_H__