Passed
Push — master ( 7d3520...28b042 )
by Sebastian
24:23 queued 16:06
created

TreeNode::setItem()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 1
dl 0
loc 3
ccs 0
cts 2
cp 0
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
crap 2
1
<?php
2
declare(strict_types=1);
3
/*
4
 * Copyright (C) 2019 Sebastian Böttger <[email protected]>
5
 * You may use, distribute and modify this code under the
6
 * terms of the MIT license.
7
 *
8
 * You should have received a copy of the MIT license with
9
 * this file. If not, please visit: https://opensource.org/licenses/mit-license.php
10
 */
11
12
namespace Seboettg\Forest\General;
13
14
use Seboettg\Collection\ArrayList\ArrayListInterface;
15
use Seboettg\Forest\Item\ItemInterface;
16
use Seboettg\Forest\Visitor\VisitorInterface;
17
18
/**
19
 * Class TreeNode
20
 * @package Seboettg\Forest\General
21
 */
22
class TreeNode implements TreeNodeInterface
23
{
24
25
    /**
26
     * @var null|TreeNode
27
     */
28
    protected $parent;
29
30
    /**
31
     * @var TreeNodeInterface[]
32
     */
33
    protected $children;
34
35
    /**
36
     * @var ItemInterface
37
     */
38
    protected $item;
39
40
    /**
41
     * TreeNode constructor.
42
     * @param ItemInterface $item
43
     */
44 42
    public function __construct(ItemInterface $item)
45
    {
46 42
        $this->children = [];
47 42
        $this->item = $item;
48 42
    }
49
50 1
    public function getParent(): ?TreeNodeInterface
51
    {
52 1
        return $this->parent;
53
    }
54
55 5
    public function setParent(?TreeNodeInterface $parent): void
56
    {
57 5
        $this->parent = $parent;
58 5
    }
59
60
    /**
61
     * @param TreeNodeInterface $child
62
     */
63 5
    public function addChild(TreeNodeInterface $child): void
64
    {
65 5
        $child->setParent($this);
66 5
        $this->children[] = $child;
67 5
    }
68
69
    /**
70
     * @return TreeNodeInterface[]
71
     */
72 3
    public function getChildren(): array
73
    {
74 3
        return $this->children;
75
    }
76
77
    /**
78
     * @return ItemInterface
79
     */
80 2
    public function getItem(): ?ItemInterface
81
    {
82 2
        return $this->item;
83
    }
84
85
    /**
86
     * @inheritDoc
87
     */
88
    public function setItem(ItemInterface $item): void
89
    {
90
        $this->item = $item;
91
    }
92
93
    /**
94
     * @return bool
95
     */
96 21
    final public function isLeaf(): bool
97
    {
98 21
        return count($this->getChildren()) === 0;
99
    }
100
    /**
101
     * @return bool
102
     */
103 1
    final public function isRoot(): bool
104
    {
105 1
        return $this->getParent() === null;
106
    }
107
    /**
108
     * @return bool
109
     */
110 1
    final public function isChild(): bool
111
    {
112 1
        return $this->getParent() !== null;
113
    }
114
115
    /**
116
     * Returns the distance from the current node to the root.
117
     *
118
     * @return int
119
     */
120 1
    final public function getLevel(): int
121
    {
122 1
        if ($this->isRoot()) {
123 1
            return 0;
124
        }
125 1
        return $this->getParent()->getLevel() + 1;
126
    }
127
128
    /**
129
     * Returns the height of the tree from current node
130
     *
131
     * @return int
132
     */
133 21
    final public function getHeight(): int
134
    {
135 21
        if ($this->isLeaf()) {
136 21
            return 0;
137
        }
138 21
        $heights = [];
139 21
        foreach ($this->getChildren() as $child) {
140 21
            $heights[] = $child->getHeight();
141
        }
142 21
        $max = empty($heights) ? 0 : max($heights);
143 21
        return $max + 1;
144
    }
145
146
    /**
147
     * For visitors
148
     * @param VisitorInterface $visitor
149
     * @return ArrayListInterface
150
     */
151 2
    public function accept(VisitorInterface $visitor): ArrayListInterface
152
    {
153 2
        return $visitor->visit($this);
154
    }
155
}
156