packages feed

casadi-bindings-internal-0.1: cbits/callback.cpp

#include <iostream>
#include "casadi/core/casadi.hpp"
#include "casadi/core/function/custom_function.hpp"
#include "casadi/core/functor_internal.hpp"

#include "HsFFI.h"

using namespace std;
using namespace casadi;

extern "C" {
typedef int (*hs_callback_t)(Function &f);
}

namespace casadi {
  class FunctorHaskellInternal {
    public:
      FunctorHaskellInternal(hs_callback_t hscb)
      {
          hs_callback = hscb;
      }
      ~FunctorHaskellInternal() {
          // free the haskell FunPtr
          hs_free_fun_ptr(HsFunPtr(hs_callback));
      }
    protected:
      hs_callback_t hs_callback;
  };

  class CallbackHaskellInternal : public CallbackInternal, FunctorHaskellInternal {
    friend class CallbackHaskell;

      CallbackHaskellInternal(hs_callback_t hscb) : FunctorHaskellInternal(hscb) {}
    virtual int call(Function& fcn, void* user_data);
    virtual CallbackHaskellInternal* clone() const { return new CallbackHaskellInternal(hs_callback); }
  };

  class CallbackHaskell : public Callback {
    public:
      CallbackHaskell(hs_callback_t hscb) { assignNode(new CallbackHaskellInternal(hscb)); }
  };

  int CallbackHaskellInternal::call(Function& fcn, void* user_data) {
      return hs_callback(fcn);
  }
}

extern "C" CallbackHaskell * new_callback_haskell(hs_callback_t hs_callback);
CallbackHaskell * new_callback_haskell(hs_callback_t hs_callback){
    return new CallbackHaskell(hs_callback);
}

extern "C" void delete_callback_haskell(casadi::CallbackHaskell* obj);
void delete_callback_haskell(casadi::CallbackHaskell* obj){
    delete obj;
}