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