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