修正
@@ -9,12 +9,12 @@ | ||
9 | 9 | CPPUNIT_TEST(child_node_should_leave_the_list_by_itself); |
10 | 10 | CPPUNIT_TEST(cut_in_a_node_should_be_worked); |
11 | 11 | CPPUNIT_TEST(cut_in_nodes_should_be_worked); |
12 | + //CPPUNIT_TEST(insert_with_nodes_should_be_worked); | |
13 | + //CPPUNIT_TEST(delegate_should_be_worked); | |
12 | 14 | //CPPUNIT_TEST(push_back_and_erase_nodes_repeatedly); |
13 | 15 | //CPPUNIT_TEST(erase_should_be_worked); |
14 | 16 | //CPPUNIT_TEST(erase_all_should_be_worked); |
15 | - //CPPUNIT_TEST(insert_with_nodes_should_be_worked); | |
16 | 17 | //CPPUNIT_TEST(getParent_should_be_worked); |
17 | - //CPPUNIT_TEST(delegate_should_be_worked); | |
18 | 18 | //CPPUNIT_TEST(iterator_should_be_worked); |
19 | 19 | //CPPUNIT_TEST(iterator_should_be_worked_using_beginSibling_and_endSibling); |
20 | 20 | CPPUNIT_TEST_SUITE_END(); |
@@ -28,11 +28,11 @@ | ||
28 | 28 | void cut_in_a_node_should_be_worked(); |
29 | 29 | void cut_in_nodes_should_be_worked(); |
30 | 30 | //void push_back_and_erase_nodes_repeatedly(); |
31 | + //void insert_with_nodes_should_be_worked(); | |
32 | + //void delegate_should_be_worked(); | |
31 | 33 | //void erase_should_be_worked(); |
32 | 34 | //void erase_all_should_be_worked(); |
33 | - //void insert_with_nodes_should_be_worked(); | |
34 | 35 | //void getParent_should_be_worked(); |
35 | - //void delegate_should_be_worked(); | |
36 | 36 | //void iterator_should_be_worked(); |
37 | 37 | //void iterator_should_be_worked_using_beginSibling_and_endSibling(); |
38 | 38 | };// |
@@ -123,57 +123,43 @@ | ||
123 | 123 | void |
124 | 124 | NodeTest::insert_with_nodes_should_be_worked() |
125 | 125 | { |
126 | - NodeObject rt1; | |
127 | - NodeObject rt2; | |
128 | - NodeObject rt3; | |
129 | - NodeObject rt4; | |
130 | - NodeObject rt5; | |
126 | + tivi::Node<int> rt1(1); | |
127 | + tivi::Node<int> rt2(2); | |
128 | + tivi::Node<int> rt3(3); | |
129 | + tivi::Node<int> rt4(4); | |
130 | + tivi::Node<int> rt5(5); | |
131 | 131 | |
132 | - rt1.push_back(&rt2); | |
133 | - rt1.push_back(&rt3); | |
134 | - rt4.push_back(&rt5); | |
132 | + rt1.push_back(rt2); | |
133 | + rt1.push_back(rt3); | |
134 | + rt4.push_back(rt5); | |
135 | 135 | |
136 | 136 | /* r1の子ノードは自動的に離脱する */ |
137 | 137 | rt4.insert(rt4.begin(), rt1.begin(), rt1.end()); |
138 | 138 | |
139 | - CPPUNIT_ASSERT_EQUAL(3, rt4.size()); | |
140 | - CPPUNIT_ASSERT_EQUAL(0, rt1.size()); | |
139 | + CPPUNIT_ASSERT_EQUAL(true, 3 == rt4.size()); | |
140 | + CPPUNIT_ASSERT_EQUAL(true, 0 == rt1.size()); | |
141 | 141 | } |
142 | 142 | |
143 | 143 | void |
144 | -NodeTest::getParent_should_be_worked() | |
145 | -{ | |
146 | - NodeObject rt1; | |
147 | - NodeObject rt2; | |
148 | - NodeObject rt3; | |
149 | - | |
150 | - rt1.push_back(&rt2); | |
151 | - rt1.push_back(&rt3); | |
152 | - | |
153 | - CPPUNIT_ASSERT_EQUAL(true, &rt1 == rt2.getParent()); | |
154 | - CPPUNIT_ASSERT_EQUAL(true, &rt1 == rt3.getParent()); | |
155 | -} | |
156 | - | |
157 | -void | |
158 | 144 | NodeTest::delegate_should_be_worked() |
159 | 145 | { |
160 | - NodeObject rt1; | |
161 | - NodeObject rt2; | |
162 | - NodeObject rt3; | |
163 | - NodeObject rt4; | |
164 | - NodeObject rt5; | |
165 | - NodeObject rt6; | |
146 | + tivi::Node<int> a(1); | |
147 | + tivi::Node<int> a1(11); | |
148 | + tivi::Node<int> a2(12); | |
149 | + tivi::Node<int> b(2); | |
150 | + tivi::Node<int> b1(21); | |
151 | + tivi::Node<int> b2(22); | |
166 | 152 | |
167 | - rt1.push_back(&rt2); | |
168 | - rt1.push_back(&rt3); | |
153 | + a.push_back(a1); | |
154 | + a.push_back(a2); | |
169 | 155 | |
170 | - rt4.push_back(&rt5); | |
171 | - rt4.push_back(&rt6); | |
156 | + b.push_back(b1); | |
157 | + b.push_back(b2); | |
172 | 158 | |
173 | - rt1.delegate(&rt4); | |
159 | + a.delegate(b); | |
174 | 160 | |
175 | - CPPUNIT_ASSERT_EQUAL(0, rt1.size()); | |
176 | - CPPUNIT_ASSERT_EQUAL(4, rt4.size()); | |
161 | + CPPUNIT_ASSERT_EQUAL(0, a.size()); | |
162 | + CPPUNIT_ASSERT_EQUAL(4, b.size()); | |
177 | 163 | } |
178 | 164 | |
179 | 165 | void |
@@ -8,16 +8,16 @@ | ||
8 | 8 | |
9 | 9 | template<class T, class C> |
10 | 10 | std::size_t offset_of(T (C::*pm)) |
11 | - { | |
12 | - return (std::size_t)(&(((C*)0)->*pm)); | |
13 | - } | |
11 | + { return (std::size_t)(&(((C*)0)->*pm)); } | |
14 | 12 | |
15 | 13 | template<class T, class C> |
16 | 14 | C* base_of(T* ptr, T (C::*pm)) |
17 | - { | |
18 | - return (C*)((const char*)(ptr) - offset_of(pm)); | |
19 | - } | |
15 | + { return (C*)((const char*)(ptr) - offset_of(pm)); } | |
20 | 16 | |
17 | + template<class T, class C> | |
18 | + const C* base_of(const T* ptr, T (C::*pm)) | |
19 | + { return (const C*)((const char*)(ptr) - offset_of(pm)); } | |
20 | + | |
21 | 21 | class Link |
22 | 22 | { |
23 | 23 | public: |
@@ -27,14 +27,10 @@ | ||
27 | 27 | Link *prev() const { return plink_; } |
28 | 28 | |
29 | 29 | void link_next(Link* link) |
30 | - { | |
31 | - concat(this, link, nlink_); | |
32 | - } | |
30 | + { concat(this, link, nlink_); } | |
33 | 31 | |
34 | 32 | void link_prev(Link* link) |
35 | - { | |
36 | - concat(plink_, link, this); | |
37 | - } | |
33 | + { concat(plink_, link, this); } | |
38 | 34 | |
39 | 35 | void link_next(Link* begin, Link* end) |
40 | 36 | { |
@@ -54,9 +50,7 @@ | ||
54 | 50 | init_link(); |
55 | 51 | } |
56 | 52 | static void unlink(Link* start, Link* end) |
57 | - { | |
58 | - concat(start->plink_, end->nlink_); | |
59 | - } | |
53 | + { concat(start->plink_, end->nlink_); } | |
60 | 54 | |
61 | 55 | public: |
62 | 56 | static void concat(Link* lhs, Link* rhs) |
@@ -106,14 +100,10 @@ | ||
106 | 100 | } |
107 | 101 | |
108 | 102 | Node<T>& operator*() const |
109 | - { | |
110 | - return *node_; | |
111 | - } | |
103 | + { return *node_; } | |
112 | 104 | |
113 | 105 | Node<T>* operator->() const |
114 | - { | |
115 | - return node_; | |
116 | - } | |
106 | + { return node_; } | |
117 | 107 | |
118 | 108 | self& operator++() |
119 | 109 | { |
@@ -142,14 +132,10 @@ | ||
142 | 132 | } |
143 | 133 | |
144 | 134 | bool operator==(const self& x__) const |
145 | - { | |
146 | - return node_ == x__.node_; | |
147 | - } | |
135 | + { return node_ == x__.node_; } | |
148 | 136 | |
149 | 137 | bool operator!=(const self& x__) const |
150 | - { | |
151 | - return node_ != x__.node_; | |
152 | - } | |
138 | + { return node_ != x__.node_; } | |
153 | 139 | |
154 | 140 | //operator ConstNodeIterator() const |
155 | 141 | //{ |
@@ -159,81 +145,128 @@ | ||
159 | 145 | Node<T>* node_; |
160 | 146 | }; |
161 | 147 | |
148 | + template<typename T> | |
149 | + class ConstNodeIterator | |
150 | + { | |
151 | + public: | |
152 | + typedef ConstNodeIterator<T> self; | |
153 | + typedef ptrdiff_t difference_type; | |
154 | + typedef std::bidirectional_iterator_tag iterator_category; | |
155 | + typedef T value_type; | |
156 | + typedef T* pointer; | |
157 | + typedef T& reference; | |
158 | + public: | |
159 | + ConstNodeIterator(const Node<T>* node) | |
160 | + : node_(node) { } | |
162 | 161 | |
162 | + const self& operator=(const self& obj) | |
163 | + { | |
164 | + node_ = obj.node_; | |
165 | + return *this; | |
166 | + } | |
167 | + | |
168 | + const Node<T>& operator*() const | |
169 | + { return *node_; } | |
170 | + | |
171 | + const Node<T>* operator->() const | |
172 | + { return node_; } | |
173 | + | |
174 | + self& operator++() | |
175 | + { | |
176 | + node_ = Node<T>::SiblingToNode(node_->sibling_.next()); | |
177 | + return *this; | |
178 | + } | |
179 | + | |
180 | + self operator++(int) | |
181 | + { | |
182 | + self tmp = *this; | |
183 | + node_ = Node<T>::SiblingToNode(node_->sibling_.next()); | |
184 | + return tmp; | |
185 | + } | |
186 | + | |
187 | + self& operator--() | |
188 | + { | |
189 | + node_ = Node<T>::SiblingToNode(node_->sibling_.prev()); | |
190 | + return *this; | |
191 | + } | |
192 | + | |
193 | + self operator--(int) | |
194 | + { | |
195 | + self tmp = *this; | |
196 | + node_ = Node<T>::SiblingToNode(node_->sibling_.prev()); | |
197 | + return tmp; | |
198 | + } | |
199 | + | |
200 | + bool operator==(const self& x__) const | |
201 | + { return node_ == x__.node_; } | |
202 | + | |
203 | + bool operator!=(const self& x__) const | |
204 | + { return node_ != x__.node_; } | |
205 | + private: | |
206 | + const Node<T>* node_; | |
207 | + }; | |
208 | + | |
209 | + | |
163 | 210 | template <typename T> |
164 | 211 | class Node |
165 | 212 | { |
166 | 213 | public: |
167 | 214 | friend class NodeIterator<T>; |
215 | + friend class ConstNodeIterator<T>; | |
168 | 216 | public: |
169 | - typedef Node<T> self; | |
170 | - typedef NodeIterator<T> iterator; | |
217 | + typedef Node<T> self; | |
218 | + typedef NodeIterator<T> iterator; | |
219 | + typedef ConstNodeIterator<T> const_iterator; | |
171 | 220 | public: |
172 | 221 | Node(const T& data) |
173 | 222 | : data_(data) { } |
174 | 223 | |
175 | 224 | T get() const |
176 | - { | |
177 | - return data_; | |
178 | - } | |
225 | + { return data_; } | |
179 | 226 | |
180 | 227 | T& operator*() |
181 | - { | |
182 | - return data_; | |
183 | - } | |
228 | + { return data_; } | |
184 | 229 | |
185 | 230 | Node& front() const |
186 | - { | |
187 | - return *SiblingToNode(child_.next()); | |
188 | - } | |
231 | + { return *SiblingToNode(child_.next()); } | |
189 | 232 | |
190 | 233 | Node& back() const |
191 | - { | |
192 | - return *SiblingToNode(child_.prev()); | |
193 | - } | |
234 | + { return *SiblingToNode(child_.prev()); } | |
194 | 235 | |
195 | - std::size_t size() | |
236 | + std::size_t size() const | |
196 | 237 | { |
197 | 238 | std::size_t count = 0; |
198 | - for (iterator it = begin(); it != end(); ++it) | |
239 | + for (const_iterator it = begin(); it != end(); ++it) | |
199 | 240 | ++count; |
200 | 241 | return count; |
201 | 242 | } |
202 | 243 | |
203 | 244 | void push_back(Node& node) |
204 | - { | |
205 | - this->child_.link_prev(&node.sibling_); | |
206 | - } | |
245 | + { this->child_.link_prev(&node.sibling_); } | |
207 | 246 | |
208 | 247 | iterator begin() |
209 | - { | |
210 | - return iterator(SiblingToNode(child_.next())); | |
211 | - } | |
248 | + { return iterator(SiblingToNode(child_.next())); } | |
212 | 249 | |
250 | + const_iterator begin() const | |
251 | + { return const_iterator(SiblingToNode(child_.next())); } | |
252 | + | |
213 | 253 | iterator end() |
214 | - { | |
215 | - return iterator(SiblingToNode(&child_)); | |
216 | - } | |
254 | + { return iterator(SiblingToNode(&child_)); } | |
217 | 255 | |
256 | + const_iterator end() const | |
257 | + { return const_iterator(SiblingToNode(&child_)); } | |
258 | + | |
218 | 259 | Node& next() const |
219 | - { | |
220 | - return *SiblingToNode(sibling_.next()); | |
221 | - } | |
260 | + { return *SiblingToNode(sibling_.next()); } | |
222 | 261 | |
223 | 262 | Node& prev() const |
224 | - { | |
225 | - return *SiblingToNode(sibling_.prev()); | |
226 | - } | |
263 | + { return *SiblingToNode(sibling_.prev()); } | |
227 | 264 | |
228 | 265 | void leave() |
229 | - { | |
230 | - sibling_.unlink(); | |
231 | - } | |
266 | + { sibling_.unlink(); } | |
232 | 267 | |
233 | 268 | void cut_in(Node& node) |
234 | - { | |
235 | - sibling_.link_next(&node.sibling_); | |
236 | - } | |
269 | + { sibling_.link_next(&node.sibling_); } | |
237 | 270 | |
238 | 271 | void cut_in(iterator start, iterator end) |
239 | 272 | { |
@@ -244,15 +277,13 @@ | ||
244 | 277 | } |
245 | 278 | |
246 | 279 | bool operator==(Node& node) |
247 | - { | |
248 | - return this == &node; | |
249 | - } | |
250 | - | |
280 | + { return this == &node; } | |
251 | 281 | private: |
252 | 282 | static Node* SiblingToNode(Link *link) |
253 | - { | |
254 | - return base_of(link, &Node::sibling_); | |
255 | - } | |
283 | + { return base_of(link, &Node::sibling_); } | |
284 | + | |
285 | + static const Node* SiblingToNode(const Link *link) | |
286 | + { return base_of(link, &Node::sibling_); } | |
256 | 287 | private: |
257 | 288 | T data_; |
258 | 289 | Link sibling_; |
@@ -265,7 +296,6 @@ | ||
265 | 296 | ost << *node; |
266 | 297 | return ost; |
267 | 298 | } |
268 | - | |
269 | 299 | } |
270 | 300 | |
271 | 301 | #endif |