Completed
Push — master ( e0e6fe...00e365 )
by Michal
02:51
created

Ternary   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 38
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 0
Metric Value
wmc 7
lcom 1
cbo 2
dl 0
loc 38
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A isOperator() 0 3 1
A operateTernary() 0 5 1
A operate() 0 18 4
A isOpen() 0 3 1
1
<?php
2
/*
3
    Copyright (c) 2016 Michal Čihař <[email protected]>
4
5
    This file is part of SimpleMath.
6
7
    This program is free software; you can redistribute it and/or modify
8
    it under the terms of the GNU General Public License as published by
9
    the Free Software Foundation; either version 2 of the License, or
10
    (at your option) any later version.
11
12
    This program is distributed in the hope that it will be useful,
13
    but WITHOUT ANY WARRANTY; without even the implied warranty of
14
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
    GNU General Public License for more details.
16
17
    You should have received a copy of the GNU General Public License along
18
    with this program; if not, write to the Free Software Foundation, Inc.,
19
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
*/
21
namespace SimpleMath\Expressions;
22
23
class Ternary extends \SimpleMath\Expression {
24
25
    protected $precidence = 1;
26
    protected $leftAssoc = false;
27
28
    public function isOperator() {
29
        return true;
30
    }
31
32
    public function operateTernary(\SimpleMath\Stack $stack, $variables=array()) {
33
        $right = $stack->pop()->operate($stack, $variables);
34
        $left = $stack->pop()->operate($stack, $variables);
35
        return array($left, $right);
36
    }
37
38
    public function operate(\SimpleMath\Stack $stack, $variables=array()) {
39
        if (! $this->isOpen()) {
40
            throw new \RuntimeException('Mismatched ternary operator!');
41
        } else {
42
            $right = $stack->pop();
43
            if ($right instanceof Ternary) {
44
                $right = $right->operateTernary($stack, $variables);
45
            } else {
46
                throw new \RuntimeException('Mismatched ternary operator!');
47
            }
48
            $left = $stack->pop()->operate($stack, $variables);
49
            if ($left) {
50
                return $right[0];
51
            } else {
52
                return $right[1];
53
            }
54
        }
55
    }
56
57
    public function isOpen() {
58
        return $this->value == '?';
59
    }
60
}
61