summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBenjamin Paassen <bpaassen@techfak.uni-bielefeld.de>2014-12-19 00:27:27 +0100
committerBenjamin Paassen <bpaassen@techfak.uni-bielefeld.de>2014-12-19 00:27:27 +0100
commitd4e06ab60b382581887290876337976a48f50f71 (patch)
treec27ff4b323a5816f1a147cdab1b9bb54e9230941 /src
parent776fbb600da5fb5268e1b803e74fe7f8b0ea2746 (diff)
added doPrepare method for StructType and made doPrepare as well as create const.
Diffstat (limited to 'src')
-rw-r--r--src/core/model/Typesystem.hpp78
1 files changed, 57 insertions, 21 deletions
diff --git a/src/core/model/Typesystem.hpp b/src/core/model/Typesystem.hpp
index 90154ce..20c6e8b 100644
--- a/src/core/model/Typesystem.hpp
+++ b/src/core/model/Typesystem.hpp
@@ -50,7 +50,7 @@ protected:
{
}
- virtual bool doPrepare(Variant &var, Logger &log) = 0;
+ virtual bool doPrepare(Variant &var, Logger &log) const = 0;
public:
/**
@@ -65,12 +65,12 @@ public:
/**
* TODO: DOC
*/
- virtual Variant create() = 0;
+ virtual Variant create() const = 0;
/**
* TODO: DOC
*/
- bool prepare(Variant &var, Logger &log)
+ bool prepare(Variant &var, Logger &log) const
{
try {
return doPrepare(var, log);
@@ -88,7 +88,7 @@ protected:
/**
* TODO: DOC
*/
- bool doPrepare(Variant &var, Logger &log) override
+ bool doPrepare(Variant &var, Logger &log) const override
{
if (!var.isPrimitive()) {
throw LoggableException{"Expected a string or primitive input."};
@@ -114,7 +114,7 @@ public:
/**
* TODO: DOC
*/
- Variant create() override { return Variant{""}; }
+ Variant create() const override { return Variant{""}; }
};
class IntType : public Type {
@@ -122,7 +122,7 @@ protected:
/**
* TODO: DOC
*/
- bool doPrepare(Variant &var, Logger &log) override
+ bool doPrepare(Variant &var, Logger &log) const override
{
if (!var.isInt()) {
throw LoggableException{"Expected an integer value."};
@@ -142,7 +142,7 @@ public:
/**
* TODO: DOC
*/
- Variant create() override { return Variant{0}; }
+ Variant create() const override { return Variant{0}; }
};
class DoubleType : public Type {
@@ -150,7 +150,7 @@ protected:
/**
* TODO: DOC
*/
- bool doPrepare(Variant &var, Logger &log) override
+ bool doPrepare(Variant &var, Logger &log) const override
{
if (!var.isInt() && !var.isDouble()) {
throw LoggableException{"Expected a double value."};
@@ -171,7 +171,7 @@ public:
/**
* TODO: DOC
*/
- Variant create() override { return Variant{0.}; }
+ Variant create() const override { return Variant{0.}; }
};
class UnknownType : public Type {
@@ -179,7 +179,7 @@ protected:
/**
* TODO: DOC
*/
- bool doPrepare(Variant &var, Logger &log) override { return true; }
+ bool doPrepare(Variant &var, Logger &log) const override { return true; }
public:
/**
@@ -193,7 +193,7 @@ public:
/**
* TODO: DOC
*/
- Variant create() override { return Variant{nullptr}; }
+ Variant create() const override { return Variant{nullptr}; }
};
class BoolType : public Type {
@@ -201,7 +201,7 @@ protected:
/**
* TODO: DOC
*/
- bool doPrepare(Variant &var, Logger &log) override
+ bool doPrepare(Variant &var, Logger &log) const override
{
if (!var.isBool()) {
throw LoggableException("Expected boolean value!");
@@ -221,7 +221,7 @@ public:
/**
* TODO: DOC
*/
- Variant create() override { return Variant{false}; }
+ Variant create() const override { return Variant{false}; }
};
class EnumerationType : public Type {
@@ -232,7 +232,7 @@ protected:
/**
* TODO: DOC
*/
- bool doPrepare(Variant &var, Logger &log) override
+ bool doPrepare(Variant &var, Logger &log) const override
{
if (var.isInt()) {
int i = var.asInt();
@@ -275,7 +275,7 @@ public:
/**
* TODO: DOC
*/
- Variant create() override { return Variant{0}; }
+ Variant create() const override { return Variant{0}; }
};
class StructType : public Type {
@@ -296,7 +296,45 @@ public:
}
};
-private:
+protected:
+ /**
+ * TODO: DOC
+ */
+ bool doPrepare(Variant &var, Logger &log) const override
+ {
+ // If we already have an array, we just check that.
+ if(var.isArray()){
+ auto arr = var.asArray();
+ for(size_t a = 0; a < attrs.size(); a++){
+ if(!attrs[a].type->prepare(arr[a], log)){
+ return false;
+ }
+ }
+ return true;
+ }
+ // Otherwise we expect a map.
+ if (!var.isMap()) {
+ throw LoggableException("Expected map!");
+ }
+ auto &map = var.asMap();
+ // We transform the map into an array with the correct values at the
+ // correct places.
+ std::vector<Variant> vec;
+ for (auto &a : attrs) {
+ auto it = map.find(a.name);
+ // we use the default if nothing is set.
+ if (it == map.end() || !a.type->prepare(it->second, log)) {
+ log.note(std::string("Using default value for ") + a.name);
+ vec.push_back(a.defaultValue);
+ } else{
+ vec.push_back(it->second);
+ }
+ }
+ var = Variant(vec);
+ return true;
+ }
+
+public:
std::vector<AttributeDescriptor> attrs;
StructType(Manager &mgr, std::string name, Handle<Typesystem> system,
@@ -305,15 +343,13 @@ private:
attrs(std::move(attrs))
{
}
-
-public:
// TODO
// static StructType createValidated(
// Manager &mgr, std::string name, Handle<Typesystem> system,
// Handle<StructType> parent,
// const std::vector<AttributeDescriptor> &attrs, Logger &logger);
- Variant create() override { return Variant{Variant::arrayType{}}; }
+ Variant create() const override { return Variant{Variant::arrayType{}}; }
};
class ArrayType : public Type {
@@ -324,7 +360,7 @@ protected:
/**
* TODO: DOC
*/
- bool doPrepare(Variant &var, Logger &log) override
+ bool doPrepare(Variant &var, Logger &log) const override
{
if (!var.isArray()) {
throw LoggableException("Expected array!");
@@ -353,7 +389,7 @@ public:
/**
* TODO: DOC
*/
- Variant create() override { return Variant{Variant::arrayType{}}; }
+ Variant create() const override { return Variant{Variant::arrayType{}}; }
Rooted<Type> getType() { return innerType; }
};