~aleteoryx/muditaos

ref: 2cf455dc130a0df575e95cff47ae797353e304e6 muditaos/module-gui/gui/widgets/visitor/DepthFirstItemTree.cpp -rw-r--r-- 1.5 KiB
2cf455dc — Alex0vSky [MOS-1046] Update module-services/service-cellular/call/doc/README.md 2 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "DepthFirstItemTree.hpp"

using namespace gui;

DepthFirstItemTree::DepthFirstItemTree(gui::Item &root, TraverseMode mode) : mode(mode)
{
    nodes.push(gui::ItemNode(root));
    if (mode == TraverseMode::PostOrder) {
        constructPostOrder(&root, ItemNode::rootLevel + 1);
    }
}

auto DepthFirstItemTree::hasNext() const noexcept -> bool
{
    return !nodes.empty();
}

auto DepthFirstItemTree::getNext() noexcept -> gui::ItemNode
{
    if (mode == TraverseMode::PostOrder) {
        return getNextInPostOrder();
    }
    return getNextInPreOrder();
}

void DepthFirstItemTree::constructPostOrder(gui::Item *item, int level)
{
    for (auto child = item->children.rbegin(); child != item->children.rend(); child++) {
        if (*child == nullptr) {
            continue;
        }
        nodes.push(gui::ItemNode(**child, level));
        constructPostOrder(*child, level + 1);
    }
}

auto DepthFirstItemTree::getNextInPostOrder() -> gui::ItemNode
{
    auto current = std::move(nodes.top());
    nodes.pop();
    return current;
}

auto DepthFirstItemTree::getNextInPreOrder() -> gui::ItemNode
{
    auto current   = std::move(nodes.top());
    auto &item     = current.getItem();
    auto nextLevel = current.getLevel() + 1;
    nodes.pop();
    for (auto child = item.children.rbegin(); child != item.children.rend(); child++) {
        nodes.push(gui::ItemNode(**child, nextLevel));
    }

    return current;
}