summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2014-12-21 23:46:14 +0100
committerAndreas Stöckel <andreas@somweyr.de>2014-12-21 23:46:14 +0100
commit9c02d6698f852d94736ce3a88e593bf45d22361d (patch)
treea6c8fbe7e65278fc958d05ded8a6d2c9edf63426 /src/core
parent1a7c77c9175c4e9ed5c554b1986d4f2bf8b18197 (diff)
allowing to store Function objects in Variants, added simple unit test for the Method class
Diffstat (limited to 'src/core')
-rw-r--r--src/core/common/Function.hpp24
-rw-r--r--src/core/common/Variant.cpp14
-rw-r--r--src/core/common/Variant.hpp46
3 files changed, 23 insertions, 61 deletions
diff --git a/src/core/common/Function.hpp b/src/core/common/Function.hpp
index 8113c9d..04030c8 100644
--- a/src/core/common/Function.hpp
+++ b/src/core/common/Function.hpp
@@ -36,15 +36,18 @@ namespace ousia {
/**
* The Function interface defines all the methods needed to represent a
- * generic function. Function objects can be called using the "call" function in
+ * generic function. Function objects can be called using the "call" function in
* which an array of Variant is supplied to the function and a Variant is
* returned to the caller.
*/
class Function {
+protected:
+ Function() {};
+
public:
- Function(const Function&) = delete;
- Function(Function&&) = delete;
- virtual ~Function() {};
+ Function(const Function &) = delete;
+ Function(Function &&) = delete;
+ virtual ~Function(){};
/**
* Abstract function which is meant to call the underlying function (be it
@@ -90,29 +93,22 @@ public:
*
* @param method is a pointer at the C++ function that should be called.
*/
- Method(Callback method) : method(method){};
+ Method(Callback method) : method(method) {};
/**
* Calls the underlying method.
*
- * @param args is a vector containing all arguments that shouild be passed
+ * @param args is a vector containing all arguments that should be passed
* to the method.
* @return a Variant containing the return value.
*/
Variant call(const Variant::arrayType &args = Variant::arrayType{},
void *thisRef = nullptr) const override
{
- // Dynamically cast thisRef to the given type
- T *tRef = dynamic_cast<T>(thisRef);
-
- // Make sure the cast is successfull
- assert(tRef != nullptr);
-
// Call the method
- return method(args, tRef);
+ return method(args, static_cast<T*>(thisRef));
}
};
-
}
#endif /* _OUSIA_FUNCTION_HPP_ */
diff --git a/src/core/common/Variant.cpp b/src/core/common/Variant.cpp
index 8036bcd..0e69038 100644
--- a/src/core/common/Variant.cpp
+++ b/src/core/common/Variant.cpp
@@ -21,7 +21,6 @@
#include <core/managed/Managed.hpp>
#include "Utils.hpp"
-#include "Function.hpp"
#include "Variant.hpp"
namespace ousia {
@@ -40,19 +39,6 @@ Variant::TypeException::TypeException(Type actualType, Type requestedType)
/* Class Variant */
-void Variant::copyObject(objectType o)
-{
- Managed *managed = static_cast<objectType>(o);
- managed->getManager().addRef(o, nullptr);
- ptrVal = managed;
-}
-
-void Variant::destroyObject()
-{
- Managed *managed = static_cast<objectType>(ptrVal);
- managed->getManager().deleteRef(managed, nullptr);
-}
-
const char *Variant::getTypeName(Type type)
{
switch (type) {
diff --git a/src/core/common/Variant.hpp b/src/core/common/Variant.hpp
index 52db864..fe0bbb1 100644
--- a/src/core/common/Variant.hpp
+++ b/src/core/common/Variant.hpp
@@ -40,13 +40,12 @@
// http://nikic.github.io/2012/02/02/Pointer-magic-for-efficient-dynamic-value-representations.html
// later (will allow to use 8 bytes for a variant)
+#include <core/managed/Managed.hpp>
+
#include "Exceptions.hpp"
namespace ousia {
-/* Forward declaration of the Managed class */
-class Managed;
-
/* Forward declaration of the Function class */
class Function;
@@ -109,7 +108,7 @@ public:
using stringType = std::string;
using arrayType = std::vector<Variant>;
using mapType = std::map<std::string, Variant>;
- using objectType = Managed *;
+ using objectType = Rooted<Managed>;
using functionType = std::shared_ptr<Function>;
private:
@@ -157,21 +156,6 @@ private:
}
/**
- * Function used to copy a reference to a managed object (not defined in the
- * header to prevent an explicit reference to the Managed type).
- *
- * @param o is the pointer at the object that should be copied.
- */
- void copyObject(objectType o);
-
- /**
- * Function used internally to destroy a reference to a managed object (not
- * defined in the header to prevent an explicit reference to the Managed
- * type).
- */
- void destroyObject();
-
- /**
* Used internally to assign the value of another Variant instance to this
* instance.
*
@@ -203,7 +187,7 @@ private:
ptrVal = new mapType(v.asMap());
break;
case Type::OBJECT:
- copyObject(v.asObject());
+ ptrVal = new objectType(v.asObject());
break;
case Type::FUNCTION:
ptrVal = new functionType(v.asFunction());
@@ -262,7 +246,7 @@ private:
delete static_cast<mapType *>(ptrVal);
break;
case Type::OBJECT:
- destroyObject();
+ delete static_cast<objectType *>(ptrVal);
break;
case Type::FUNCTION:
delete static_cast<functionType *>(ptrVal);
@@ -358,7 +342,8 @@ public:
*
* @param o is a reference to the object.
*/
- Variant(objectType o) : ptrVal(nullptr) { setObject(o); }
+ template <class T>
+ Variant(Handle<T> o) : ptrVal(nullptr) { setObject(o); }
/**
* Copy assignment operator.
@@ -611,10 +596,7 @@ public:
*/
objectType asObject()
{
- if (isObject()) {
- return static_cast<objectType>(ptrVal);
- }
- throw TypeException(getType(), Type::OBJECT);
+ return asObj<objectType>(Type::OBJECT);
}
/**
@@ -626,10 +608,7 @@ public:
*/
const objectType asObject() const
{
- if (isObject()) {
- return static_cast<objectType>(ptrVal);
- }
- throw TypeException(getType(), Type::OBJECT);
+ return asObj<objectType>(Type::OBJECT);
}
/**
@@ -789,11 +768,12 @@ public:
* Sets the variant to the given managed object. The variant is equivalent
* to a Rooted handle.
*/
- void setObject(objectType o)
+ template<class T>
+ void setObject(Handle<T> o)
{
destroy();
type = Type::OBJECT;
- copyObject(o);
+ ptrVal = new objectType(o);
}
/**
@@ -866,7 +846,7 @@ public:
case Type::MAP:
return lhs.asMap() < rhs.asMap();
case Type::OBJECT:
- return lhs.asObject() < rhs.asObject();
+ return lhs.asObject().get() < rhs.asObject().get();
case Type::FUNCTION:
return lhs.asFunction() < rhs.asFunction();
}