Chris@14
|
1 <?php declare(strict_types = 1);
|
Chris@14
|
2 namespace TheSeer\Tokenizer;
|
Chris@14
|
3
|
Chris@14
|
4 class TokenCollection implements \ArrayAccess, \Iterator, \Countable {
|
Chris@14
|
5
|
Chris@14
|
6 /**
|
Chris@14
|
7 * @var Token[]
|
Chris@14
|
8 */
|
Chris@14
|
9 private $tokens = [];
|
Chris@14
|
10
|
Chris@14
|
11 /**
|
Chris@14
|
12 * @var int
|
Chris@14
|
13 */
|
Chris@14
|
14 private $pos;
|
Chris@14
|
15
|
Chris@14
|
16 /**
|
Chris@14
|
17 * @param Token $token
|
Chris@14
|
18 */
|
Chris@14
|
19 public function addToken(Token $token) {
|
Chris@14
|
20 $this->tokens[] = $token;
|
Chris@14
|
21 }
|
Chris@14
|
22
|
Chris@14
|
23 /**
|
Chris@14
|
24 * @return Token
|
Chris@14
|
25 */
|
Chris@14
|
26 public function current(): Token {
|
Chris@14
|
27 return current($this->tokens);
|
Chris@14
|
28 }
|
Chris@14
|
29
|
Chris@14
|
30 /**
|
Chris@14
|
31 * @return int
|
Chris@14
|
32 */
|
Chris@14
|
33 public function key(): int {
|
Chris@14
|
34 return key($this->tokens);
|
Chris@14
|
35 }
|
Chris@14
|
36
|
Chris@14
|
37 /**
|
Chris@14
|
38 * @return void
|
Chris@14
|
39 */
|
Chris@14
|
40 public function next() {
|
Chris@14
|
41 next($this->tokens);
|
Chris@14
|
42 $this->pos++;
|
Chris@14
|
43 }
|
Chris@14
|
44
|
Chris@14
|
45 /**
|
Chris@14
|
46 * @return bool
|
Chris@14
|
47 */
|
Chris@14
|
48 public function valid(): bool {
|
Chris@14
|
49 return $this->count() > $this->pos;
|
Chris@14
|
50 }
|
Chris@14
|
51
|
Chris@14
|
52 /**
|
Chris@14
|
53 * @return void
|
Chris@14
|
54 */
|
Chris@14
|
55 public function rewind() {
|
Chris@14
|
56 reset($this->tokens);
|
Chris@14
|
57 $this->pos = 0;
|
Chris@14
|
58 }
|
Chris@14
|
59
|
Chris@14
|
60 /**
|
Chris@14
|
61 * @return int
|
Chris@14
|
62 */
|
Chris@14
|
63 public function count(): int {
|
Chris@14
|
64 return count($this->tokens);
|
Chris@14
|
65 }
|
Chris@14
|
66
|
Chris@14
|
67 /**
|
Chris@14
|
68 * @param mixed $offset
|
Chris@14
|
69 *
|
Chris@14
|
70 * @return bool
|
Chris@14
|
71 */
|
Chris@14
|
72 public function offsetExists($offset): bool {
|
Chris@14
|
73 return isset($this->tokens[$offset]);
|
Chris@14
|
74 }
|
Chris@14
|
75
|
Chris@14
|
76 /**
|
Chris@14
|
77 * @param mixed $offset
|
Chris@14
|
78 *
|
Chris@14
|
79 * @return Token
|
Chris@14
|
80 * @throws TokenCollectionException
|
Chris@14
|
81 */
|
Chris@14
|
82 public function offsetGet($offset): Token {
|
Chris@14
|
83 if (!$this->offsetExists($offset)) {
|
Chris@14
|
84 throw new TokenCollectionException(
|
Chris@14
|
85 sprintf('No Token at offest %s', $offset)
|
Chris@14
|
86 );
|
Chris@14
|
87 }
|
Chris@14
|
88
|
Chris@14
|
89 return $this->tokens[$offset];
|
Chris@14
|
90 }
|
Chris@14
|
91
|
Chris@14
|
92 /**
|
Chris@14
|
93 * @param mixed $offset
|
Chris@14
|
94 * @param Token $value
|
Chris@14
|
95 *
|
Chris@14
|
96 * @throws TokenCollectionException
|
Chris@14
|
97 */
|
Chris@14
|
98 public function offsetSet($offset, $value) {
|
Chris@14
|
99 if (!is_int($offset)) {
|
Chris@14
|
100 $type = gettype($offset);
|
Chris@14
|
101 throw new TokenCollectionException(
|
Chris@14
|
102 sprintf(
|
Chris@14
|
103 'Offset must be of type integer, %s given',
|
Chris@14
|
104 $type === 'object' ? get_class($value) : $type
|
Chris@14
|
105 )
|
Chris@14
|
106 );
|
Chris@14
|
107 }
|
Chris@14
|
108 if (!$value instanceof Token) {
|
Chris@14
|
109 $type = gettype($value);
|
Chris@14
|
110 throw new TokenCollectionException(
|
Chris@14
|
111 sprintf(
|
Chris@14
|
112 'Value must be of type %s, %s given',
|
Chris@14
|
113 Token::class,
|
Chris@14
|
114 $type === 'object' ? get_class($value) : $type
|
Chris@14
|
115 )
|
Chris@14
|
116 );
|
Chris@14
|
117 }
|
Chris@14
|
118 $this->tokens[$offset] = $value;
|
Chris@14
|
119 }
|
Chris@14
|
120
|
Chris@14
|
121 /**
|
Chris@14
|
122 * @param mixed $offset
|
Chris@14
|
123 */
|
Chris@14
|
124 public function offsetUnset($offset) {
|
Chris@14
|
125 unset($this->tokens[$offset]);
|
Chris@14
|
126 }
|
Chris@14
|
127
|
Chris@14
|
128 }
|