Table.php revision 28a3c939e7f2083b79254ff90cfde77e51908bc8
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 355ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma /** 365ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * returns actual vtable offset 375ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * 385ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @param $vtable_offset 395ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @return int offset > 0 means exist value. 0 means not exist 405ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma */ 415ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma protected function __offset($vtable_offset) 425ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma { 435ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma $vtable = $this->bb_pos - $this->bb->getInt($this->bb_pos); 445ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma return $vtable_offset < $this->bb->getShort($vtable) ? $this->bb->getShort($vtable + $vtable_offset) : 0; 455ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma } 465ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma 475ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma /** 485ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @param $offset 495ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @return mixed 505ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma */ 515ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma protected function __indirect($offset) 525ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma { 535ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma return $offset + $this->bb->getInt($offset); 545ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma } 555ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma 565ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma /** 575ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * fetch utf8 encoded string. 585ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * 595ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @param $offset 605ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @return string 615ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma */ 625ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma protected function __string($offset) 635ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma { 645ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma $offset += $this->bb->getInt($offset); 655ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma $len = $this->bb->getInt($offset); 665ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma $startPos = $offset + Constants::SIZEOF_INT; 675ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma return substr($this->bb->_buffer, $startPos, $len); 685ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma } 695ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma 705ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma /** 715ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @param $offset 725ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @return int 735ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma */ 745ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma protected function __vector_len($offset) 755ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma { 765ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma $offset += $this->bb_pos; 775ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma $offset += $this->bb->getInt($offset); 785ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma return $this->bb->getInt($offset); 795ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma } 805ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma 815ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma /** 825ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @param $offset 835ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @return int 845ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma */ 855ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma protected function __vector($offset) 865ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma { 875ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma $offset += $this->bb_pos; 885ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma // data starts after the length 895ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma return $offset + $this->bb->getInt($offset) + Constants::SIZEOF_INT; 905ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma } 915ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma 9228a3c939e7f2083b79254ff90cfde77e51908bc8Armen Baghumian protected function __vector_as_bytes($vector_offset, $elem_size=1) 9328a3c939e7f2083b79254ff90cfde77e51908bc8Armen Baghumian { 9428a3c939e7f2083b79254ff90cfde77e51908bc8Armen Baghumian $o = $this->__offset($vector_offset); 9528a3c939e7f2083b79254ff90cfde77e51908bc8Armen Baghumian if ($o == 0) { 9628a3c939e7f2083b79254ff90cfde77e51908bc8Armen Baghumian return null; 9728a3c939e7f2083b79254ff90cfde77e51908bc8Armen Baghumian } 9828a3c939e7f2083b79254ff90cfde77e51908bc8Armen Baghumian 9928a3c939e7f2083b79254ff90cfde77e51908bc8Armen Baghumian return substr($this->bb->_buffer, $this->__vector($o), $this->__vector_len($o) * $elem_size); 10028a3c939e7f2083b79254ff90cfde77e51908bc8Armen Baghumian } 1015ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma 1025ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma /** 1035ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @param Table $table 1045ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @param int $offset 1055ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @return Table 1065ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma */ 1075ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma protected function __union($table, $offset) 1085ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma { 1095ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma $offset += $this->bb_pos; 1105ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma $table->bb_pos = $offset + $this->bb->getInt($offset); 1115ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma $table->bb = $this->bb; 1125ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma return $table; 1135ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma } 1145ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma 1155ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma /** 1165ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @param ByteBuffer $bb 1175ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @param string $ident 1185ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @return bool 1195ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma * @throws \ArgumentException 1205ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma */ 1215ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma protected static function __has_identifier($bb, $ident) 1225ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma { 1235ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma if (strlen($ident) != Constants::FILE_IDENTIFIER_LENGTH) { 1245ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma throw new \ArgumentException("FlatBuffers: file identifier must be length " . Constants::FILE_IDENTIFIER_LENGTH); 1255ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma } 1265ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma 1275ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma for ($i = 0; $i < 4; $i++) { 1285ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma if ($ident[$i] != $bb->get($bb->getPosition() + Constants::SIZEOF_INT + $i)) { 1295ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma return false; 1305ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma } 1315ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma } 1325ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma 1335ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma return true; 1345ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma } 1355ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma} 136