diff --git a/src/lib/data/graph/Edge.cpp b/src/lib/data/graph/Edge.cpp index 28f1bdb9..9ee7de19 100644 --- a/src/lib/data/graph/Edge.cpp +++ b/src/lib/data/graph/Edge.cpp @@ -36,7 +36,7 @@ std::shared_ptr Edge::createPlainCopy(Node* from, Node* to) const for (std::shared_ptr component: m_components) { - edge->addComponent(component); // Todo: create a deep copy here + edge->addComponent(component->copy()); } return edge; diff --git a/src/lib/data/graph/edgeComponent/EdgeComponent.h b/src/lib/data/graph/edgeComponent/EdgeComponent.h index 1c4c21de..976a8afd 100644 --- a/src/lib/data/graph/edgeComponent/EdgeComponent.h +++ b/src/lib/data/graph/edgeComponent/EdgeComponent.h @@ -10,6 +10,8 @@ public: EdgeComponent(); virtual ~EdgeComponent(); + virtual std::shared_ptr copy() const = 0; + void setEdge(Edge* edge); protected: diff --git a/src/lib/data/graph/edgeComponent/EdgeComponentDataType.cpp b/src/lib/data/graph/edgeComponent/EdgeComponentDataType.cpp index b8de417d..b5438c31 100644 --- a/src/lib/data/graph/edgeComponent/EdgeComponentDataType.cpp +++ b/src/lib/data/graph/edgeComponent/EdgeComponentDataType.cpp @@ -13,6 +13,11 @@ EdgeComponentDataType::~EdgeComponentDataType() { } +std::shared_ptr EdgeComponentDataType::copy() const +{ + return std::make_shared(m_qualifierList, m_modifierStack); +} + DataType EdgeComponentDataType::getDataType() const { return DataType(getEdge()->getTo()->getName(), m_qualifierList, m_modifierStack); diff --git a/src/lib/data/graph/edgeComponent/EdgeComponentDataType.h b/src/lib/data/graph/edgeComponent/EdgeComponentDataType.h index c1195271..687dc6ec 100644 --- a/src/lib/data/graph/edgeComponent/EdgeComponentDataType.h +++ b/src/lib/data/graph/edgeComponent/EdgeComponentDataType.h @@ -14,6 +14,8 @@ public: EdgeComponentDataType(const DataTypeQualifierList qualifierList, const DataTypeModifierStack modifierStack); virtual ~EdgeComponentDataType(); + virtual std::shared_ptr copy() const; + DataType getDataType() const; private: diff --git a/src/lib/data/parser/ParserClient.h b/src/lib/data/parser/ParserClient.h index 5ea4433b..851ffc95 100644 --- a/src/lib/data/parser/ParserClient.h +++ b/src/lib/data/parser/ParserClient.h @@ -6,7 +6,7 @@ struct ParseLocation; struct ParseVariable; -struct DataType; +class DataType; class ParserClient { diff --git a/src/lib/data/type/DataTypeModifierStack.cpp b/src/lib/data/type/DataTypeModifierStack.cpp index 5d2d78aa..4a6abb4f 100644 --- a/src/lib/data/type/DataTypeModifierStack.cpp +++ b/src/lib/data/type/DataTypeModifierStack.cpp @@ -4,26 +4,23 @@ DataTypeModifierStack::DataTypeModifierStack() { } -//DataTypeModifierStack::DataTypeModifierStack(const DataTypeModifierStack& o) -//{ -// for (std::shared_ptr modifier: o.m_modifiers) -// { -// m_modifiers.push_back(modifier.); -// } -//} - +DataTypeModifierStack::DataTypeModifierStack(const DataTypeModifierStack& o) +{ + for (std::shared_ptr modifier: o.m_modifiers) + { + m_modifiers.push_back(modifier->copy()); + } +} DataTypeModifierStack::~DataTypeModifierStack() { } - void DataTypeModifierStack::push(std::shared_ptr modifier) { m_modifiers.push_back(modifier); } - std::string DataTypeModifierStack::applyTo(const std::string& typeName) const { std::string modifiedTypeName = typeName; diff --git a/src/lib/data/type/DataTypeModifierStack.h b/src/lib/data/type/DataTypeModifierStack.h index d3939065..252866ab 100644 --- a/src/lib/data/type/DataTypeModifierStack.h +++ b/src/lib/data/type/DataTypeModifierStack.h @@ -11,7 +11,7 @@ class DataTypeModifierStack { public: DataTypeModifierStack(); - //DataTypeModifierStack(const DataTypeModifierStack& o); + DataTypeModifierStack(const DataTypeModifierStack& o); ~DataTypeModifierStack(); void push(std::shared_ptr modifier); diff --git a/src/lib/data/type/modifier/DataTypeModifier.h b/src/lib/data/type/modifier/DataTypeModifier.h index 1ec34a3e..59014c5a 100644 --- a/src/lib/data/type/modifier/DataTypeModifier.h +++ b/src/lib/data/type/modifier/DataTypeModifier.h @@ -11,6 +11,8 @@ public: DataTypeModifier(); virtual ~DataTypeModifier(); + virtual std::shared_ptr copy() const = 0; + void applyTo(std::string& typeName) const; void addQualifier(DataTypeQualifierList::QualifierType qualifier); diff --git a/src/lib/data/type/modifier/DataTypeModifierPointer.cpp b/src/lib/data/type/modifier/DataTypeModifierPointer.cpp index c3e3cc38..690be7be 100644 --- a/src/lib/data/type/modifier/DataTypeModifierPointer.cpp +++ b/src/lib/data/type/modifier/DataTypeModifierPointer.cpp @@ -8,6 +8,11 @@ DataTypeModifierPointer::~DataTypeModifierPointer() { } +std::shared_ptr DataTypeModifierPointer::copy() const +{ + return std::make_shared(); +} + void DataTypeModifierPointer::doApplyTo(std::string& typeName) const { typeName.append(" *"); diff --git a/src/lib/data/type/modifier/DataTypeModifierPointer.h b/src/lib/data/type/modifier/DataTypeModifierPointer.h index b6216b19..714f0896 100644 --- a/src/lib/data/type/modifier/DataTypeModifierPointer.h +++ b/src/lib/data/type/modifier/DataTypeModifierPointer.h @@ -9,6 +9,8 @@ public: DataTypeModifierPointer(); virtual ~DataTypeModifierPointer(); + virtual std::shared_ptr copy() const; + private: virtual void doApplyTo(std::string& typeName) const; }; diff --git a/src/test/GraphTestSuite.h b/src/test/GraphTestSuite.h index fe4d280f..e16c8f99 100644 --- a/src/test/GraphTestSuite.h +++ b/src/test/GraphTestSuite.h @@ -1,6 +1,8 @@ #include "cxxtest/TestSuite.h" #include "data/graph/Graph.h" +#include "data/graph/edgeComponent/EdgeComponentDataType.h" +#include "data/type/modifier/DataTypeModifierPointer.h" class GraphTestSuite : public CxxTest::TestSuite {