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
1869a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara/// @file
1969a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara/// @addtogroup flatbuffers_php_api
2069a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara/// @{
2169a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara
225ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunmanamespace Google\FlatBuffers;
235ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
245ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunmaclass FlatbufferBuilder
255ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma{
265ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
2769a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * Internal ByteBuffer for the FlatBuffer data.
285ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @var ByteBuffer $bb
295ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
305ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public $bb;
315ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
3269a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    /// @cond FLATBUFFERS_INTERNAL
335ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
345ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @var int $space
355ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
365ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    protected $space;
375ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
385ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
395ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @var int $minalign
405ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
415ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    protected $minalign = 1;
425ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
435ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
445ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @var array $vtable
455ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
465ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    protected $vtable;
475ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
485ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
495ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @var int $vtable_in_use
505ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
515ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    protected $vtable_in_use = 0;
525ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
535ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
545ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @var bool $nested
555ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
565ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    protected $nested = false;
575ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
585ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
595ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @var int $object_start
605ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
615ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    protected $object_start;
625ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
635ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
645ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @var array $vtables
655ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
665ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    protected $vtables = array();
675ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
685ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
695ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @var int $num_vtables
705ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
715ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    protected $num_vtables = 0;
725ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
735ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
745ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @var int $vector_num_elems
755ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
765ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    protected $vector_num_elems = 0;
775ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
785ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
795ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @var bool $force_defaults
805ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
815ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    protected $force_defaults = false;
8269a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    /// @endcond
835ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
845ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
8569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * Create a FlatBufferBuilder with a given initial size.
865ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     *
875ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $initial_size initial byte buffer size.
885ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
895ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function __construct($initial_size)
905ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
915ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($initial_size <= 0) {
925ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $initial_size = 1;
935ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
945ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->space = $initial_size;
955ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->bb = $this->newByteBuffer($initial_size);
965ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
975ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
9869a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    /// @cond FLATBUFFERS_INTERNAL
995ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
1005ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * create new bytebuffer
1015ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     *
1025ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $size
1035ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @return ByteBuffer
1045ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
1055ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    private function newByteBuffer($size)
1065ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
1075ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        return new ByteBuffer($size);
1085ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
1095ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
1105ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
11169a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * Returns the current ByteBuffer offset.
1125ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     *
1135ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @return int
1145ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
1155ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function offset()
1165ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
1175ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        return $this->bb->capacity() - $this->space;
1185ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
1195ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
1205ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
1215ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * padding buffer
1225ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     *
1235ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $byte_size
1245ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
1255ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function pad($byte_size)
1265ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
1275ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        for ($i = 0; $i < $byte_size; $i++) {
1285ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->bb->putByte(--$this->space, "\0");
1295ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
1305ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
1315ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
1325ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
1335ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * prepare bytebuffer
1345ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     *
1355ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $size
1365ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $additional_bytes
1375ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @throws \Exception
1385ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
1395ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function prep($size, $additional_bytes)
1405ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
1415ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($size > $this->minalign) {
1425ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->minalign = $size;
1435ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
1445ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
1455ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $align_size = ((~($this->bb->capacity() - $this->space + $additional_bytes)) + 1) & ($size - 1);
1465ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        while ($this->space < $align_size + $size  + $additional_bytes) {
1475ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $old_buf_size = $this->bb->capacity();
1485ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->bb = $this->growByteBuffer($this->bb);
1495ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->space += $this->bb->capacity() - $old_buf_size;
1505ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
1515ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
1525ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->pad($align_size);
1535ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
1545ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
1555ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
1565ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param ByteBuffer $bb
1575ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @return ByteBuffer
1585ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @throws \Exception
1595ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
1605ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    private static function growByteBuffer(ByteBuffer $bb)
1615ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
1625ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $old_buf_size = $bb->capacity();
1635ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if (($old_buf_size & 0xC0000000) != 0) {
1645ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            throw new \Exception("FlatBuffers: cannot grow buffer beyond 2 gigabytes");
1655ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
1665ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $new_buf_size = $old_buf_size << 1;
1675ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
1685ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $bb->setPosition(0);
1695ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $nbb = new ByteBuffer($new_buf_size);
1705ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
1715ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $nbb->setPosition($new_buf_size - $old_buf_size);
1725ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
1735ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        // TODO(chobie): is this little bit faster?
1745ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        //$nbb->_buffer = substr_replace($nbb->_buffer, $bb->_buffer, $new_buf_size - $old_buf_size, strlen($bb->_buffer));
1755ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        for ($i = $new_buf_size - $old_buf_size, $j = 0; $j < strlen($bb->_buffer); $i++, $j++) {
1765ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $nbb->_buffer[$i] = $bb->_buffer[$j];
1775ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
1785ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
1795ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        return $nbb;
1805ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
1815ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
1825ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
1835ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
1845ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
1855ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function putBool($x)
1865ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
1875ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->bb->put($this->space -= 1, chr((int)(bool)($x)));
1885ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
1895ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
1905ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
1915ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
1925ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
1935ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function putByte($x)
1945ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
1955ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->bb->put($this->space -= 1, chr($x));
1965ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
1975ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
1985ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
1995ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
2005ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
2015ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function putSbyte($x)
2025ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
2035ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->bb->put($this->space -= 1, chr($x));
2045ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
2055ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
2065ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
2075ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
2085ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
2095ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function putShort($x)
2105ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
2115ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->bb->putShort($this->space -= 2, $x);
2125ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
2135ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
2145ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
2155ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
2165ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
2175ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function putUshort($x)
2185ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
2195ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->bb->putUshort($this->space -= 2, $x);
2205ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
2215ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
2225ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
2235ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
2245ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
2255ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function putInt($x)
2265ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
2275ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->bb->putInt($this->space -= 4, $x);
2285ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
2295ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
2305ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
2315ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
2325ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
2335ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function putUint($x)
2345ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
2355ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($x > PHP_INT_MAX) {
236cf7e4b027ada723c782f0e25615c080f0bdac006Antoine Descamps            throw new \InvalidArgumentException("your platform can't handle uint correctly. use 64bit machine.");
2375ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
2385ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
2395ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->bb->putUint($this->space -= 4, $x);
2405ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
2415ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
2425ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
2435ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
2445ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
2455ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function putLong($x)
2465ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
2475ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($x > PHP_INT_MAX) {
24864fa8ba9a99234edd7cf8b09820603c0a2c287eaAntoine Descamps            throw new \InvalidArgumentException("Your platform can't handle long correctly. Use a 64bit machine.");
2495ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
2505ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
2515ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->bb->putLong($this->space -= 8, $x);
2525ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
2535ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
2545ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
2555ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
2565ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
2575ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function putUlong($x)
2585ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
2595ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($x > PHP_INT_MAX) {
26064fa8ba9a99234edd7cf8b09820603c0a2c287eaAntoine Descamps            throw new \InvalidArgumentException("Your platform can't handle ulong correctly. This is a php limitation. Please wait for the extension release.");
2615ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
2625ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
2635ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->bb->putUlong($this->space -= 8, $x);
2645ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
2655ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
2665ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
2675ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
2685ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
2695ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function putFloat($x)
2705ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
2715ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->bb->putFloat($this->space -= 4, $x);
2725ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
2735ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
2745ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
2755ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
2765ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
2775ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function putDouble($x)
2785ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
2795ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->bb->putDouble($this->space -= 8, $x);
2805ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
28169a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    /// @endcond
2825ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
2835ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
28469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * Add a `bool` to the buffer, properly aligned, and grows the buffer (if necessary).
28569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * @param $x The `bool` to add to the buffer.
2865ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
2875ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addBool($x)
2885ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
2895ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->prep(1, 0);
2905ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->putBool($x);
2915ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
2925ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
2935ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
29469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * Add a `byte` to the buffer, properly aligned, and grows the buffer (if necessary).
29569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * @param $x The `byte` to add to the buffer.
2965ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
2975ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addByte($x)
2985ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
2995ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->prep(1, 0);
3005ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->putByte($x);
3015ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
3025ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
3035ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
30469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * Add a `signed byte` to the buffer, properly aligned, and grows the buffer (if necessary).
30569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * @param $x The `signed byte` to add to the buffer.
3065ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
3075ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addSbyte($x)
3085ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
3095ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->prep(1, 0);
3105ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->putSbyte($x);
3115ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
3125ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
3135ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
31469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * Add a `short` to the buffer, properly aligned, and grows the buffer (if necessary).
31569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * @param $x The `short` to add to the buffer.
3165ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
3175ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addShort($x)
3185ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
3195ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->prep(2, 0);
3205ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->putShort($x);
3215ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
3225ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
3235ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
32469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * Add an `unsigned short` to the buffer, properly aligned, and grows the buffer (if necessary).
32569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * @param $x The `unsigned short` to add to the buffer.
3265ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
3275ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addUshort($x)
3285ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
3295ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->prep(2, 0);
3305ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->putUshort($x);
3315ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
3325ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
3335ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
33469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * Add an `int` to the buffer, properly aligned, and grows the buffer (if necessary).
33569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * @param $x The `int` to add to the buffer.
3365ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
3375ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addInt($x)
3385ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
3395ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->prep(4, 0);
3405ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->putInt($x);
3415ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
3425ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
3435ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
34469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * Add an `unsigned int` to the buffer, properly aligned, and grows the buffer (if necessary).
34569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * @param $x The `unsigned int` to add to the buffer.
3465ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
3475ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addUint($x)
3485ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
3495ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->prep(4, 0);
3505ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->putUint($x);
3515ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
3525ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
3535ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
35469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * Add a `long` to the buffer, properly aligned, and grows the buffer (if necessary).
35569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * @param $x The `long` to add to the buffer.
3565ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
3575ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addLong($x)
3585ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
3595ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->prep(8, 0);
3605ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->putLong($x);
3615ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
3625ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
3635ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
36469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * Add an `unsigned long` to the buffer, properly aligned, and grows the buffer (if necessary).
36569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * @param $x The `unsigned long` to add to the buffer.
3665ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
3675ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addUlong($x)
3685ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
3695ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->prep(8, 0);
3705ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->putUlong($x);
3715ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
3725ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
3735ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
37469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * Add a `float` to the buffer, properly aligned, and grows the buffer (if necessary).
37569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * @param $x The `float` to add to the buffer.
3765ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
3775ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addFloat($x)
3785ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
3795ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->prep(4, 0);
3805ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->putFloat($x);
3815ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
3825ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
3835ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
38469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * Add a `double` to the buffer, properly aligned, and grows the buffer (if necessary).
38569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * @param $x The `double` to add to the buffer.
3865ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
3875ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addDouble($x)
3885ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
3895ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->prep(8, 0);
3905ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->putDouble($x);
3915ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
3925ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
39369a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    /// @cond FLATBUFFERS_INTERNAL
3945ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
3955ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $o
3965ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
3975ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $d
3985ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
3995ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addBoolX($o, $x, $d)
4005ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
4015ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($this->force_defaults || $x != $d) {
4025ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->addBool($x);
4035ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->slot($o);
4045ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
4055ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
4065ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
4075ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
4085ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $o
4095ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
4105ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $d
4115ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
4125ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addByteX($o, $x, $d)
4135ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
4145ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($this->force_defaults || $x != $d) {
4155ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->addByte($x);
4165ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->slot($o);
4175ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
4185ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
4195ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
4205ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
4215ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $o
4225ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
4235ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $d
4245ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
4255ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addSbyteX($o, $x, $d)
4265ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
4275ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($this->force_defaults || $x != $d) {
4285ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->addSbyte($x);
4295ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->slot($o);
4305ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
4315ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
4325ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
4335ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
4345ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $o
4355ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
4365ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $d
4375ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
4385ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addShortX($o, $x, $d)
4395ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
4405ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($this->force_defaults || $x != $d) {
4415ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->addShort($x);
4425ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->slot($o);
4435ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
4445ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
4455ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
4465ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
4475ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $o
4485ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
4495ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $d
4505ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
4515ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addUshortX($o, $x, $d)
4525ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
4535ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($this->force_defaults || $x != $d) {
4545ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->addUshort($x);
4555ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->slot($o);
4565ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
4575ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
4585ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
4595ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
4605ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $o
4615ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
4625ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $d
4635ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
4645ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addIntX($o, $x, $d)
4655ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
4665ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($this->force_defaults || $x != $d) {
4675ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->addInt($x);
4685ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->slot($o);
4695ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
4705ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
4715ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
4725ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
4735ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $o
4745ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
4755ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $d
4765ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
4775ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addUintX($o, $x, $d)
4785ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
4795ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($this->force_defaults || $x != $d) {
4805ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->addUint($x);
4815ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->slot($o);
4825ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
4835ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
4845ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
4855ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
4865ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $o
4875ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
4885ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $d
4895ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
4905ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addLongX($o, $x, $d)
4915ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
4925ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($this->force_defaults || $x != $d) {
4935ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->addLong($x);
4945ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->slot($o);
4955ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
4965ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
4975ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
4985ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
4995ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $o
5005ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
5015ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $d
5025ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
5035ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addUlongX($o, $x, $d)
5045ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
5055ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($this->force_defaults || $x != $d) {
5065ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->addUlong($x);
5075ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->slot($o);
5085ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
5095ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
5105ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
5115ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
5125ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
5135ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $o
5145ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
5155ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $d
5165ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
5175ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addFloatX($o, $x, $d)
5185ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
5195ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($this->force_defaults || $x != $d) {
5205ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->addFloat($x);
5215ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->slot($o);
5225ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
5235ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
5245ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
5255ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
5265ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $o
5275ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
5285ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $d
5295ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
5305ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addDoubleX($o, $x, $d)
5315ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
5325ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($this->force_defaults || $x != $d) {
5335ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->addDouble($x);
5345ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->slot($o);
5355ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
5365ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
5375ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
5385ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
5395ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $o
5405ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
5415ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $d
5425ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @throws \Exception
5435ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
5445ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addOffsetX($o, $x, $d)
5455ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
5465ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($this->force_defaults || $x != $d) {
5475ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->addOffset($x);
5485ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->slot($o);
5495ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
5505ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
55169a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    /// @endcond
5525ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
5535ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
55469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * Adds on offset, relative to where it will be written.
55569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * @param $off The offset to add to the buffer.
55669a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * @throws \Exception Throws an exception if `$off` is greater than the underlying ByteBuffer's
55769a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * offest.
5585ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
5595ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addOffset($off)
5605ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
5615ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->prep(Constants::SIZEOF_INT, 0); // Ensure alignment is already done
5625ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($off > $this->offset()) {
5635ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            throw new \Exception("");
5645ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
5655ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
5665ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $off = $this->offset() - $off + Constants::SIZEOF_INT;
5675ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->putInt($off);
5685ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
5695ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
57069a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    /// @cond FLATBUFFERS_INTERNAL
5715ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
5725ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $elem_size
5735ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $num_elems
5745ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $alignment
5755ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @throws \Exception
5765ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
5775ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function startVector($elem_size, $num_elems, $alignment)
5785ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
5795ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->notNested();
5805ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->vector_num_elems = $num_elems;
5815ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->prep(Constants::SIZEOF_INT, $elem_size * $num_elems);
5825ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->prep($alignment, $elem_size * $num_elems); // Just in case alignemnt > int;
5835ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
5845ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
5855ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
5865ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @return int
5875ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
5885ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function endVector()
5895ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
5905ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->putUint($this->vector_num_elems);
5915ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        return $this->offset();
5925ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
5935ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
5945ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    protected function is_utf8($bytes)
5955ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
596dbecdf209de88ed0910ba602d326d33b5aefed93Antoine Descamps        if (function_exists('mb_detect_encoding')) {
597dbecdf209de88ed0910ba602d326d33b5aefed93Antoine Descamps            return (bool) mb_detect_encoding($bytes, 'UTF-8', true);
598dbecdf209de88ed0910ba602d326d33b5aefed93Antoine Descamps        }
599ac1015e3c417ecb18d8f449a4e6aaaff3c4f53b9Wouter van Oortmerssen
6005ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $len = strlen($bytes);
6015ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($len < 1) {
6025ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            /* NOTE: always return 1 when passed string is null */
6035ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            return true;
6045ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
6055ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
6065ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        for ($j = 0, $i = 0; $i < $len; $i++) {
6075ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            // check ACII
6085ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            if ($bytes[$j] == "\x09" ||
6095ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $bytes[$j] == "\x0A" ||
6105ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $bytes[$j] == "\x0D" ||
6115ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                ($bytes[$j] >= "\x20" && $bytes[$j] <= "\x7E")) {
6125ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $j++;
6135ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                continue;
6145ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            }
6155ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
6165ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            /* non-overlong 2-byte */
6175ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            if ((($i+1) <= $len) &&
6185ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                ($bytes[$j] >= "\xC2" && $bytes[$j] <= "\xDF" &&
6195ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                    ($bytes[$j+1] >= "\x80" && $bytes[$j+1] <= "\xBF"))) {
6205ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $j += 2;
6215ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $i++;
6225ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                continue;
6235ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            }
6245ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
6255ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            /* excluding overlongs */
6265ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            if ((($i + 2) <= $len) &&
6275ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $bytes[$j] == "\xE0" &&
6285ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                ($bytes[$j+1] >= "\xA0" && $bytes[$j+1] <= "\xBF" &&
6295ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                    ($bytes[$j+2] >= "\x80" && $bytes[$j+2] <= "\xBF"))) {
6305ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $bytes += 3;
6315ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $i +=2;
6325ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                continue;
6335ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            }
6345ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
6355ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            /* straight 3-byte */
6365ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            if ((($i+2) <= $len) &&
6375ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                (($bytes[$j] >= "\xE1" && $bytes[$j] <= "\xEC") ||
6385ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                    $bytes[$j] == "\xEE" ||
6395ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                    $bytes[$j] = "\xEF") &&
6405ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                ($bytes[$j+1] >= "\x80" && $bytes[$j+1] <= "\xBF") &&
6415ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                ($bytes[$j+2] >= "\x80" && $bytes[$j+2] <= "\xBF")) {
6425ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $j += 3;
6435ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $i += 2;
6445ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                continue;
6455ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            }
6465ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
6475ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            /* excluding surrogates */
6485ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            if ((($i+2) <= $len) &&
6495ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $bytes[$j] == "\xED" &&
6505ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                ($bytes[$j+1] >= "\x80" && $bytes[$j+1] <= "\x9f" &&
6515ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                    ($bytes[$j+2] >= "\x80" && $bytes[$j+2] <= "\xBF"))) {
6525ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $j += 3;
6535ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $i += 2;
6545ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                continue;
6555ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            }
6565ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
6575ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            /* planes 1-3 */
6585ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            if ((($i + 3) <= $len) &&
6595ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $bytes[$j] == "\xF0" &&
6605ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                ($bytes[$j+1] >= "\x90" && $bytes[$j+1] <= "\xBF") &&
6615ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                ($bytes[$j+2] >= "\x80" && $bytes[$j+2] <= "\xBF") &&
6625ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                ($bytes[$j+3] >= "\x80" && $bytes[$j+3] <= "\xBF")) {
6635ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $j += 4;
6645ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $i += 3;
6655ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                continue;
6665ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            }
6675ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
6685ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
6695ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            /* planes 4-15 */
6705ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            if ((($i+3) <= $len) &&
6715ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $bytes[$j] >= "\xF1" && $bytes[$j] <= "\xF3" &&
6725ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $bytes[$j+1] >= "\x80" && $bytes[$j+1] <= "\xBF" &&
6735ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $bytes[$j+2] >= "\x80" && $bytes[$j+2] <= "\xBF" &&
6745ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $bytes[$j+3] >= "\x80" && $bytes[$j+3] <= "\xBF"
6755ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            ) {
6765ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $j += 4;
6775ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $i += 3;
6785ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                continue;
6795ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            }
6805ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
6815ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            /* plane 16 */
6825ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            if ((($i+3) <= $len) &&
6835ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $bytes[$j] == "\xF4" &&
6845ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                ($bytes[$j+1] >= "\x80" && $bytes[$j+1] <= "\x8F") &&
6855ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                ($bytes[$j+2] >= "\x80" && $bytes[$j+2] <= "\xBF") &&
6865ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                ($bytes[$j+3] >= "\x80" && $bytes[$j+3] <= "\xBF")
6875ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            ) {
6885ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $bytes += 4;
6895ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $i += 3;
6905ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                continue;
6915ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            }
6925ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
6935ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
6945ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            return false;
6955ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
6965ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
6975ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        return true;
6985ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
69969a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    /// @endcond
7005ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
7015ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
70269a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * Encode the string `$s` in the buffer using UTF-8.
70369a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * @param string $s The string to encode.
70469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * @return int The offset in the buffer where the encoded string starts.
70569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * @throws InvalidArgumentException Thrown if the input string `$s` is not
70669a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     *     UTF-8.
7075ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
7085ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function createString($s)
7095ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
7105ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if (!$this->is_utf8($s)) {
7115ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            throw new \InvalidArgumentException("string must be utf-8 encoded value.");
7125ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
7135ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
7145ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->notNested();
7155ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->addByte(0); // null terminated
7165ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->startVector(1, strlen($s), 1);
7175ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->space -= strlen($s);
7185ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        for ($i =  $this->space, $j = 0 ; $j < strlen($s) ; $i++, $j++) {
7195ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->bb->_buffer[$i] = $s[$j];
7205ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
7215ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        return $this->endVector();
7225ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
7235ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
72469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    /// @cond FLATBUFFERS_INTERNAL
7255ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
7265ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @throws \Exception
7275ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
7285ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function notNested()
7295ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
7305ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($this->nested) {
7315ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            throw new \Exception("FlatBuffers; object serialization must not be nested");
7325ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
7335ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
7345ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
7355ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
7365ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $obj
7375ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @throws \Exception
7385ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
7395ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function nested($obj)
7405ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
7415ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($obj != $this->offset()) {
7425ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            throw new \Exception("FlatBuffers: struct must be serialized inline");
7435ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
7445ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
7455ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
7465ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
7475ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $numfields
7485ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @throws \Exception
7495ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
7505ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function startObject($numfields)
7515ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
7525ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->notNested();
7535ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($this->vtable == null || count($this->vtable) < $numfields) {
7545ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->vtable = array();
7555ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
7565ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
7575ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->vtable_in_use = $numfields;
7585ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        for ($i = 0; $i < $numfields; $i++) {
7595ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->vtable[$i] = 0;
7605ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
7615ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
7625ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->nested = true;
7635ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->object_start = $this->offset();
7645ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
7655ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
7665ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
7675ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $voffset
7685ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
7695ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $d
7705ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @throws \Exception
7715ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
7725ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addStructX($voffset, $x, $d)
7735ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
7745ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($x != $d) {
7755ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->nested($x);
7765ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->slot($voffset);
7775ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
7785ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
7795ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
7805ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
7815ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $voffset
7825ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $x
7835ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $d
7845ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @throws \Exception
7855ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
7865ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function addStruct($voffset, $x, $d)
7875ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
7885ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($x != $d) {
7895ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->nested($x);
7905ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->slot($voffset);
7915ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
7925ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
7935ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
7945ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
7955ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $voffset
7965ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
7975ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function slot($voffset)
7985ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
7995ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->vtable[$voffset] = $this->offset();
8005ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
8015ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
8025ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
8035ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @return int
8045ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @throws \Exception
8055ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
8065ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function endObject()
8075ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
8085ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($this->vtable == null || !$this->nested) {
8095ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            throw new \Exception("FlatBuffers: endObject called without startObject");
8105ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
8115ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
8125ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->addInt(0);
8135ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $vtableloc = $this->offset();
8145ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
815ac1015e3c417ecb18d8f449a4e6aaaff3c4f53b9Wouter van Oortmerssen        $i = $this->vtable_in_use -1;
816ac1015e3c417ecb18d8f449a4e6aaaff3c4f53b9Wouter van Oortmerssen        // Trim trailing zeroes.
817ac1015e3c417ecb18d8f449a4e6aaaff3c4f53b9Wouter van Oortmerssen        for (; $i >= 0 && $this->vtable[$i] == 0; $i--) {}
818ac1015e3c417ecb18d8f449a4e6aaaff3c4f53b9Wouter van Oortmerssen        $trimmed_size = $i + 1;
819ac1015e3c417ecb18d8f449a4e6aaaff3c4f53b9Wouter van Oortmerssen        for (; $i >= 0; $i--) {
8205ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $off = ($this->vtable[$i] != 0) ? $vtableloc - $this->vtable[$i] : 0;
8215ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->addShort($off);
8225ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
8235ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
8245ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $standard_fields = 2; // the fields below
8255ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->addShort($vtableloc - $this->object_start);
826ac1015e3c417ecb18d8f449a4e6aaaff3c4f53b9Wouter van Oortmerssen        $this->addShort(($trimmed_size + $standard_fields) * Constants::SIZEOF_SHORT);
8275ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
8285ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        // search for an existing vtable that matches the current one.
8295ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $existing_vtable = 0;
8305ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
8315ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        for ($i = 0; $i < $this->num_vtables; $i++) {
8325ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $vt1 = $this->bb->capacity() - $this->vtables[$i];
8335ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $vt2 = $this->space;
8345ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
8355ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $len = $this->bb->getShort($vt1);
8365ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
8375ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            if ($len == $this->bb->getShort($vt2)) {
8385ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                for ($j = Constants::SIZEOF_SHORT; $j < $len; $j += Constants::SIZEOF_SHORT) {
8395ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                    if ($this->bb->getShort($vt1 + $j) != $this->bb->getShort($vt2 + $j)) {
8405ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                        continue 2;
8415ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                    }
8425ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                }
8435ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $existing_vtable = $this->vtables[$i];
8445ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                break;
8455ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            }
8465ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
8475ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
8485ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($existing_vtable != 0) {
8495ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            // Found a match:
8505ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            // Remove the current vtable
8515ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->space = $this->bb->capacity() - $vtableloc;
8525ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->bb->putInt($this->space, $existing_vtable - $vtableloc);
8535ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        } else {
8545ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            // No Match:
8555ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            // Add the location of the current vtable to the list of vtables
8565ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            if ($this->num_vtables == count($this->vtables)) {
8575ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $vtables = $this->vtables;
8585ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $this->vtables = array();
8595ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                // copy of
8605ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                for ($i = 0; $i < count($vtables) * 2; $i++) {
8615ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                    $this->vtables[$i] = ($i < count($vtables)) ? $vtables[$i] : 0;
8625ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                }
8635ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            }
8645ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->vtables[$this->num_vtables++] = $this->offset();
8655ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->bb->putInt($this->bb->capacity() - $vtableloc, $this->offset() - $vtableloc);
8665ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
8675ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
8685ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->nested = false;
8695ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->vtable = null;
8705ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        return $vtableloc;
8715ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
8725ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
8735ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
8745ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $table
8755ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @param $field
8765ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @throws \Exception
8775ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
8785ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function required($table, $field)
8795ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
8805ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $table_start = $this->bb->capacity() - $table;
8815ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $vtable_start = $table_start - $this->bb->getInt($table_start);
8825ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $ok = $this->bb->getShort($vtable_start + $field) != 0;
8835ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
8845ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if (!$ok) {
8855ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            throw new \Exception("FlatBuffers: field "  . $field  .  " must be set");
8865ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
8875ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
88869a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    /// @endcond
8895ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
8905ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
89169a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * Finalize a buffer, pointing to the given `$root_table`.
89269a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * @param $root_table An offest to be added to the buffer.
89369a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * @param $file_identifier A FlatBuffer file identifier to be added to the
89469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     *     buffer before `$root_table`. This defaults to `null`.
89569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * @throws InvalidArgumentException Thrown if an invalid `$identifier` is
89669a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     *     given, where its length is not equal to
89769a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     *    `Constants::FILE_IDENTIFIER_LENGTH`.
8985ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
8995ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function finish($root_table, $identifier = null)
9005ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
9015ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        if ($identifier == null) {
9025ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->prep($this->minalign, Constants::SIZEOF_INT);
9035ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->addOffset($root_table);
9045ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->bb->setPosition($this->space);
9055ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        } else {
9065ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->prep($this->minalign, Constants::SIZEOF_INT + Constants::FILE_IDENTIFIER_LENGTH);
9075ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            if (strlen($identifier) != Constants::FILE_IDENTIFIER_LENGTH) {
9085ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                throw new \InvalidArgumentException(
9095ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                    sprintf("FlatBuffers: file identifier must be length %d",
9105ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                        Constants::FILE_IDENTIFIER_LENGTH));
9115ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            }
9125ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
9135ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            for ($i = Constants::FILE_IDENTIFIER_LENGTH - 1; $i >= 0;
9145ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                  $i--) {
9155ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma                $this->addByte(ord($identifier[$i]));
9165ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            }
9175ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma            $this->finish($root_table);
9185ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        }
9195ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
9205ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
9215ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
92269a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * In order to save space, fields that are set to their default value don't
92369a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * get serialized into the buffer.
92469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * @param bool $forceDefaults When set to `true`, always serializes default
92569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     *     values.
9265ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
9275ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function forceDefaults($forceDefaults)
9285ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
9295ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->force_defaults = $forceDefaults;
9305ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
9315ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
9325ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
93369a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * Get the ByteBuffer representing the FlatBuffer.
93469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * @return ByteBuffer The ByteBuffer containing the FlatBuffer data.
9355ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
9365ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function dataBuffer()
9375ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
9385ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        return $this->bb;
9395ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
9405ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
94169a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    /// @cond FLATBUFFERS_INTERNAL
9425ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
9435ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     * @return int
9445ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
9455ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function dataStart()
9465ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
9475ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        return $this->space;
9485ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
94969a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    /// @endcond
9505ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
9515ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    /**
95269a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * Utility function to copy and return the FlatBuffer data from the
95369a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * underlying ByteBuffer.
95469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * @return string A string (representing a byte[]) that contains a copy
95569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara     * of the FlatBuffer data.
9565ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma     */
9575ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    public function sizedByteArray()
9585ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    {
9595ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $start = $this->space;
9605ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $length = $this->bb->capacity() - $this->space;
9615ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
9625ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $result = str_repeat("\0", $length);
9635ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->bb->setPosition($start);
9645ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        $this->bb->getX($result);
9655ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma
9665ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma        return $result;
9675ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma    }
9685ce86826718c938e38b0f57e4bc5840fe15a1565Shuhei Taunma}
96969a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara
97069a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara/// @}
971