5 // Text -----------------------------------------------------------------------
9 Text::Text(weak_pointer parent_) : m_parent(parent_) { }
11 Text::Text(weak_pointer parent_, QString const &string_)
17 Text::Text(Text const &) { assert(false); }
19 bool Text::is_empty() const
21 return m_string.isEmpty() && !m_begin;
27 for(pointer p = begin(); p; p = p->next()) ++result;
31 bool Text::contains(pointer value_)
33 for(Text::pointer p = begin(); p; p = p->next())
34 if(p == value_ || p->contains(value_)) return true;
38 Text::pointer Text::at(int i)
42 pointer result = begin();
43 for(; i && result; i--) result = result->next();
44 return (!i) ? result : pointer();
50 Text::pointer Text::begin() { return m_begin; }
51 Text::const_pointer Text::begin() const { return m_begin; }
56 * 子が無い場合、空のpointerを返します。
58 Text::pointer Text::tail()
62 for(pointer p = m_begin; p; p = p->next()) result = p;
69 Text::pointer Text::end() { return pointer(); }
70 Text::const_pointer Text::end() const { return pointer(); }
75 Text::pointer Text::parent()
77 if(m_parent.expired()) return pointer();
78 return m_parent.lock();
84 Text::pointer Text::previous()
86 if(m_parent.expired()) return pointer();
87 if(m_previous.expired()) return pointer();
88 return m_previous.lock();
94 Text::pointer Text::next() { return m_next; }
95 Text::const_pointer Text::next() const { return m_next; }
100 Text::pointer Text::self()
102 if(m_parent.expired()) return m_previous.lock(); // rootノードの場合、自身を持っている。
103 if(m_previous.expired()) return parent()->begin(); // 前のノードが無い場合。
104 return previous()->next(); // 前のノードがあれば、必ずポインタを持っている。
108 * \brief 子の末尾にvalue_を追加する。
109 * \return value_をそのまま返す。
111 Text::pointer Text::append(pointer value_)
113 if(m_begin) return insert_after(tail(), value_);
115 value_->m_previous = m_begin;
117 value_->m_parent = self();
121 Text::pointer Text::append(QString const &string_)
123 pointer p = create(self(), string_);
128 * \brief position_の前にvalue_を追加する。
129 * \return value_をそのまま返す。
131 Text::pointer Text::insert(pointer position_, pointer value_)
133 if(!position_) return append(value_);
134 if(position_ != m_begin) return insert_after(position_->previous(), value_);
136 value_->m_next = position_;
137 position_->m_previous = value_;
139 value_->m_parent = self();
143 Text::pointer Text::insert(pointer position_, QString const &string_)
145 pointer p = create(self(), string_);
146 return insert(position_, p);
149 Text::pointer Text::insert_after(pointer position, pointer value)
153 pointer p1 = position, p2 = value, p3 = position->next();
156 if(p3) p3->m_previous = p2;
159 p2->m_parent = self();
163 Text::pointer Text::insert_after(pointer position_, QString const &string_)
165 return insert_after(position_, create(self(), string_));
168 Text::pointer Text::remove(pointer position_)
170 assert(false); // 未実装
174 QString& Text::string() { return m_string; }
176 QString const& Text::string() const { return m_string; }
178 Text& Text::set_string(QString const &string)
184 UserData::pointer Text::data() { return m_data; }
186 UserData::const_pointer Text::data() const { return m_data; }
188 UserData::pointer Text::set_data(UserData::pointer data_)
194 QString Text::to_string() const
196 if(!m_string.isEmpty()) return m_string;
199 for(Text::const_pointer p = begin(); p; p = p->next())
200 result.append(p->to_string());
204 QString Text::debug_dump() const
207 if(m_data) result += m_data->debug_dump();
209 if(!m_string.isEmpty()) return result + m_string;
211 for(Text::const_pointer p = begin(); p; p = p->next())
213 result.append(p->debug_dump());
219 Text::pointer Text::create()
221 pointer p(new Text());
226 Text::pointer Text::create(weak_pointer parent_)
228 return pointer(new Text(parent_));
231 Text::pointer Text::create(weak_pointer parent_, QString const &string_)
233 return pointer(new Text(parent_, string_));
236 // RangeData ------------------------------------------------------------------
238 RangeData::RangeData(int begin_, int tail_) : m_begin(begin_), m_tail(tail_) { }
240 void RangeData::set_tail(int tail_) { m_tail = tail_; }
242 int RangeData::begin() const { return m_begin; }
244 int RangeData::tail() const { return m_tail; }
246 int RangeData::type() const { return Type; }
248 QString RangeData::debug_dump() const
250 return QString("[RangeData:") + QString::number(m_begin) + ","
251 + QString::number(m_tail) + "]";
254 UserData::pointer RangeData::create(int begin_, int tail_)
256 return pointer(new RangeData(begin_, tail_));