<?php
namespace Airavata\Model\Scheduling;

/**
 * Autogenerated by Thrift Compiler (0.9.3)
 *
 * 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;


/**
 * ComputationalResourceSchedulingModel:
 * 
 * 
 */
class ComputationalResourceSchedulingModel {
  static $_TSPEC;

  /**
   * @var string
   */
  public $resourceHostId = null;
  /**
   * @var int
   */
  public $totalCPUCount = null;
  /**
   * @var int
   */
  public $nodeCount = null;
  /**
   * @var int
   */
  public $numberOfThreads = null;
  /**
   * @var string
   */
  public $queueName = null;
  /**
   * @var int
   */
  public $wallTimeLimit = null;
  /**
   * @var int
   */
  public $totalPhysicalMemory = null;
  /**
   * @var string
   */
  public $chessisNumber = null;
  /**
   * @var string
   */
  public $staticWorkingDir = null;
  /**
   * @var string
   */
  public $overrideLoginUserName = null;
  /**
   * @var string
   */
  public $overrideScratchLocation = null;
  /**
   * @var string
   */
  public $overrideAllocationProjectNumber = null;

  public function __construct($vals=null) {
    if (!isset(self::$_TSPEC)) {
      self::$_TSPEC = array(
        1 => array(
          'var' => 'resourceHostId',
          'type' => TType::STRING,
          ),
        2 => array(
          'var' => 'totalCPUCount',
          'type' => TType::I32,
          ),
        3 => array(
          'var' => 'nodeCount',
          'type' => TType::I32,
          ),
        4 => array(
          'var' => 'numberOfThreads',
          'type' => TType::I32,
          ),
        5 => array(
          'var' => 'queueName',
          'type' => TType::STRING,
          ),
        6 => array(
          'var' => 'wallTimeLimit',
          'type' => TType::I32,
          ),
        7 => array(
          'var' => 'totalPhysicalMemory',
          'type' => TType::I32,
          ),
        8 => array(
          'var' => 'chessisNumber',
          'type' => TType::STRING,
          ),
        9 => array(
          'var' => 'staticWorkingDir',
          'type' => TType::STRING,
          ),
        10 => array(
          'var' => 'overrideLoginUserName',
          'type' => TType::STRING,
          ),
        11 => array(
          'var' => 'overrideScratchLocation',
          'type' => TType::STRING,
          ),
        12 => array(
          'var' => 'overrideAllocationProjectNumber',
          'type' => TType::STRING,
          ),
        );
    }
    if (is_array($vals)) {
      if (isset($vals['resourceHostId'])) {
        $this->resourceHostId = $vals['resourceHostId'];
      }
      if (isset($vals['totalCPUCount'])) {
        $this->totalCPUCount = $vals['totalCPUCount'];
      }
      if (isset($vals['nodeCount'])) {
        $this->nodeCount = $vals['nodeCount'];
      }
      if (isset($vals['numberOfThreads'])) {
        $this->numberOfThreads = $vals['numberOfThreads'];
      }
      if (isset($vals['queueName'])) {
        $this->queueName = $vals['queueName'];
      }
      if (isset($vals['wallTimeLimit'])) {
        $this->wallTimeLimit = $vals['wallTimeLimit'];
      }
      if (isset($vals['totalPhysicalMemory'])) {
        $this->totalPhysicalMemory = $vals['totalPhysicalMemory'];
      }
      if (isset($vals['chessisNumber'])) {
        $this->chessisNumber = $vals['chessisNumber'];
      }
      if (isset($vals['staticWorkingDir'])) {
        $this->staticWorkingDir = $vals['staticWorkingDir'];
      }
      if (isset($vals['overrideLoginUserName'])) {
        $this->overrideLoginUserName = $vals['overrideLoginUserName'];
      }
      if (isset($vals['overrideScratchLocation'])) {
        $this->overrideScratchLocation = $vals['overrideScratchLocation'];
      }
      if (isset($vals['overrideAllocationProjectNumber'])) {
        $this->overrideAllocationProjectNumber = $vals['overrideAllocationProjectNumber'];
      }
    }
  }

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

  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::STRING) {
            $xfer += $input->readString($this->resourceHostId);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 2:
          if ($ftype == TType::I32) {
            $xfer += $input->readI32($this->totalCPUCount);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 3:
          if ($ftype == TType::I32) {
            $xfer += $input->readI32($this->nodeCount);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 4:
          if ($ftype == TType::I32) {
            $xfer += $input->readI32($this->numberOfThreads);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 5:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->queueName);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 6:
          if ($ftype == TType::I32) {
            $xfer += $input->readI32($this->wallTimeLimit);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 7:
          if ($ftype == TType::I32) {
            $xfer += $input->readI32($this->totalPhysicalMemory);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 8:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->chessisNumber);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 9:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->staticWorkingDir);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 10:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->overrideLoginUserName);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 11:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->overrideScratchLocation);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 12:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->overrideAllocationProjectNumber);
          } 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('ComputationalResourceSchedulingModel');
    if ($this->resourceHostId !== null) {
      $xfer += $output->writeFieldBegin('resourceHostId', TType::STRING, 1);
      $xfer += $output->writeString($this->resourceHostId);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->totalCPUCount !== null) {
      $xfer += $output->writeFieldBegin('totalCPUCount', TType::I32, 2);
      $xfer += $output->writeI32($this->totalCPUCount);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->nodeCount !== null) {
      $xfer += $output->writeFieldBegin('nodeCount', TType::I32, 3);
      $xfer += $output->writeI32($this->nodeCount);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->numberOfThreads !== null) {
      $xfer += $output->writeFieldBegin('numberOfThreads', TType::I32, 4);
      $xfer += $output->writeI32($this->numberOfThreads);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->queueName !== null) {
      $xfer += $output->writeFieldBegin('queueName', TType::STRING, 5);
      $xfer += $output->writeString($this->queueName);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->wallTimeLimit !== null) {
      $xfer += $output->writeFieldBegin('wallTimeLimit', TType::I32, 6);
      $xfer += $output->writeI32($this->wallTimeLimit);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->totalPhysicalMemory !== null) {
      $xfer += $output->writeFieldBegin('totalPhysicalMemory', TType::I32, 7);
      $xfer += $output->writeI32($this->totalPhysicalMemory);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->chessisNumber !== null) {
      $xfer += $output->writeFieldBegin('chessisNumber', TType::STRING, 8);
      $xfer += $output->writeString($this->chessisNumber);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->staticWorkingDir !== null) {
      $xfer += $output->writeFieldBegin('staticWorkingDir', TType::STRING, 9);
      $xfer += $output->writeString($this->staticWorkingDir);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->overrideLoginUserName !== null) {
      $xfer += $output->writeFieldBegin('overrideLoginUserName', TType::STRING, 10);
      $xfer += $output->writeString($this->overrideLoginUserName);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->overrideScratchLocation !== null) {
      $xfer += $output->writeFieldBegin('overrideScratchLocation', TType::STRING, 11);
      $xfer += $output->writeString($this->overrideScratchLocation);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->overrideAllocationProjectNumber !== null) {
      $xfer += $output->writeFieldBegin('overrideAllocationProjectNumber', TType::STRING, 12);
      $xfer += $output->writeString($this->overrideAllocationProjectNumber);
      $xfer += $output->writeFieldEnd();
    }
    $xfer += $output->writeFieldStop();
    $xfer += $output->writeStructEnd();
    return $xfer;
  }

}


