Skip to content

Commit 60c2511

Browse files
committed
fixed up ordered set bugs to get all tests working
1 parent f262262 commit 60c2511

File tree

5 files changed

+60
-25
lines changed

5 files changed

+60
-25
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
cmake_minimum_required(VERSION 3.12.0)
2-
project(uml-cpp VERSION 0.2.2)
2+
project(uml-cpp VERSION 0.2.3)
33
include(CTest)
44
enable_testing()
55

include/uml/set/abstractSet.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ namespace UML {
2727
SetNode* m_left = 0;
2828
SetNode* m_right = 0;
2929
AbstractSet* set = 0;
30+
virtual void deleteNode() {
31+
delete this;
32+
}
3033
};
3134

3235
template <class T, class U> class TypedSet;
@@ -42,6 +45,7 @@ namespace UML {
4245

4346
template <class T, class U, class AdditionPolicy, class RemovalPolicy, class AllocationPolicy> friend class PrivateSet;
4447
friend class OrderedSetNodeAllocationPolicy;
48+
friend class OrderedSetNode;
4549

4650
protected:
4751
SetNode* m_root = 0;
@@ -978,7 +982,7 @@ namespace UML {
978982
superSet->m_size--;
979983
superSet->runRemovePolicy(*node->m_ptr);
980984
}
981-
AllocationPolicy::deleteNode(node);
985+
node->deleteNode();
982986
}
983987

984988
void handleOppositeAdd(T& el) {

include/uml/set/orderedSet.h

Lines changed: 50 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,51 @@
44

55
namespace UML {
66

7+
struct OrderedSetNode;
8+
9+
class OrderedSetNodeAllocationPolicyInterface : virtual public AbstractSet {
10+
11+
friend class OrderedSetNodeAllocationPolicy;
12+
template <class T>
13+
friend class OrderedID_Set;
14+
template <class T>
15+
friend class OrderedPtrSet;
16+
friend struct OrderedSetNode;
17+
18+
protected:
19+
virtual OrderedSetNode* getFront() const = 0;
20+
virtual OrderedSetNode* getBack() const = 0;
21+
virtual void setFront(OrderedSetNode* front) = 0;
22+
virtual void setBack(OrderedSetNode* back) = 0;
23+
};
24+
725
struct OrderedSetNode : public SetNode {
826
OrderedSetNode* m_prev = 0;
927
OrderedSetNode* m_next = 0;
28+
void deleteNode() override {
29+
OrderedSetNodeAllocationPolicyInterface* orderedSet = dynamic_cast<OrderedSetNodeAllocationPolicyInterface*>(set);
30+
if (!orderedSet) {
31+
for (auto& superSet : set->getAllSuperSets()) {
32+
orderedSet = dynamic_cast<OrderedSetNodeAllocationPolicyInterface*>(superSet);
33+
if (orderedSet) {
34+
break;
35+
}
36+
}
37+
}
38+
if (orderedSet->getFront() == this) {
39+
orderedSet->setFront(m_next);
40+
}
41+
if (orderedSet->getBack() == this) {
42+
orderedSet->setBack(m_prev);
43+
}
44+
if (m_prev) {
45+
m_prev->m_next = m_next;
46+
}
47+
if (m_next) {
48+
m_next->m_prev = m_prev;
49+
}
50+
delete this;
51+
}
1052
};
1153

1254
template<class V, class W, class AdditionPolicy, class RemovalPolicy> class CustomOrderedSet;
@@ -76,21 +118,6 @@ namespace UML {
76118
template <class T>
77119
class OreredPtrSet;
78120

79-
class OrderedSetNodeAllocationPolicyInterface : virtual public AbstractSet {
80-
81-
friend class OrderedSetNodeAllocationPolicy;
82-
template <class T>
83-
friend class OrderedID_Set;
84-
template <class T>
85-
friend class OrderedPtrSet;
86-
87-
protected:
88-
virtual OrderedSetNode* getFront() const = 0;
89-
virtual OrderedSetNode* getBack() const = 0;
90-
virtual void setFront(OrderedSetNode* front) = 0;
91-
virtual void setBack(OrderedSetNode* back) = 0;
92-
};
93-
94121
template <class T>
95122
class OrderedID_Set {
96123

@@ -104,7 +131,10 @@ namespace UML {
104131
OrderedSetID_Iterator<T> ret;
105132
ret.curr = m_me->getFront();
106133
ret.validSets = m_me->getAllSubSets();
107-
ret.validSets.insert(const_cast<AbstractSet*>(static_cast<const AbstractSet*>(m_me))); // I <3 c++
134+
ret.validSets.insert(m_me);
135+
for (auto& redefinedSet : m_me->m_redefines) {
136+
ret.validSets.insert(redefinedSet);
137+
}
108138
return ret;
109139
};
110140
OrderedSetID_Iterator<T> end() {
@@ -149,7 +179,10 @@ namespace UML {
149179
OrderedSetPtrIterator<T> ret;
150180
ret.curr = m_me->getFront();
151181
ret.validSets = m_me->getAllSubSets();
152-
ret.validSets.insert(const_cast<AbstractSet*>(static_cast<const AbstractSet*>(m_me))); // I <3 c++
182+
ret.validSets.insert(m_me);
183+
for (auto& redefinedSet : m_me->m_redefines) {
184+
ret.validSets.insert(redefinedSet);
185+
}
153186
return ret;
154187
};
155188
OrderedSetPtrIterator<T> end() {

include/uml/types/association.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
#ifndef _UML_ASSOCIATION_H_
2-
#define _UML_ASSOCIATION_H_
1+
#pragma once
32

43
#include "classifier.h"
54
#include "relationship.h"
@@ -43,6 +42,4 @@ namespace UML {
4342
return ElementType::ASSOCIATION;
4443
};
4544
};
46-
}
47-
48-
#endif
45+
}

src/uml/types/classifier.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ void Classifier::RemoveOwnedMemberPolicy::apply(NamedElement& el, Classifier& me
8686
}
8787
if (pair.second.node->m_managerElementMemory &&
8888
pair.second.node->m_managerElementMemory->isSubClassOf(ElementType::CLASSIFIER) &&
89-
pair.second.node->m_managerElementMemory->as<Classifier>().m_generals.contains(me.getID())) {
89+
pair.second.node->m_managerElementMemory->as<Classifier>().m_generals.contains(me.getID()) &&
90+
pair.second.node->m_managerElementMemory->as<Classifier>().m_inheritedMembers.contains(me.getID())) {
9091
pair.second.node->m_managerElementMemory->as<Classifier>().m_inheritedMembers.innerRemove(el.getID());
9192
}
9293
}

0 commit comments

Comments
 (0)