Skip to content

Commit

Permalink
Made SGString based on the SGReferencedData class
Browse files Browse the repository at this point in the history
  • Loading branch information
lisitsyn committed Sep 20, 2012
1 parent 7a4c62e commit a58fa6e
Show file tree
Hide file tree
Showing 21 changed files with 202 additions and 61 deletions.
2 changes: 2 additions & 0 deletions src/interfaces/csharp_modular/swig_typemaps.i
Expand Up @@ -198,6 +198,7 @@ TYPEMAP_SGMATRIX(float64_t, double, double)
len = cols;
max_len = shogun::CMath::max(len, max_len);

new (&strings[i]) SGString<SGTYPE>();
strings[i].slen = len;
strings[i].string = NULL;

Expand Down Expand Up @@ -296,6 +297,7 @@ TYPEMAP_STRINGFEATURES(float64_t, double, double)
len = strlen(str);
max_len = shogun::CMath::max(len, max_len);

new (&strings[i]) SGString<char>();
strings[i].slen = len;
strings[i].string = NULL;

Expand Down
4 changes: 2 additions & 2 deletions src/interfaces/java_modular/swig_typemaps.i
Expand Up @@ -651,6 +651,7 @@ TYPEMAP_SGMATRIX(float64_t, double, Double, jdouble, "toDoubleArray", "()[[D", "
len = JCALL1(GetArrayLength, jenv, jarr);
max_len = shogun::CMath::max(len, max_len);

new (&strings[i]) SGString<SGTYPE>();
strings[i].slen=len;
strings[i].string=NULL;

Expand Down Expand Up @@ -690,10 +691,8 @@ TYPEMAP_SGMATRIX(float64_t, double, Double, jdouble, "toDoubleArray", "()[[D", "
JCALL3(SetObjectArrayElement, jenv, res, i, jarr);
JCALL1(DeleteLocalRef, jenv, jarr);

SG_FREE(str[i].string);
SG_FREE(arr);
}
SG_FREE(str);
$result = res;
}

Expand Down Expand Up @@ -743,6 +742,7 @@ TYPEMAP_STRINGFEATURES(float64_t, double, Double, jdouble, "Doulbe[][]", "[[D")
max_len = shogun::CMath::max(len, max_len);
const char *str = (char *)JCALL2(GetStringUTFChars, jenv, jstr, 0);

new (&strings[i]) SGString<char>();
strings[i].slen = len;
strings[i].string = NULL;

Expand Down
2 changes: 2 additions & 0 deletions src/interfaces/lua_modular/swig_typemaps.i
Expand Up @@ -288,6 +288,7 @@ TYPEMAP_SGMATRIX(float64_t)
const char *str = lua_tolstring(L, -1, (size_t *)&len);
max_len = shogun::CMath::max(len, max_len);

new (&strings[i]) SGString<SGTYPE>();
strings[i].slen = len;
strings[i].string = NULL;

Expand All @@ -305,6 +306,7 @@ TYPEMAP_SGMATRIX(float64_t)
len = lua_objlen(L, -1);
max_len = shogun::CMath::max(len, max_len);

new (&strings[i]) SGString<SGTYPE>();
strings[i].slen=len;
strings[i].string=NULL;

Expand Down
8 changes: 5 additions & 3 deletions src/interfaces/matlab_static/MatlabInterface.cpp
Expand Up @@ -351,16 +351,17 @@ void CMatlabInterface::function_name(SGString<sg_type>*& strings, int32_t& num_s
num_str=mxGetNumberOfElements(mx_str); \
ASSERT(num_str>=1); \
\
strings=SG_MALLOC(SGString<sg_type>, num_str); \
for (int32_t i=0; i<num_str; i++) \
strings=SG_MALLOC(SGString<sg_type>, num_str); \
for (int32_t i=0; i<num_str; i++) \
{ \
new (&strings[i]) SGString<sg_type>(); \
mxArray* str=mxGetCell(mx_str, i); \
if (!str) \
SG_ERROR("argument empty"); \
if (!str || !mxIsClass(str, mx_type) || !mxGetM(str)==1) \
SG_ERROR("Expected String of type " error_string " as argument %d. M:%i N:%i\n", m_rhs_counter,mxGetM(str),mxGetN(str)); \
\
int32_t len=mxGetN(str); \
int32_t len=mxGetN(str); \
if (len>0) \
{ \
if_type* data=(if_type*) mxGetData(str); \
Expand Down Expand Up @@ -389,6 +390,7 @@ void CMatlabInterface::function_name(SGString<sg_type>*& strings, int32_t& num_s
\
for (int32_t i=0; i<num_str; i++) \
{ \
new (&strings[i]) SGString<sg_type>(); \
if (len>0) \
{ \
strings[i].slen=len; /* all must have same length in matlab */ \
Expand Down
2 changes: 2 additions & 0 deletions src/interfaces/octave_modular/swig_typemaps.i
Expand Up @@ -206,6 +206,7 @@ TYPEMAP_OUT_SGMATRIX(uint16NDArray, uint16_t, uint16_t, "Word")

for (int32_t i=0; i<num_strings; i++)
{
new (&strings[i]) SGString<sg_type>();
if (!c.elem(i).oct_type_check() || !c.elem(i).rows()==1)
{
/* SG_ERROR("Expected String of type " error_string " as argument %d.\n", m_rhs_counter);*/
Expand Down Expand Up @@ -243,6 +244,7 @@ TYPEMAP_OUT_SGMATRIX(uint16NDArray, uint16_t, uint16_t, "Word")

for (int32_t i=0; i<num_strings; i++)
{
new (&strings[i]) SGString<sg_type>();
if (len>0)
{
strings[i].slen=len; /* all must have same length in octave */
Expand Down
2 changes: 2 additions & 0 deletions src/interfaces/octave_static/OctaveInterface.cpp
Expand Up @@ -391,6 +391,7 @@ void COctaveInterface::function_name(SGString<sg_type>*& strings, int32_t& num_s
\
oct_type str=c.elem(i).oct_converter(); \
\
new (&strings[i]) SGString<sg_type>(); \
int32_t len=str.cols(); \
if (len>0) \
{ \
Expand Down Expand Up @@ -419,6 +420,7 @@ void COctaveInterface::function_name(SGString<sg_type>*& strings, int32_t& num_s
\
for (int32_t i=0; i<num_str; i++) \
{ \
new (&strings[i]) SGString<sg_type>(); \
if (len>0) \
{ \
strings[i].slen=len; /* all must have same length in octave */ \
Expand Down
5 changes: 3 additions & 2 deletions src/interfaces/python_modular/swig_typemaps.i
Expand Up @@ -371,6 +371,7 @@ static bool string_from_strpy(SGStringList<type>& sg_strings, PyObject* obj, int
int32_t max_len=0;
for (int32_t i=0; i<size; i++)
{
new (&strings[i]) SGString<type>();
PyObject *o = PyList_GetItem(list,i);
if (typecode == NPY_STRING || typecode == NPY_UNICODE)
{
Expand Down Expand Up @@ -404,7 +405,7 @@ static bool string_from_strpy(SGStringList<type>& sg_strings, PyObject* obj, int
PyErr_SetString(PyExc_TypeError, "all elements in list must be strings");

for (int32_t j=0; j<i; j++)
SG_FREE(strings[i].string);
strings[i].~SGString<type>();
SG_FREE(strings);
return false;
}
Expand Down Expand Up @@ -439,7 +440,7 @@ static bool string_from_strpy(SGStringList<type>& sg_strings, PyObject* obj, int
PyErr_SetString(PyExc_TypeError, "all elements in list must be of same array type");

for (int32_t j=0; j<i; j++)
SG_FREE(strings[i].string);
strings[i].~SGString<type>();
SG_FREE(strings);
return false;
}
Expand Down
10 changes: 7 additions & 3 deletions src/interfaces/python_static/PythonInterface.cpp
Expand Up @@ -379,6 +379,7 @@ void CPythonInterface::function_name(SGString<sg_type>*& strings, int32_t& num_s
\
for (int32_t i=0; i<num_str; i++) \
{ \
new (&strings[i]) SGString<sg_type>(); \
PyObject *o = PyList_GetItem((PyObject*) py_str,i); \
if (PyUnicode_Check(o)) \
{ \
Expand All @@ -398,8 +399,8 @@ void CPythonInterface::function_name(SGString<sg_type>*& strings, int32_t& num_s
} \
else \
{ \
for (int32_t j=0; j<i; j++) \
SG_FREE(strings[i].string); \
for (int32_t j=0; j<i; j++) \
strings[i].~SGString<sg_type>(); \
SG_FREE(strings); \
SG_ERROR("All elements in list must be strings, error in line %d.\n", i);\
} \
Expand All @@ -415,6 +416,7 @@ void CPythonInterface::function_name(SGString<sg_type>*& strings, int32_t& num_s
\
for (int32_t i=0; i<num_str; i++) \
{ \
new (&strings[i]) SGString<sg_type>(); \
if (len>0) \
{ \
strings[i].slen=len; /* all must have same length*/ \
Expand Down Expand Up @@ -460,6 +462,7 @@ void CPythonInterface::function_name(SGString<sg_type>*& strings, int32_t& num_s
\
for (int32_t i=0; i<num_str; i++) \
{ \
new (&strings[i]) SGString<sg_type>(); \
PyObject *o = PyList_GetItem((PyObject*) py_str,i); \
if (PyString_Check(o)) \
{ \
Expand All @@ -480,7 +483,7 @@ void CPythonInterface::function_name(SGString<sg_type>*& strings, int32_t& num_s
else \
{ \
for (int32_t j=0; j<i; j++) \
SG_FREE(strings[i].string); \
strings[i].~SGString<sg_type>(); \
SG_FREE(strings); \
SG_ERROR("All elements in list must be strings, error in line %d.\n", i);\
} \
Expand All @@ -496,6 +499,7 @@ void CPythonInterface::function_name(SGString<sg_type>*& strings, int32_t& num_s
\
for (int32_t i=0; i<num_str; i++) \
{ \
new (&strings[i]) SGString<sg_type>(); \
if (len>0) \
{ \
strings[i].slen=len; /* all must have same length*/ \
Expand Down
3 changes: 3 additions & 0 deletions src/interfaces/r_static/RInterface.cpp
Expand Up @@ -324,6 +324,7 @@ void CRInterface::get_string_list(SGString<char>*& strings, int32_t& num_str, in

for (int32_t i=0; i<num_str; i++)
{
new (&strings[i]) SGString<char>();
char* dst=SG_MALLOC(char, max_string_len+1);
for (int32_t j=0; j<max_string_len; j++)
{
Expand All @@ -346,6 +347,8 @@ void CRInterface::get_string_list(SGString<char>*& strings, int32_t& num_str, in

for (int32_t i=0; i<num_str; i++)
{
new (&strings[i]) SGString<char>();

SEXPREC* s= STRING_ELT(strs,i);
char* c= (char*) CHAR(s);
int32_t len=LENGTH(s);
Expand Down
65 changes: 52 additions & 13 deletions src/shogun/base/Parameter.cpp
Expand Up @@ -1855,43 +1855,82 @@ TParameter::new_cont(index_t new_len_y, index_t new_len_x)
switch (m_datatype.m_ptype) {
case PT_BOOL:
*(SGString<bool>**) m_parameter
= SG_MALLOC(SGString<bool>, new_length); break;
= SG_MALLOC(SGString<bool>, new_length);
for (int32_t i=0; i<new_length; i++)
new (((SGString<bool>**)m_parameter)[i]) SGString<bool>();
break;
case PT_CHAR:
*(SGString<char>**) m_parameter
= SG_MALLOC(SGString<char>, new_length); break;
= SG_MALLOC(SGString<char>, new_length);
for (int32_t i=0; i<new_length; i++)
new (((SGString<char>**)m_parameter)[i]) SGString<char>();
break;
case PT_INT8:
*(SGString<int8_t>**) m_parameter
= SG_MALLOC(SGString<int8_t>, new_length); break;
= SG_MALLOC(SGString<int8_t>, new_length);
for (int32_t i=0; i<new_length; i++)
new (((SGString<int8_t>**)m_parameter)[i]) SGString<int8_t>();
break;
case PT_UINT8:
*(SGString<uint8_t>**) m_parameter
= SG_MALLOC(SGString<uint8_t>, new_length); break;
= SG_MALLOC(SGString<uint8_t>, new_length);
for (int32_t i=0; i<new_length; i++)
new (((SGString<uint8_t>**)m_parameter)[i]) SGString<uint8_t>();
break;
case PT_INT16:
*(SGString<int16_t>**) m_parameter
= SG_MALLOC(SGString<int16_t>, new_length); break;
= SG_MALLOC(SGString<int16_t>, new_length);
for (int32_t i=0; i<new_length; i++)
new (((SGString<int16_t>**)m_parameter)[i]) SGString<int16_t>();
break;
case PT_UINT16:
*(SGString<uint16_t>**) m_parameter
= SG_MALLOC(SGString<uint16_t>, new_length); break;
= SG_MALLOC(SGString<uint16_t>, new_length);
for (int32_t i=0; i<new_length; i++)
new (((SGString<uint16_t>**)m_parameter)[i]) SGString<uint16_t>();
break;
case PT_INT32:
*(SGString<int32_t>**) m_parameter
= SG_MALLOC(SGString<int32_t>, new_length); break;
= SG_MALLOC(SGString<int32_t>, new_length);
for (int32_t i=0; i<new_length; i++)
new (((SGString<int32_t>**)m_parameter)[i]) SGString<int32_t>();
break;
case PT_UINT32:
*(SGString<uint32_t>**) m_parameter
= SG_MALLOC(SGString<uint32_t>, new_length); break;
= SG_MALLOC(SGString<uint32_t>, new_length);
for (int32_t i=0; i<new_length; i++)
new (((SGString<uint32_t>**)m_parameter)[i]) SGString<uint32_t>();
break;
case PT_INT64:
*(SGString<int64_t>**) m_parameter
= SG_MALLOC(SGString<int64_t>, new_length); break;
= SG_MALLOC(SGString<int64_t>, new_length);
for (int32_t i=0; i<new_length; i++)
new (((SGString<int64_t>**)m_parameter)[i]) SGString<int64_t>();
break;
case PT_UINT64:
*(SGString<uint64_t>**) m_parameter
= SG_MALLOC(SGString<uint64_t>, new_length); break;
= SG_MALLOC(SGString<uint64_t>, new_length);
for (int32_t i=0; i<new_length; i++)
new (((SGString<uint64_t>**)m_parameter)[i]) SGString<uint64_t>();
break;
case PT_FLOAT32:
*(SGString<float32_t>**) m_parameter
= SG_MALLOC(SGString<float32_t>, new_length); break;
= SG_MALLOC(SGString<float32_t>, new_length);
for (int32_t i=0; i<new_length; i++)
new (((SGString<float32_t>**)m_parameter)[i]) SGString<float32_t>();
break;
case PT_FLOAT64:
*(SGString<float64_t>**) m_parameter
= SG_MALLOC(SGString<float64_t>, new_length); break;
= SG_MALLOC(SGString<float64_t>, new_length);
for (int32_t i=0; i<new_length; i++)
new (((SGString<float64_t>**)m_parameter)[i]) SGString<float64_t>();
break;
case PT_FLOATMAX:
*(SGString<floatmax_t>**) m_parameter
= SG_MALLOC(SGString<floatmax_t>, new_length); break;
= SG_MALLOC(SGString<floatmax_t>, new_length);
for (int32_t i=0; i<new_length; i++)
new (((SGString<floatmax_t>**)m_parameter)[i]) SGString<floatmax_t>();
break;
case PT_SGOBJECT:
SG_SERROR("TParameter::new_cont(): Implementation "
"error: Could not allocate "
Expand Down
2 changes: 1 addition & 1 deletion src/shogun/base/SGObject.cpp
Expand Up @@ -1118,7 +1118,7 @@ SGStringList<char> CSGObject::get_modelsel_names()
char* name=m_model_selection_parameters->get_parameter(i)->m_name;
index_t len=strlen(name);
// +1 to have a zero terminated string
result.strings[i]=SGString<char>(name, len+1);
result.strings[i]=SGString<char>(name, len+1, false);

if (len>max_string_length)
max_string_length=len;
Expand Down

0 comments on commit a58fa6e

Please sign in to comment.