<?php
/**
 * Autogenerated by Thrift Compiler (0.16.0)
 *
 * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 *  @generated
 */
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;

class TTypeDesc
{
    static public $isValidate = false;

    static public $_TSPEC = array(
        1 => array(
            'var' => 'types',
            'isRequired' => true,
            'type' => TType::LST,
            'etype' => TType::STRUCT,
            'elem' => array(
                'type' => TType::STRUCT,
                'class' => '\TTypeEntry',
                ),
        ),
    );

    /**
     * @var \TTypeEntry[]
     */
    public $types = null;

    public function __construct($vals = null)
    {
        if (is_array($vals)) {
            if (isset($vals['types'])) {
                $this->types = $vals['types'];
            }
        }
    }

    public function getName()
    {
        return 'TTypeDesc';
    }


    public function read($input)
    {
        $xfer = 0;
        $fname = null;
        $ftype = 0;
        $fid = 0;
        $xfer += $input->readStructBegin($fname);
        while (true) {
            $xfer += $input->readFieldBegin($fname, $ftype, $fid);
            if ($ftype == TType::STOP) {
                break;
            }
            switch ($fid) {
                case 1:
                    if ($ftype == TType::LST) {
                        $this->types = array();
                        $_size27 = 0;
                        $_etype30 = 0;
                        $xfer += $input->readListBegin($_etype30, $_size27);
                        for ($_i31 = 0; $_i31 < $_size27; ++$_i31) {
                            $elem32 = null;
                            $elem32 = new \TTypeEntry();
                            $xfer += $elem32->read($input);
                            $this->types []= $elem32;
                        }
                        $xfer += $input->readListEnd();
                    } else {
                        $xfer += $input->skip($ftype);
                    }
                    break;
                default:
                    $xfer += $input->skip($ftype);
                    break;
            }
            $xfer += $input->readFieldEnd();
        }
        $xfer += $input->readStructEnd();
        return $xfer;
    }

    public function write($output)
    {
        $xfer = 0;
        $xfer += $output->writeStructBegin('TTypeDesc');
        if ($this->types !== null) {
            if (!is_array($this->types)) {
                throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
            }
            $xfer += $output->writeFieldBegin('types', TType::LST, 1);
            $output->writeListBegin(TType::STRUCT, count($this->types));
            foreach ($this->types as $iter33) {
                $xfer += $iter33->write($output);
            }
            $output->writeListEnd();
            $xfer += $output->writeFieldEnd();
        }
        $xfer += $output->writeFieldStop();
        $xfer += $output->writeStructEnd();
        return $xfer;
    }
}
