OSDN Git Service

Initial commit
[wordring-tm/wordring-tm.git] / utility / text.h
1 #ifndef TEXT_H
2 #define TEXT_H
3
4 #include "userdata.h"
5
6 #include <QMetaType>
7 #include <QString>
8
9 #include <memory>
10
11 /*!
12  * \brief 構造化文字列を表現するクラスです。
13  */
14 class Text
15 {
16 public:
17         typedef std::shared_ptr<Text> pointer;
18         typedef std::shared_ptr<Text const> const_pointer;
19         typedef std::weak_ptr<Text> weak_pointer;
20
21 private:
22         Text();
23         Text(weak_pointer parent_);
24         Text(weak_pointer parent_, QString const &string_);
25         Text(Text const &);
26
27 public:
28         int size();
29         bool contains(pointer value_);
30
31         pointer at(int i);
32
33         pointer begin();
34         pointer tail();
35         pointer end();
36
37         pointer parent();
38         pointer previous();
39         pointer next();
40         pointer self();
41
42         pointer append(pointer value_);
43         pointer append(QString const &string_);
44         pointer insert(pointer position_, pointer value_);
45         pointer insert(pointer position_, QString const &string_);
46         pointer insert_after(pointer position, pointer value);
47         pointer insert_after(pointer position_, QString const &string_);
48
49         QString& string();
50         Text& set_string(QString const &string);
51
52         UserData::pointer data();
53         UserData::pointer set_data(UserData::pointer data_);
54
55         QString debug_dump();
56
57         static pointer create();
58         static pointer create(weak_pointer parent_);
59         static pointer create(weak_pointer parent_, QString const &string_);
60
61 private:
62         weak_pointer m_parent; /*!< rootノードの場合、空。それ以外は親ノード。 */
63         weak_pointer m_previous; /*!< rootノードの場合、自分自身。それ以外は前のノード。 */
64         pointer m_next; /*!< 次のテキスト */
65
66         pointer m_begin; /*!< 最初の子 */
67
68         QString m_string;
69         UserData::pointer m_data;
70 };
71
72 class RangeData : public UserData
73 {
74 public:
75         enum : int { Type = UserData::User + 1, };
76
77 private:
78         RangeData(int begin_, int tail_);
79
80 public:
81         void set_tail(int tail_);
82         int begin() const;
83         int tail() const;
84
85         int type() const;
86
87         static pointer create(int begin_, int tail_);
88
89 private:
90         int m_begin;
91         int m_tail;
92 };
93
94 Q_DECLARE_METATYPE(Text::weak_pointer)
95 Q_DECLARE_METATYPE(Text::pointer)
96
97 #endif // TEXT_H