4
4
5
5
namespace UML {
6
6
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
+
7
25
struct OrderedSetNode : public SetNode {
8
26
OrderedSetNode* m_prev = 0 ;
9
27
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
+ }
10
52
};
11
53
12
54
template <class V , class W , class AdditionPolicy , class RemovalPolicy > class CustomOrderedSet ;
@@ -76,21 +118,6 @@ namespace UML {
76
118
template <class T >
77
119
class OreredPtrSet ;
78
120
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
-
94
121
template <class T >
95
122
class OrderedID_Set {
96
123
@@ -104,7 +131,10 @@ namespace UML {
104
131
OrderedSetID_Iterator<T> ret;
105
132
ret.curr = m_me->getFront ();
106
133
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
+ }
108
138
return ret;
109
139
};
110
140
OrderedSetID_Iterator<T> end () {
@@ -149,7 +179,10 @@ namespace UML {
149
179
OrderedSetPtrIterator<T> ret;
150
180
ret.curr = m_me->getFront ();
151
181
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
+ }
153
186
return ret;
154
187
};
155
188
OrderedSetPtrIterator<T> end () {
0 commit comments