OSDN Git Service

データ構造決定記念バックアップ♪
[wordring-tm/wordring-tm.git] / utility / text.cpp
1 #include "text.h"
2
3 #include "debug.h"
4
5 // Text -----------------------------------------------------------------------
6
7 Text::Text() { }
8
9 Text::Text(weak_pointer parent_) : m_parent(parent_) { }
10
11 Text::Text(weak_pointer parent_, QString const &string_)
12         : m_string(string_)
13         , m_parent(parent_)
14 {
15 }
16
17 Text::Text(Text const &) { assert(false); }
18
19 bool Text::is_empty() const
20 {
21         return m_string.isEmpty() && !m_begin;
22 }
23
24 int Text::size()
25 {
26         int result = 0;
27         for(pointer p = begin(); p; p = p->next()) ++result;
28         return result;
29 }
30
31 bool Text::contains(pointer value_)
32 {
33         for(Text::pointer p = begin(); p; p = p->next())
34                 if(p == value_ || p->contains(value_)) return true;
35         return false;
36 }
37
38 Text::pointer Text::at(int i)
39 {
40         assert(0 <= i);
41         assert(i < size());
42         pointer result = begin();
43         for(; i && result; i--) result = result->next();
44         return (!i) ? result : pointer();
45 }
46
47 /*!
48  * \brief 最初の子を返す。
49  */
50 Text::pointer Text::begin() { return m_begin; }
51 Text::const_pointer Text::begin() const { return m_begin; }
52
53 /*!
54  * \brief 最後の子を返す。
55  *
56  * 子が無い場合、空のpointerを返します。
57  */
58 Text::pointer Text::tail()
59 {
60         assert(m_begin);
61         pointer result;
62         for(pointer p = m_begin; p; p = p->next()) result = p;
63         return result;
64 }
65
66 /*!
67  * \brief 最後の子の次を返す。
68  */
69 Text::pointer Text::end() { return pointer(); }
70 Text::const_pointer Text::end() const { return pointer(); }
71
72 /*!
73  * \brief 親を返す。
74  */
75 Text::pointer Text::parent()
76 {
77         if(m_parent.expired()) return pointer();
78         return m_parent.lock();
79 }
80
81 /*!
82  * \brief 前の兄弟を返す。
83  */
84 Text::pointer Text::previous()
85 {
86         if(m_parent.expired()) return pointer();
87         if(m_previous.expired()) return pointer();
88         return m_previous.lock();
89 }
90
91 /*!
92  * \brief 次の兄弟を返す。
93  */
94 Text::pointer Text::next() { return m_next; }
95 Text::const_pointer Text::next() const { return m_next; }
96
97 /*!
98  * \brief 自身のポインタを返す。
99  */
100 Text::pointer Text::self()
101 {
102         if(m_parent.expired()) return m_previous.lock(); // rootノードの場合、自身を持っている。
103         if(m_previous.expired()) return parent()->begin(); // 前のノードが無い場合。
104         return previous()->next(); // 前のノードがあれば、必ずポインタを持っている。
105 }
106
107 /*!
108  * \brief 子の末尾にvalue_を追加する。
109  * \return value_をそのまま返す。
110  */
111 Text::pointer Text::append(pointer value_)
112 {
113         if(m_begin) return insert_after(tail(), value_);
114         m_begin = value_;
115         value_->m_previous = m_begin;
116
117         value_->m_parent = self();
118         return value_;
119 }
120
121 Text::pointer Text::append(QString const &string_)
122 {
123         pointer p = create(self(), string_);
124         return append(p);
125 }
126
127 /*!
128  * \brief position_の前にvalue_を追加する。
129  * \return value_をそのまま返す。
130  */
131 Text::pointer Text::insert(pointer position_, pointer value_)
132 {
133         if(!position_) return append(value_);
134         if(position_ != m_begin) return insert_after(position_->previous(), value_);
135         m_begin = value_;
136         value_->m_next = position_;
137         position_->m_previous = value_;
138
139         value_->m_parent = self();
140         return value_;
141 }
142
143 Text::pointer Text::insert(pointer position_, QString const &string_)
144 {
145         pointer p = create(self(), string_);
146         return insert(position_, p);
147 }
148
149 Text::pointer Text::insert_after(pointer position, pointer value)
150 {
151         assert(position);
152         assert(value);
153         pointer p1 = position, p2 = value, p3 = position->next();
154         p1->m_next = p2;
155         p2->m_next = p3;
156         if(p3) p3->m_previous = p2;
157         p2->m_previous = p1;
158
159         p2->m_parent = self();
160         return value;
161 }
162
163 Text::pointer Text::insert_after(pointer position_, QString const &string_)
164 {
165         return insert_after(position_, create(self(), string_));
166 }
167
168 Text::pointer Text::remove(pointer position_)
169 {
170         assert(false); // 未実装
171         return position_;
172 }
173
174 QString& Text::string() { return m_string; }
175
176 QString const& Text::string() const { return m_string; }
177
178 Text& Text::set_string(QString const &string)
179 {
180         m_string = string;
181         return *this;
182 }
183
184 UserData::pointer Text::data() { return m_data; }
185
186 UserData::const_pointer Text::data() const { return m_data; }
187
188 UserData::pointer Text::set_data(UserData::pointer data_)
189 {
190         m_data = data_;
191         return data_;
192 }
193
194 QString Text::to_string() const
195 {
196         if(!m_string.isEmpty()) return m_string;
197
198         QString result;
199         for(Text::const_pointer p = begin(); p; p = p->next())
200                 result.append(p->to_string());
201         return result;
202 }
203
204 QString Text::debug_dump() const
205 {
206         QString result;
207         if(m_data) result += m_data->debug_dump();
208
209         if(!m_string.isEmpty()) return result + m_string;
210
211         for(Text::const_pointer p = begin(); p; p = p->next())
212         {
213                 result.append(p->debug_dump());
214         }
215
216         return result;
217 }
218
219 Text::pointer Text::create()
220 {
221         pointer p(new Text());
222         p->m_previous = p;
223         return p;
224 }
225
226 Text::pointer Text::create(weak_pointer parent_)
227 {
228         return pointer(new Text(parent_));
229 }
230
231 Text::pointer Text::create(weak_pointer parent_, QString const &string_)
232 {
233         return pointer(new Text(parent_, string_));
234 }
235
236 // RangeData ------------------------------------------------------------------
237
238 RangeData::RangeData(int begin_, int tail_) : m_begin(begin_), m_tail(tail_) { }
239
240 void RangeData::set_tail(int tail_) { m_tail = tail_; }
241
242 int RangeData::begin() const { return m_begin; }
243
244 int RangeData::tail() const { return m_tail; }
245
246 int RangeData::type() const { return Type; }
247
248 QString RangeData::debug_dump() const
249 {
250         return QString("[RangeData:") + QString::number(m_begin) + ","
251                         + QString::number(m_tail) + "]";
252 }
253
254 UserData::pointer RangeData::create(int begin_, int tail_)
255 {
256         return pointer(new RangeData(begin_, tail_));
257 }
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278