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