Skip to content

Commit

Permalink
clean up object type dispatcher for ::put
Browse files Browse the repository at this point in the history
  • Loading branch information
karlnapf committed Feb 28, 2018
1 parent 778557b commit 5d3eda6
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 17 deletions.
23 changes: 6 additions & 17 deletions src/shogun/base/SGObject.cpp
Expand Up @@ -1030,24 +1030,13 @@ void CSGObject::put(const std::string& name, CSGObject* value)
{
REQUIRE(value, "Cannot set %s::%s, no object provided.\n", get_name(), name.c_str());

if (put_sgobject_type_dispatcher<CKernel>(name, value))
return;
if (put_sgobject_type_dispatcher<CDistance>(name, value))
return;

if (dynamic_cast<CKernel*>(value))
put(Tag<CKernel*>(name), (CKernel*) value);
else if (dynamic_cast<CDistance*>(value))
{
if (has<CDistance*>(name))
{
SG_REF(value);
CDistance* old = get<CDistance*>(name);
SG_UNREF(old);
}
put(Tag<CDistance*>(name), (CDistance*) value);
}
else
{
SG_WARNING("Could not match %s with any base-type when putting %s::%s, trying as SGObject.\n",value->get_name(),get_name(), name.c_str());
put(Tag<CSGObject*>(name), value);
}
SG_WARNING("Could not match %s with any base-type when putting %s::%s, trying as SGObject.\n",value->get_name(),get_name(), name.c_str());
put(Tag<CSGObject*>(name), value);
}

namespace shogun
Expand Down
19 changes: 19 additions & 0 deletions src/shogun/base/SGObject.h
Expand Up @@ -369,6 +369,25 @@ class CSGObject
}
}

#ifndef SWIG
template <typename T>
bool put_sgobject_type_dispatcher(const std::string& name, CSGObject* value)
{
if (dynamic_cast<T*>(value))
{
if (has<T*>(name))
{
SG_REF(value);
T* old = get<T*>(name);
SG_UNREF(old);
}
put(Tag<T*>(name), (T*) value);
return true;
}
return false;
}
#endif // SWIG

/** Untyped setter for an object class parameter, identified by a name.
* Will attempt to convert passed object to appropriate type.
*
Expand Down

0 comments on commit 5d3eda6

Please sign in to comment.