Add finalizers to mlpack objects.

This commit is contained in:
Ryan Curtin
2020-12-08 19:55:27 -05:00
parent fdf8958116
commit 107cb48d2f
3 changed files with 35 additions and 3 deletions
+10 -1
View File
@@ -32,8 +32,17 @@ function(append_type TYPES_FILE PROGRAM_NAME PROGRAM_MAIN_FILE)
# function.
file(APPEND
"${TYPES_FILE}"
"struct ${MODEL_SAFE_TYPE}\n"
"mutable struct ${MODEL_SAFE_TYPE}\n"
" ptr::Ptr{Nothing}\n"
"\n"
" # Construct object and set finalizer to free memory.\n"
" function ${MODEL_SAFE_TYPE}(ptr::Ptr{Nothing})::${MODEL_SAFE_TYPE}\n"
" result = new(ptr)\n"
" finalizer(\n"
" x -> _Internal.${PROGRAM_NAME}_internal.Delete${MODEL_SAFE_TYPE}(x.ptr),\n"
" result)\n"
" return result\n"
" end\n"
"end\n"
"\n")
endif ()
+9
View File
@@ -29,6 +29,8 @@ if (${NUM_MODEL_TYPES} GREATER 0)
void* IO_GetParam${MODEL_SAFE_TYPE}Ptr(const char* paramName);
// Set the pointer to a ${MODEL_TYPE} parameter.
void IO_SetParam${MODEL_SAFE_TYPE}Ptr(const char* paramName, void* ptr);
// Delete a ${MODEL_TYPE} pointer.
void Delete${MODEL_SAFE_TYPE}Ptr(void* ptr);
// Serialize a ${MODEL_TYPE} pointer.
char* Serialize${MODEL_SAFE_TYPE}Ptr(void* ptr, size_t* length);
// Deserialize a ${MODEL_TYPE} pointer.
@@ -50,6 +52,13 @@ void IO_SetParam${MODEL_SAFE_TYPE}Ptr(const char* paramName, void* ptr)
IO::SetPassed(paramName);
}
// Delete a ${MODEL_TYPE} pointer.
void Delete${MODEL_SAFE_TYPE}Ptr(void* ptr)
{
${MODEL_TYPE}* modelPtr = (${MODEL_TYPE}*) ptr;
delete modelPtr;
}
// Serialize a ${MODEL_TYPE} pointer.
char* Serialize${MODEL_SAFE_TYPE}Ptr(void* ptr, size_t* length)
{
+16 -2
View File
@@ -59,15 +59,20 @@ void PrintParamDefn(
// import ...<Type>
//
// function IOGetParam<Type>(paramName::String)
// <Type>(ccall((:IOGetParam<Type>Ptr, <programName>Library),
// <Type>(ccall((:IO_GetParam<Type>Ptr, <programName>Library),
// Ptr{Nothing}, (Cstring,), paramName))
// end
//
// function IOSetParam<Type>(paramName::String, model::<Type>)
// ccall((:IOSetParam<Type>Ptr, <programName>Library), Nothing,
// ccall((:IO_SetParam<Type>Ptr, <programName>Library), Nothing,
// (Cstring, Ptr{Nothing}), paramName, model.ptr)
// end
//
// function Delete<Type>(ptr::Ptr{Nothing})
// ccall((:Delete<Type>Ptr, <programName>Library), Nothing,
// (Ptr{Nothing},), ptr)
// end
//
// function serialize<Type>(stream::IO, model::<Type>)
// buf_len = UInt[0]
// buffer = ccall((:Serialize<Type>Ptr, <programName>Library),
@@ -111,6 +116,15 @@ void PrintParamDefn(
std::cout << "end" << std::endl;
std::cout << std::endl;
// Next, Delete<Type>().
std::cout << "# Delete an instantiated model pointer." << std::endl;
std::cout << "function Delete" << type << "(ptr::Ptr{Nothing})"
<< std::endl;
std::cout << " ccall((:Delete" << type << "Ptr, " << programName
<< "Library), Nothing, (Ptr{Nothing},), ptr)" << std::endl;
std::cout << "end" << std::endl;
std::cout << std::endl;
// Now the serialization functionality.
std::cout << "# Serialize a model to the given stream." << std::endl;
std::cout << "function serialize" << type << "(stream::IO, model::" << type