/* lightgbmlib.i */ %module lightgbmlib %ignore LGBM_BoosterSaveModelToString; %ignore LGBM_BoosterGetEvalNames; %{ /* Includes the header in the wrapper code */ #include "../include/LightGBM/export.h" #include "../include/LightGBM/utils/log.h" #include "../include/LightGBM/utils/common.h" #include "../include/LightGBM/c_api.h" %} /* header files */ %include "../include/LightGBM/export.h" %include "../include/LightGBM/c_api.h" %include "cpointer.i" %include "carrays.i" %inline %{ char * LGBM_BoosterSaveModelToStringSWIG(BoosterHandle handle, int start_iteration, int num_iteration, int64_t buffer_len, int64_t* out_len) { char* dst = new char[buffer_len]; int result = LGBM_BoosterSaveModelToString(handle, start_iteration, num_iteration, buffer_len, out_len, dst); // Reallocate to use larger length if (*out_len > buffer_len) { delete [] dst; int64_t realloc_len = *out_len; dst = new char[realloc_len]; result = LGBM_BoosterSaveModelToString(handle, start_iteration, num_iteration, realloc_len, out_len, dst); } if (result != 0) { return nullptr; } return dst; } char ** LGBM_BoosterGetEvalNamesSWIG(BoosterHandle handle, int eval_counts) { char** dst = new char*[eval_counts]; for (int i = 0; i < eval_counts; ++i) { dst[i] = new char[128]; } int result = LGBM_BoosterGetEvalNames(handle, &eval_counts, dst); if (result != 0) { return nullptr; } return dst; } %} %pointer_functions(int, intp) %pointer_functions(long, longp) %pointer_functions(double, doublep) %pointer_functions(float, floatp) %pointer_functions(int64_t, int64_tp) %pointer_functions(int32_t, int32_tp) %pointer_cast(int64_t *, long *, int64_t_to_long_ptr) %pointer_cast(int64_t *, double *, int64_t_to_double_ptr) %pointer_cast(int32_t *, int *, int32_t_to_int_ptr) %pointer_cast(long *, int64_t *, long_to_int64_t_ptr) %pointer_cast(double *, int64_t *, double_to_int64_t_ptr) %pointer_cast(double *, void *, double_to_voidp_ptr) %pointer_cast(int *, int32_t *, int_to_int32_t_ptr) %pointer_cast(float *, void *, float_to_voidp_ptr) %array_functions(double, doubleArray) %array_functions(float, floatArray) %array_functions(int, intArray) %array_functions(long, longArray) %array_functions(char *, stringArray) /* Custom pointer manipulation template */ %define %pointer_manipulation(TYPE,NAME) %{ static TYPE *new_##NAME() { %} %{ TYPE* NAME = new TYPE; return NAME; %} %{} static void delete_##NAME(TYPE *self) { %} %{ if (self) delete self; %} %{} %} TYPE *new_##NAME(); void delete_##NAME(TYPE *self); %enddef %define %pointer_dereference(TYPE,NAME) %{ static TYPE NAME ##_value(TYPE *self) { TYPE NAME = *self; return NAME; } %} TYPE NAME##_value(TYPE *self); %enddef %define %pointer_handle(TYPE,NAME) %{ static TYPE* NAME ##_handle() { %} %{ TYPE* NAME = new TYPE; *NAME = (TYPE)operator new(sizeof(int*)); return NAME; %} %{} %} TYPE *NAME##_handle(); %enddef %pointer_manipulation(void*, voidpp) /* Allow dereferencing of void** to void* */ %pointer_dereference(void*, voidpp) /* Allow retrieving handle to void** */ %pointer_handle(void*, voidpp)