15ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma<?php 25ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma/* 35ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * Copyright 2015 Google Inc. 45ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * 55ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * Licensed under the Apache License, Version 2.0 (the "License"); 65ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * you may not use this file except in compliance with the License. 75ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * You may obtain a copy of the License at 85ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * 95ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * http://www.apache.org/licenses/LICENSE-2.0 105ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * 115ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * Unless required by applicable law or agreed to in writing, software 125ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * distributed under the License is distributed on an "AS IS" BASIS, 135ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * See the License for the specific language governing permissions and 155ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * limitations under the License. 165ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma */ 175ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma 185ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunmanamespace Google\FlatBuffers; 195ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma 205ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunmaabstract class Table 215ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma{ 225ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma /** 235ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @var int $bb_pos 245ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma */ 255ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma protected $bb_pos; 265ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma /** 275ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @var ByteBuffer $bb 285ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma */ 295ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma protected $bb; 305ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma 315ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma public function __construct() 325ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma { 335ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma } 345ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma 3546bb05d95226c72cc85242eee386465860786333Kamil Rojewski public function setByteBufferPos($pos) 3646bb05d95226c72cc85242eee386465860786333Kamil Rojewski { 3746bb05d95226c72cc85242eee386465860786333Kamil Rojewski $this->bb_pos = $pos; 3846bb05d95226c72cc85242eee386465860786333Kamil Rojewski } 3946bb05d95226c72cc85242eee386465860786333Kamil Rojewski 4046bb05d95226c72cc85242eee386465860786333Kamil Rojewski public function setByteBuffer($bb) 4146bb05d95226c72cc85242eee386465860786333Kamil Rojewski { 4246bb05d95226c72cc85242eee386465860786333Kamil Rojewski $this->bb = $bb; 4346bb05d95226c72cc85242eee386465860786333Kamil Rojewski } 4446bb05d95226c72cc85242eee386465860786333Kamil Rojewski 455ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma /** 465ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * returns actual vtable offset 475ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * 485ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @param $vtable_offset 495ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @return int offset > 0 means exist value. 0 means not exist 505ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma */ 515ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma protected function __offset($vtable_offset) 525ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma { 535ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma $vtable = $this->bb_pos - $this->bb->getInt($this->bb_pos); 545ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma return $vtable_offset < $this->bb->getShort($vtable) ? $this->bb->getShort($vtable + $vtable_offset) : 0; 555ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma } 565ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma 575ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma /** 585ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @param $offset 595ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @return mixed 605ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma */ 615ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma protected function __indirect($offset) 625ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma { 635ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma return $offset + $this->bb->getInt($offset); 645ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma } 655ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma 665ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma /** 675ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * fetch utf8 encoded string. 685ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * 695ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @param $offset 705ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @return string 715ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma */ 725ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma protected function __string($offset) 735ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma { 745ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma $offset += $this->bb->getInt($offset); 755ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma $len = $this->bb->getInt($offset); 765ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma $startPos = $offset + Constants::SIZEOF_INT; 775ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma return substr($this->bb->_buffer, $startPos, $len); 785ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma } 795ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma 805ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma /** 815ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @param $offset 825ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @return int 835ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma */ 845ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma protected function __vector_len($offset) 855ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma { 865ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma $offset += $this->bb_pos; 875ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma $offset += $this->bb->getInt($offset); 885ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma return $this->bb->getInt($offset); 895ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma } 905ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma 915ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma /** 925ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @param $offset 935ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @return int 945ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma */ 955ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma protected function __vector($offset) 965ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma { 975ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma $offset += $this->bb_pos; 985ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma // data starts after the length 995ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma return $offset + $this->bb->getInt($offset) + Constants::SIZEOF_INT; 1005ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma } 1015ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma 10228a3c939e7f2083b79254ff90cfde77e51908bc8Armen Baghumian protected function __vector_as_bytes($vector_offset, $elem_size=1) 10328a3c939e7f2083b79254ff90cfde77e51908bc8Armen Baghumian { 10428a3c939e7f2083b79254ff90cfde77e51908bc8Armen Baghumian $o = $this->__offset($vector_offset); 10528a3c939e7f2083b79254ff90cfde77e51908bc8Armen Baghumian if ($o == 0) { 10628a3c939e7f2083b79254ff90cfde77e51908bc8Armen Baghumian return null; 10728a3c939e7f2083b79254ff90cfde77e51908bc8Armen Baghumian } 10828a3c939e7f2083b79254ff90cfde77e51908bc8Armen Baghumian 10928a3c939e7f2083b79254ff90cfde77e51908bc8Armen Baghumian return substr($this->bb->_buffer, $this->__vector($o), $this->__vector_len($o) * $elem_size); 11028a3c939e7f2083b79254ff90cfde77e51908bc8Armen Baghumian } 1115ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma 1125ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma /** 1135ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @param Table $table 1145ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @param int $offset 1155ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @return Table 1165ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma */ 1175ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma protected function __union($table, $offset) 1185ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma { 1195ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma $offset += $this->bb_pos; 12046bb05d95226c72cc85242eee386465860786333Kamil Rojewski $table->setByteBufferPos($offset + $this->bb->getInt($offset)); 12146bb05d95226c72cc85242eee386465860786333Kamil Rojewski $table->setByteBuffer($this->bb); 1225ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma return $table; 1235ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma } 1245ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma 1255ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma /** 1265ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @param ByteBuffer $bb 1275ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @param string $ident 1285ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @return bool 1295ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @throws \ArgumentException 1305ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma */ 1315ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma protected static function __has_identifier($bb, $ident) 1325ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma { 1335ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma if (strlen($ident) != Constants::FILE_IDENTIFIER_LENGTH) { 1345ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma throw new \ArgumentException("FlatBuffers: file identifier must be length " . Constants::FILE_IDENTIFIER_LENGTH); 1355ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma } 1365ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma 1375ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma for ($i = 0; $i < 4; $i++) { 1385ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma if ($ident[$i] != $bb->get($bb->getPosition() + Constants::SIZEOF_INT + $i)) { 1395ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma return false; 1405ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma } 1415ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma } 1425ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma 1435ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma return true; 1445ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma } 1455ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma} 146