summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt2
-rw-r--r--src/core/model/Cardinality.hpp181
-rw-r--r--src/core/model/Domain.hpp6
-rw-r--r--test/core/model/CardinalityTest.cpp112
4 files changed, 4 insertions, 297 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4469db2..cddf159 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -114,7 +114,6 @@ ADD_LIBRARY(ousia_core
src/core/managed/Managed
src/core/managed/ManagedType
src/core/managed/Manager
- src/core/model/Cardinality
src/core/model/Document
src/core/model/Domain
src/core/model/Typesystem
@@ -185,7 +184,6 @@ IF(TEST)
test/core/managed/ManagedContainerTest
test/core/managed/ManagedTest
test/core/managed/ManagerTest
- test/core/model/CardinalityTest
test/core/model/DocumentTest
test/core/parser/ParserStackTest
# test/core/script/FunctionTest
diff --git a/src/core/model/Cardinality.hpp b/src/core/model/Cardinality.hpp
deleted file mode 100644
index aad5891..0000000
--- a/src/core/model/Cardinality.hpp
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- Ousía
- Copyright (C) 2014, 2015 Benjamin Paaßen, Andreas Stöckel
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/**
- * @file Cardinality.hpp
- *
- * A Cardinality in this term here is some arbitrary subset of natural numbers
- * (including zero), that specifies the permits size of some other set.
- *
- * We define Cardinalities in a constructive process, meaning constructive
- * operators on elementary sets (either single numbers or ranges of numbers).
- *
- * Examples for such constructions are:
- *
- * {1}
- * {1,...,4}
- * {1,...,4} union {9,...,12} union {16}
- * {0,...,infinity}
- *
- * Note that the only construction operator needed is union (or +).
- *
- * @author Benjamin Paaßen (bpaassen@techfak.uni-bielefeld.de)
- */
-
-#ifndef _OUSIA_MODEL_CARDINALITY_HPP_
-#define _OUSIA_MODEL_CARDINALITY_HPP_
-
-namespace ousia {
-namespace model {
-
-/**
- * This class is an abstract interface for Cardinality implementations, meaning
- * either a Union of two other Cardinalities or elementary Cardinalities.
- */
-class Cardinality {
-public:
- /**
- * Returns true if and only if the given size is permits according to this
- * Cardinality.
- *
- * @param is some natural number (size).
- * @return true if and only if that size is permits.
- */
- virtual bool permits(const size_t &size) const = 0;
-
- virtual bool operator==(const Cardinality &rhs) const = 0;
-};
-
-/**
- * A UnionCardinality is in fact just the binary or applied to the
- * permits-criteria of two other cardinalities.
- */
-class UnionCardinality : public Cardinality {
-private:
- const Cardinality &left;
- const Cardinality &right;
-
-public:
- UnionCardinality(const Cardinality &left, const Cardinality &right)
- : left(left), right(right)
- {
- }
-
- bool permits(const size_t &size) const override
- {
- return left.permits(size) || right.permits(size);
- }
-
- bool operator==(const Cardinality &obj) const override
- {
- const UnionCardinality *o =
- dynamic_cast<const UnionCardinality *>(&obj);
- if (o == NULL)
- return false;
- return left == o->left && right == o->right;
- }
-};
-
-/**
- * The unite function is basically just a wrapper for constructing a
- * UnionCardinality.
- */
-inline UnionCardinality unite(const Cardinality &lhs, const Cardinality &rhs)
-{
- return std::move(UnionCardinality(lhs, rhs));
-}
-
-/**
- * A SingleCardinality permits exactly one number.
- */
-class SingleCardinality : public Cardinality {
-private:
- size_t num;
-
-public:
- SingleCardinality(size_t num) : num(std::move(num)) {}
-
- bool permits(const size_t &size) const override { return size == num; }
-
- bool operator==(const Cardinality &obj) const override
- {
- const SingleCardinality *o =
- dynamic_cast<const SingleCardinality *>(&obj);
- if (o == NULL)
- return false;
- return num == o->num;
- }
-};
-
-/**
- * A RangeCardinality permits all numbers between the two bounds (lo and hi),
- * inclusively.
- */
-class RangeCardinality : public Cardinality {
-private:
- size_t lo;
- size_t hi;
-
-public:
- RangeCardinality(size_t lo, size_t hi)
- : lo(std::move(lo)), hi(std::move(hi))
- {
- }
-
- bool permits(const size_t &size) const override
- {
- return size >= lo && size <= hi;
- }
-
- bool operator==(const Cardinality &obj) const override
- {
- const RangeCardinality *o =
- dynamic_cast<const RangeCardinality *>(&obj);
- if (o == NULL)
- return false;
- return lo == o->lo && hi == o->hi;
- }
-};
-
-/**
- * An OpenRangeCardinality permits all numbers higher or equal than the lower
- * bound.
- */
-class OpenRangeCardinality : public Cardinality {
-private:
- size_t lo;
-
-public:
- OpenRangeCardinality(size_t lo) : lo(std::move(lo)) {}
-
- bool permits(const size_t &size) const override { return size >= lo; }
-
- bool operator==(const Cardinality &obj) const override
- {
- const OpenRangeCardinality *o =
- dynamic_cast<const OpenRangeCardinality *>(&obj);
- if (o == NULL)
- return false;
- return lo == o->lo;
- }
-};
-}
-}
-
-#endif /* _OUSIA_MODEL_CARDINALITY_HPP_ */
-
diff --git a/src/core/model/Domain.hpp b/src/core/model/Domain.hpp
index 65b9b1d..9ae8871 100644
--- a/src/core/model/Domain.hpp
+++ b/src/core/model/Domain.hpp
@@ -84,8 +84,8 @@
#include <core/managed/ManagedContainer.hpp>
#include <core/Node.hpp>
+#include <core/RangeSet.hpp>
-#include "Cardinality.hpp"
#include "Typesystem.hpp"
namespace ousia {
@@ -265,6 +265,8 @@ public:
}
};
+typedef RangeSet<size_t> Cardinality;
+
/**
* A StructuredClass specifies nodes in the StructureTree of a document that
* implements this domain. For more information on the StructureTree please
@@ -342,7 +344,7 @@ public:
*/
class StructuredClass : public Descriptor {
private:
- const Cardinality& cardinality;
+ const Cardinality cardinality;
Owned<StructuredClass> isa;
ManagedVector<FieldDescriptor> parents;
diff --git a/test/core/model/CardinalityTest.cpp b/test/core/model/CardinalityTest.cpp
deleted file mode 100644
index 34fa272..0000000
--- a/test/core/model/CardinalityTest.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- Ousía
- Copyright (C) 2014, 2015 Benjamin Paaßen, Andreas Stöckel
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <gtest/gtest.h>
-
-#include <core/model/Cardinality.hpp>
-
-namespace ousia {
-namespace model {
-TEST(Cardinality, testCardinalities)
-{
- // Start with the elementary Cardinalities.
- {
- SingleCardinality c{1};
- for (size_t s = 0; s < 100; s++) {
- if (s != 1) {
- ASSERT_FALSE(c.permits(s));
- } else {
- ASSERT_TRUE(c.permits(s));
- }
- }
- }
-
- {
- OpenRangeCardinality c{4};
- for (size_t s = 0; s < 100; s++) {
- if (s < 4) {
- ASSERT_FALSE(c.permits(s));
- } else {
- ASSERT_TRUE(c.permits(s));
- }
- }
- }
-
- {
- RangeCardinality c{1, 10};
- for (size_t s = 0; s < 100; s++) {
- if (s < 1 || s > 10) {
- ASSERT_FALSE(c.permits(s));
- } else {
- ASSERT_TRUE(c.permits(s));
- }
- }
- }
-
- // Then construct more complex ones as unions.
-
- {
- UnionCardinality c =
- unite(SingleCardinality(1),
- unite(RangeCardinality(4, 6), OpenRangeCardinality(16)));
- for (size_t s = 0; s < 100; s++) {
- if (s < 1 || (s > 1 && s < 4) || (s > 6 && s < 16)) {
- ASSERT_FALSE(c.permits(s));
- } else {
- ASSERT_TRUE(c.permits(s));
- }
- }
- }
-}
-
-TEST(Cardinality, testEquals)
-{
- {
- SingleCardinality a{1};
- SingleCardinality b{2};
- OpenRangeCardinality c{1};
-
- ASSERT_EQ(a, a);
- ASSERT_EQ(SingleCardinality(1), a);
- ASSERT_EQ(b, b);
- ASSERT_EQ(c, c);
-
- ASSERT_FALSE(a == b);
- ASSERT_FALSE(b == c);
- ASSERT_FALSE(a == c);
- }
-
- {
- RangeCardinality a{1, 1};
- RangeCardinality b{1, 2};
- RangeCardinality c{2, 2};
-
- ASSERT_EQ(a, a);
- ASSERT_EQ(RangeCardinality(1, 1), a);
- ASSERT_EQ(b, b);
- ASSERT_EQ(c, c);
-
- ASSERT_FALSE(a == b);
- // TODO: Here the semantics break down. It should be equal, in fact.
- ASSERT_FALSE(a == SingleCardinality(1));
- ASSERT_FALSE(b == c);
- ASSERT_FALSE(a == c);
- }
-}
-}
-}