| <?php |
| /* |
| * Copyright 2015 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| namespace Google\FlatBuffers; |
| |
| abstract class Table |
| { |
| /** |
| * @var int $bb_pos |
| */ |
| protected $bb_pos; |
| /** |
| * @var ByteBuffer $bb |
| */ |
| protected $bb; |
| |
| public function __construct() |
| { |
| } |
| |
| public function setByteBufferPos($pos) |
| { |
| $this->bb_pos = $pos; |
| } |
| |
| public function setByteBuffer($bb) |
| { |
| $this->bb = $bb; |
| } |
| |
| /** |
| * returns actual vtable offset |
| * |
| * @param $vtable_offset |
| * @return int offset > 0 means exist value. 0 means not exist |
| */ |
| protected function __offset($vtable_offset) |
| { |
| $vtable = $this->bb_pos - $this->bb->getInt($this->bb_pos); |
| return $vtable_offset < $this->bb->getShort($vtable) ? $this->bb->getShort($vtable + $vtable_offset) : 0; |
| } |
| |
| /** |
| * @param $offset |
| * @return mixed |
| */ |
| protected function __indirect($offset) |
| { |
| return $offset + $this->bb->getInt($offset); |
| } |
| |
| /** |
| * fetch utf8 encoded string. |
| * |
| * @param $offset |
| * @return string |
| */ |
| protected function __string($offset) |
| { |
| $offset += $this->bb->getInt($offset); |
| $len = $this->bb->getInt($offset); |
| $startPos = $offset + Constants::SIZEOF_INT; |
| return substr($this->bb->_buffer, $startPos, $len); |
| } |
| |
| /** |
| * @param $offset |
| * @return int |
| */ |
| protected function __vector_len($offset) |
| { |
| $offset += $this->bb_pos; |
| $offset += $this->bb->getInt($offset); |
| return $this->bb->getInt($offset); |
| } |
| |
| /** |
| * @param $offset |
| * @return int |
| */ |
| protected function __vector($offset) |
| { |
| $offset += $this->bb_pos; |
| // data starts after the length |
| return $offset + $this->bb->getInt($offset) + Constants::SIZEOF_INT; |
| } |
| |
| protected function __vector_as_bytes($vector_offset, $elem_size=1) |
| { |
| $o = $this->__offset($vector_offset); |
| if ($o == 0) { |
| return null; |
| } |
| |
| return substr($this->bb->_buffer, $this->__vector($o), $this->__vector_len($o) * $elem_size); |
| } |
| |
| /** |
| * @param Table $table |
| * @param int $offset |
| * @return Table |
| */ |
| protected function __union($table, $offset) |
| { |
| $offset += $this->bb_pos; |
| $table->setByteBufferPos($offset + $this->bb->getInt($offset)); |
| $table->setByteBuffer($this->bb); |
| return $table; |
| } |
| |
| /** |
| * @param ByteBuffer $bb |
| * @param string $ident |
| * @return bool |
| * @throws \ArgumentException |
| */ |
| protected static function __has_identifier($bb, $ident) |
| { |
| if (strlen($ident) != Constants::FILE_IDENTIFIER_LENGTH) { |
| throw new \ArgumentException("FlatBuffers: file identifier must be length " . Constants::FILE_IDENTIFIER_LENGTH); |
| } |
| |
| for ($i = 0; $i < 4; $i++) { |
| if ($ident[$i] != $bb->get($bb->getPosition() + Constants::SIZEOF_INT + $i)) { |
| return false; |
| } |
| } |
| |
| return true; |
| } |
| } |