5#ifndef COLLECTION2_TREE_H
6#define COLLECTION2_TREE_H
13namespace collection2 {
21template <
typename Element,
typename Size =
size_t>
24 bool isEnabled =
false;
41 return (lhs ==
nullptr) && (rhs ==
nullptr);
48enum class TreeNodeSide : uint8_t {
62template <
typename Element,
typename Size =
size_t>
73 Size internalDataSize;
85 Tree& operator=(
const Tree&) =
delete;
124 const Element& target,
125 const TreeNodeSide side,
138 const TreeNodeSide side)
const;
155 return internalDataSize;
159template <
typename Element,
typename Size>
161 : internalData(data), internalDataSize(dataSize) {
165template <
typename Element,
typename Size>
167 for (Size i = 0; i < internalDataSize; i++) {
168 internalData[i].isEnabled =
false;
172template <
typename Element,
typename Size>
174 for (Size i = 0; i < internalDataSize; i++) {
175 if (internalData[i].isEnabled) {
180 internalData[i].isEnabled =
true;
181 internalData[i].lhs =
nullptr;
182 internalData[i].rhs =
nullptr;
183 return &(internalData[i]);
188template <
typename Element,
typename Size>
191 auto* node = retainNode();
192 if (node ==
nullptr) {
197 node->element = element;
201template <
typename Element,
typename Size>
204 const Element& target,
205 const TreeNodeSide side,
208 if (parent ==
nullptr) {
209 return OperationResult::Empty;
213 auto* newNode = retainNode();
214 if (newNode ==
nullptr) {
215 if (addedNodePtr !=
nullptr) {
216 *addedNodePtr =
nullptr;
218 return OperationResult::Overflow;
222 newNode->element = target;
225 if (addedNodePtr !=
nullptr) {
226 *addedNodePtr = newNode;
230 return linkNode(*parent, newNode, side);
233template <
typename Element,
typename Size>
235 if (node ==
nullptr) {
236 return OperationResult::Empty;
240 if (side == TreeNodeSide::Left) {
241 if (parent.lhs !=
nullptr) {
242 return OperationResult::Overflow;
246 if (side == TreeNodeSide::Right) {
247 if (parent.rhs !=
nullptr) {
248 return OperationResult::Overflow;
252 return OperationResult::Success;
255template <
typename Element,
typename Size>
259 target->isEnabled =
false;
264 if (target->lhs !=
nullptr) {
265 removeChild(target->lhs);
266 target->lhs =
nullptr;
268 if (target->rhs !=
nullptr) {
269 removeChild(target->rhs);
270 target->rhs =
nullptr;
ツリー
Definition: tree.hpp:63
void initializeTreeNodePool()
ツリーノードプールを初期化する
Definition: tree.hpp:166
OperationResult appendChild(TreeNode< Element, Size > *parent, const Element &target, const TreeNodeSide side, TreeNode< Element, Size > **addedNodePtr=nullptr)
子ノードを生成し、既存ノードに追加する
Definition: tree.hpp:202
void removeChild(TreeNode< Element, Size > *target)
子ノードを削除する
Definition: tree.hpp:256
TreeNode< Element, Size > * retainNode() const
内部ノードプールから空きノードを探し、確保する
Definition: tree.hpp:173
Size capacity() const
ツリーが持てるノードおよびリーフの全体長を返す
Definition: tree.hpp:154
Tree(TreeNode< Element, Size > *const data, const Size &dataSize)
内部データを扱う領域とそのサイズを指定してリストを初期化
Definition: tree.hpp:160
OperationResult linkNode(TreeNode< Element, Size > &parent, TreeNode< Element, Size > *node, const TreeNodeSide side) const
ノードを別のノードに接続する
Definition: tree.hpp:234
OperationResult
コレクション操作結果
Definition: common.hpp:14
ツリーの各ノードを表す構造体
Definition: tree.hpp:22
bool isLeaf() const
リーフかどうかを調べる
Definition: tree.hpp:40