summaryrefslogtreecommitdiff
path: root/src/core/common
diff options
context:
space:
mode:
authorAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-01-12 19:47:43 +0100
committerAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-01-12 19:47:43 +0100
commitfa387f9bef0d1a70a4b40c28c5cf9d661c421f73 (patch)
treec1857d0d7fc0a8db8c1f3a841913b1f496d8e661 /src/core/common
parent2b15fcab4b81fa8a854e724c48ee9c771fb126f8 (diff)
parent55f943ba1b31542157b984b5955b91261c280f46 (diff)
Merge branch 'master' of somweyr.de:ousia
Conflicts: application/src/core/model/Document.hpp
Diffstat (limited to 'src/core/common')
-rw-r--r--src/core/common/Argument.cpp4
-rw-r--r--src/core/common/Function.hpp23
-rw-r--r--src/core/common/Variant.cpp6
-rw-r--r--src/core/common/Variant.hpp15
-rw-r--r--src/core/common/VariantConverter.cpp28
5 files changed, 51 insertions, 25 deletions
diff --git a/src/core/common/Argument.cpp b/src/core/common/Argument.cpp
index 78dd4b4..3461868 100644
--- a/src/core/common/Argument.cpp
+++ b/src/core/common/Argument.cpp
@@ -91,13 +91,13 @@ Argument Argument::String(std::string name,
Argument Argument::Object(std::string name, const RttiType &type)
{
- return Argument(std::move(name), type, RttiTypes::None, nullptr, false);
+ return Argument(std::move(name), type, RttiTypes::None, Variant::fromObject(nullptr), false);
}
Argument Argument::Object(std::string name, const RttiType &type,
std::nullptr_t)
{
- return Argument(std::move(name), type, RttiTypes::None, nullptr, true);
+ return Argument(std::move(name), type, RttiTypes::None, Variant::fromObject(nullptr), true);
}
Argument Argument::Function(std::string name)
diff --git a/src/core/common/Function.hpp b/src/core/common/Function.hpp
index 04030c8..79ee6b9 100644
--- a/src/core/common/Function.hpp
+++ b/src/core/common/Function.hpp
@@ -42,7 +42,7 @@ namespace ousia {
*/
class Function {
protected:
- Function() {};
+ Function(){};
public:
Function(const Function &) = delete;
@@ -62,6 +62,23 @@ public:
};
/**
+ * Function doing nothing. Instances of this class are used as default values
+ * for instances of the Function class.
+ */
+class FunctionStub : public Function {
+public:
+ /**
+ * Constructor of the FunctionStub class.
+ */
+ FunctionStub() {}
+
+ Variant call(const Variant::arrayType &, void *) const override
+ {
+ return nullptr;
+ }
+};
+
+/**
* The Method class refers to a method in the C++ code, belonging to an object
* of a certain type T.
*
@@ -93,7 +110,7 @@ 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.
@@ -106,7 +123,7 @@ public:
void *thisRef = nullptr) const override
{
// Call the method
- return method(args, static_cast<T*>(thisRef));
+ return method(args, static_cast<T *>(thisRef));
}
};
}
diff --git a/src/core/common/Variant.cpp b/src/core/common/Variant.cpp
index e199bc7..81e6339 100644
--- a/src/core/common/Variant.cpp
+++ b/src/core/common/Variant.cpp
@@ -158,8 +158,10 @@ const RttiType& Variant::getRttiType() const
return RttiTypes::Map;
case VariantType::FUNCTION:
return RttiTypes::Function;
- case VariantType::OBJECT:
- return asObject()->type();
+ case VariantType::OBJECT: {
+ Variant::objectType o = asObject();
+ return (o == nullptr) ? RttiTypes::Nullptr : o->type();
+ }
}
return RttiTypes::None;
}
diff --git a/src/core/common/Variant.hpp b/src/core/common/Variant.hpp
index 27dfda8..e5bca4d 100644
--- a/src/core/common/Variant.hpp
+++ b/src/core/common/Variant.hpp
@@ -342,6 +342,19 @@ public:
Variant(mapType m) : ptrVal(nullptr) { setMap(std::move(m)); }
/**
+ * Named constructor for object values.
+ *
+ * @param o is an object that can be converted to a Rooted handle.
+ */
+ template<class T>
+ static Variant fromObject(T o)
+ {
+ Variant res;
+ res.setObject(o);
+ return res;
+ }
+
+ /**
* Named constructor for function values.
*
* @param f is a shared pointer pointing at the Function instance.
@@ -900,7 +913,7 @@ public:
* to a Rooted handle.
*/
template <class T>
- void setObject(Handle<T> o)
+ void setObject(T o)
{
destroy();
type = VariantType::OBJECT;
diff --git a/src/core/common/VariantConverter.cpp b/src/core/common/VariantConverter.cpp
index 1f5f514..1c23c43 100644
--- a/src/core/common/VariantConverter.cpp
+++ b/src/core/common/VariantConverter.cpp
@@ -243,8 +243,11 @@ bool VariantConverter::toString(Variant &var, Logger &logger, Mode mode)
// Print object address and type
Variant::objectType obj = var.asObject();
std::stringstream ss;
- ss << "<object " << obj.get() << " (" << obj->type().name << ")"
- << ">";
+ ss << "<object " << obj.get();
+ if (obj.get() != nullptr) {
+ ss << " (" << obj->type().name << ")";
+ }
+ ss << ">";
var = ss.str().c_str();
return true;
}
@@ -290,11 +293,7 @@ bool VariantConverter::toArray(Variant &var, const RttiType &innerType,
for (Variant &v : var.asArray()) {
res = convert(v, innerType, RttiTypes::None, logger, mode) & res;
}
-
- // Return on successful conversion, otherwise output the default value
- if (res) {
- return true;
- }
+ return res;
}
// No conversion possible, assign the default value and log an error
@@ -321,11 +320,7 @@ bool VariantConverter::toMap(Variant &var, const RttiType &innerType,
res = convert(e.second, innerType, RttiTypes::None, logger, mode) &
res;
}
-
- // Return on successful conversion, otherwise output the default value
- if (res) {
- return true;
- }
+ return res;
}
// No conversion possible, assign the default value and log an error
@@ -341,9 +336,8 @@ bool VariantConverter::toFunction(Variant &var, Logger &logger)
}
// No conversion possible, assign the default value and log an error
- logger.error(msgUnexpectedType(var, VariantType::MAP));
- var.setFunction(std::shared_ptr<Function>{new Method<void>([](
- const Variant::arrayType &args, void *thisRef) { return Variant{}; })});
+ logger.error(msgUnexpectedType(var, VariantType::FUNCTION));
+ var.setFunction(std::shared_ptr<Function>{new FunctionStub()});
return false;
}
@@ -383,7 +377,7 @@ bool VariantConverter::convert(Variant &var, const RttiType &type,
// obviously asked for a managed object.
if (!var.isObject()) {
logger.error(msgUnexpectedType(var, VariantType::OBJECT));
- var.setNull();
+ var.setObject(nullptr);
return false;
}
@@ -391,7 +385,7 @@ bool VariantConverter::convert(Variant &var, const RttiType &type,
if (!var.getRttiType().isa(type)) {
logger.error(std::string("Expected object of type ") + type.name +
" but got object of type " + var.getRttiType().name);
- var.setNull();
+ var.setObject(nullptr);
return false;
}
return true;