summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/model/Typesystem.cpp60
-rw-r--r--src/core/model/Typesystem.hpp76
2 files changed, 119 insertions, 17 deletions
diff --git a/src/core/model/Typesystem.cpp b/src/core/model/Typesystem.cpp
index c10fc02..8a50492 100644
--- a/src/core/model/Typesystem.cpp
+++ b/src/core/model/Typesystem.cpp
@@ -383,11 +383,12 @@ bool StructType::doBuild(Variant &data, Logger &logger) const
bool StructType::doValidate(Logger &logger) const
{
return validateName(logger) &
- validateIsAcyclic("parent", [](const Node *thisRef) -> const Node * {
- return dynamic_cast<const StructType *>(
- thisRef)->parentStructure.get();
- },
- logger) &
+ validateIsAcyclic(
+ "parent", [](const Node *thisRef) -> const Node * {
+ return dynamic_cast<const StructType *>(thisRef)
+ ->parentStructure.get();
+ },
+ logger) &
continueValidationCheckDuplicates(attributes, logger);
}
@@ -524,6 +525,47 @@ bool ArrayType::doBuild(Variant &data, Logger &logger) const
return res;
}
+/* Class Constant */
+
+Constant::Constant(Manager &mgr, std::string name, Handle<Typesystem> system,
+ Handle<Type> type, Variant value)
+ : Node(mgr, std::move(name), system),
+ type(acquire(type)),
+ rawValue(std::move(value))
+{
+ ExceptionLogger logger;
+ initialize(logger);
+}
+
+Constant::Constant(Manager &mgr, std::string name, Handle<Typesystem> system,
+ Variant variant)
+ : Constant(mgr, name, system, new UnknownType(mgr), std::move(variant))
+{
+}
+
+void Constant::initialize(Logger &logger)
+{
+ value = rawValue;
+ type->build(value, logger);
+}
+
+Rooted<Type> Constant::getType() const { return type; }
+
+void Constant::setType(Handle<Type> type, Logger &logger)
+{
+ this->type = acquire(type);
+ initialize(logger);
+}
+
+const Variant &Constant::getValue() const { return value; }
+
+void Constant::setValue(Variant value, Logger &logger)
+{
+ this->rawValue = value;
+ this->value = std::move(value);
+ initialize(logger);
+}
+
/* Class Typesystem */
void Typesystem::doResolve(ResolutionState &state)
@@ -547,6 +589,14 @@ Rooted<StructType> Typesystem::createStructType(const std::string &name)
return structType;
}
+Rooted<Constant> Typesystem::createConstant(const std::string &name,
+ Variant value)
+{
+ Rooted<Constant> constant{new Constant(getManager(), name, this, value)};
+ addConstant(constant);
+ return constant;
+}
+
void Typesystem::referenceTypesystem(Handle<Typesystem> typesystem)
{
typesystems.push_back(typesystem);
diff --git a/src/core/model/Typesystem.hpp b/src/core/model/Typesystem.hpp
index e06938e..5b1254a 100644
--- a/src/core/model/Typesystem.hpp
+++ b/src/core/model/Typesystem.hpp
@@ -122,7 +122,8 @@ public:
*
* @return true if and only if the given Variant adheres to this Type.
*/
- bool isValid(Variant data, Logger &logger) const{
+ bool isValid(Variant data, Logger &logger) const
+ {
return build(data, logger);
}
@@ -899,10 +900,23 @@ private:
Owned<Type> type;
/**
+ * Value of the value before a proper type was set.
+ */
+ Variant rawValue;
+
+ /**
* Actual value of the constant.
*/
Variant value;
+ /**
+ * Reinitializes the value from the raw value with the current type.
+ *
+ * @param logger is the logger instance to which errors while building the
+ * value should be passed.
+ */
+ void initialize(Logger &logger);
+
public:
/**
* Constructor of the Constant node.
@@ -910,17 +924,24 @@ public:
* @param mgr is the Manager instance to be used for the Node.
* @param name is the name of the constant.
* @param system is the parent typesystem.
- * @param type is a reference at the actual type of the constant.
- * @param value is the actual value of the constant. The value must have
- * went through the "build" function of the type.
+ * @param type is the type of the constant.
+ * @param value is the value of the constant. Will be passed through the
+ * build function of the given type.
*/
Constant(Manager &mgr, std::string name, Handle<Typesystem> system,
- Handle<Type> type, Variant value)
- : Node(mgr, std::move(name), system),
- type(acquire(type)),
- value(std::move(value))
- {
- }
+ Handle<Type> type, Variant value);
+
+ /**
+ * Constructor of the Constant node without type and value. Will initialize
+ * the type with the an "UnknownType".
+ *
+ * @param mgr is the Manager instance to be used for the Node.
+ * @param name is the name of the constant.
+ * @param system is the parent typesystem.
+ * @param value is the value of the constant.
+ */
+ Constant(Manager &mgr, std::string name, Handle<Typesystem> system,
+ Variant value);
/**
* Returns a reference pointing at the Type instance describing the type
@@ -928,7 +949,18 @@ public:
*
* @return a Rooted handle pointing at the Type node of the constant.
*/
- Rooted<Type> getType() { return type; }
+ Rooted<Type> getType() const;
+
+ /**
+ * Sets the type of the constant to the given type. This will cause the raw
+ * value of the variant to be reparsed and any error to be logged in the
+ * given logger.
+ *
+ * @param type is the new type of the constant.
+ * @param logger is the logger instance to which errors that occur during
+ * reinterpretion of the value.
+ */
+ void setType(Handle<Type> type, Logger &logger);
/**
* Returns a reference pointing at the value of the constant. The value must
@@ -936,7 +968,17 @@ public:
*
* @return a const reference to the actual value of the constant.
*/
- const Variant &getValue() { return value; }
+ const Variant &getValue() const;
+
+ /**
+ * Sets the value of the constant. The value will be passed to the "build"
+ * function of the internal type.
+ *
+ * @param value is the value that should be set.
+ * @param logger is the logger that loggs error messages that occur during
+ * the conversion of the
+ */
+ void setValue(Variant value, Logger &logger);
};
/**
@@ -1002,6 +1044,16 @@ public:
Rooted<StructType> createStructType(const std::string &name);
/**
+ * Creates a new Constant instance with the given name. Adds the new
+ * Constant as member to the typesystem.
+ *
+ * @param name is the name of the constant that should be created.
+ * @param value is the value of the variant.
+ * @return the new Constant instance.
+ */
+ Rooted<Constant> createConstant(const std::string &name, Variant value);
+
+ /**
* Adds a reference to the given typesystem class.
*
* @param typesystem is the typesystem that should be added to the