// The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
/*
    This mex file will create a MATLAB function called example_mex_class.  If you call it
    with no arguments it will output the MATLAB .m code to create a MATLAB wrapper class.
    Paste that code into a .m file.  Then you will be able to work with this C++ class
    directly in MATLAB.
*/

#include <iostream>
#include <dlib/matrix.h>


using namespace std;
using namespace dlib;

class example_class 
{
public:

    // The class must have a default constructor.  It's also the only kind of constructor
    // you can call from MATLAB.
    example_class()
    {
        xx.set_size(3,2);
        xx = 1;
    }

    // The rest of the member functions that you want to bind have to return void and
    // generally have the same syntax limitations as regular mex funcitons.
    void do_stuff(const matrix_colmajor& x)
    {
        cout << "in do_stuff" << endl;
        cout << x << endl;
        xx = x;
    }

    void do_other_stuff(int x)
    {
        cout << "in do_other_stuff" << endl;
        cout << "x: " << x << endl;
    }

    void print_state()
    {
        cout << xx << endl;
    }

    // saveobj() and load_obj() are special functions. If you provide these then you will
    // be able to save() and load() your objects using MATLAB's built in object
    // serialization.
    void saveobj(matrix_colmajor& state)
    {
        // save this object's state to state.
        state = xx;
    }
    void load_obj(const matrix_colmajor& state)
    {
        xx = state;
    }

private:
    matrix_colmajor xx;
};

// Just tell the mex wrapper the name of your class and list the methods you want to bind.
#define MEX_CLASS_NAME example_class 
#define MEX_CLASS_METHODS do_stuff, do_other_stuff, print_state, saveobj, load_obj


#include "mex_wrapper.cpp"