diff --git a/src/shogun/base/Parameter.cpp b/src/shogun/base/Parameter.cpp index 7abd45d0be9..cd9211460ad 100644 --- a/src/shogun/base/Parameter.cpp +++ b/src/shogun/base/Parameter.cpp @@ -4016,7 +4016,12 @@ bool TParameter::copy(TParameter* target) { size_t num_bytes=*m_datatype.m_length_y * m_datatype.sizeof_stype(); SG_SDEBUG("allocating %d bytes memory for target vector\n", num_bytes); + *(char**)target->m_parameter=SG_MALLOC(char, num_bytes); + /* check whether ptype is SGOBJECT, if yes we need to initialize + the memory with NULL for the way copy_ptype handles it */ + if (m_datatype.m_ptype==PT_SGOBJECT) + memset(*(void**)target->m_parameter, 0, num_bytes); /* use length of source */ *target->m_datatype.m_length_y=*m_datatype.m_length_y; @@ -4074,12 +4079,18 @@ bool TParameter::copy(TParameter* target) else num_bytes=*m_datatype.m_length_y * (*m_datatype.m_length_x) * m_datatype.sizeof_stype(); + *(char**)target->m_parameter=SG_MALLOC(char, num_bytes); + /* check whether ptype is SGOBJECT, if yes we need to initialize + the memory with NULL for the way copy_ptype handles it */ + if (m_datatype.m_ptype==PT_SGOBJECT) + memset(*(void**)target->m_parameter, 0, num_bytes); + /* use length of source */ *target->m_datatype.m_length_y=*m_datatype.m_length_y; *target->m_datatype.m_length_x=*m_datatype.m_length_x; - + SG_SDEBUG("%d bytes are allocated\n", num_bytes); } diff --git a/tests/unit/CMakeLists.txt b/tests/unit/CMakeLists.txt index 194ab8cb728..39648ecc87c 100644 --- a/tests/unit/CMakeLists.txt +++ b/tests/unit/CMakeLists.txt @@ -24,6 +24,17 @@ ADD_CUSTOM_COMMAND(OUTPUT clone_unittest.cc COMMENT "Generating clone_unittest.cc") LIST(APPEND TEMPLATE_GENERATED_UNITTEST clone_unittest.cc) +ADD_CUSTOM_COMMAND(OUTPUT DynamicObjectArray_unittest.cc + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/base/clone_unittest.cc.py + ${CMAKE_CURRENT_SOURCE_DIR}/base/DynamicObjectArray_unittest.cc.jinja2 + DynamicObjectArray_unittest.cc + ${LIBSHOGUN_SRC_DIR}/base/class_list.cpp + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/base/clone_unittest.cc.py + ${CMAKE_CURRENT_SOURCE_DIR}/base/DynamicObjectArray_unittest.cc.jinja2 + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Generating DynamicObjectArray_unittest.cc") +LIST(APPEND TEMPLATE_GENERATED_UNITTEST DynamicObjectArray_unittest.cc) + ADD_CUSTOM_COMMAND(OUTPUT SerializationAscii_unittest.cc COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/base/clone_unittest.cc.py ${CMAKE_CURRENT_SOURCE_DIR}/io/SerializationAscii_unittest.cc.jinja2 diff --git a/tests/unit/base/DynamicObjectArray_unittest.cc.jinja2 b/tests/unit/base/DynamicObjectArray_unittest.cc.jinja2 new file mode 100644 index 00000000000..fe4259250a3 --- /dev/null +++ b/tests/unit/base/DynamicObjectArray_unittest.cc.jinja2 @@ -0,0 +1,65 @@ +/* + * THIS IS A GENERATED FILE! DO NOT CHANGE THIS FILE! CHANGE THE + * CORRESPONDING TEMPLATE FILE, PLEASE! + */ + +#include +#include +#include + +using namespace shogun; + +{% set ignores = ['Set', 'ParseBuffer', 'TreeMachine'] %} + +{% for class in classes %} +{% if class in ignores or class.startswith('GUI') %} +TEST(DynamicObjectArray,DISABLED_array_{{class}}_clone_equals) +{% else %} +TEST(DynamicObjectArray,array_{{class}}_clone_equals) +{% endif %} +{ + const char* class_name="{{class}}"; + + /* create source array and fill with {{class}} type objects */ + index_t length=2; + CDynamicObjectArray* array1=new CDynamicObjectArray(); + for (index_t i=0; ipush_back(new_sgserializable(class_name, PT_NOT_GENERIC)); + + /* test for clone and equals */ + CDynamicObjectArray* array2=dynamic_cast(array1->clone()); + EXPECT_TRUE(array1->equals(array2)); + + /* cleanup */ + SG_UNREF(array1); + SG_UNREF(array2); +} +{% endfor %} + +{% for class in template_classes %} +{% for type in types %} +{% if class in ignores %} +TEST(DynamicObjectArray,DISABLED_array_{{class}}_{{type}}_clone_equals) +{% else %} +TEST(DynamicObjectArray,array_{{class}}_{{type}}_clone_equals) +{% endif %} +{ + const char* class_name="{{class}}"; + + /* create source array and fill with {{class}} type objects */ + index_t length=2; + CDynamicObjectArray* array1=new CDynamicObjectArray(); + for (index_t i=0; ipush_back(new_sgserializable(class_name, {{type}})); + + /* test for clone and equals */ + CDynamicObjectArray* array2=dynamic_cast(array1->clone()); + EXPECT_TRUE(array1->equals(array2)); + + /* cleanup */ + SG_UNREF(array1); + SG_UNREF(array2); +} +{% endfor %} +{% endfor %} +