普通文本  |  117行  |  2.78 KB

# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

class Interface(object):
  def __init__(self):
    self.functions = []

  def Func(self, name, return_type):
    f = Function(self, len(self.functions), name, return_type)
    self.functions.append(f)
    return f

  def Finalize(self):
    for f in self.functions:
      f.Finalize()

class Function(object):
  def __init__(self, parent, uid, name, return_type):
    self.parent = parent
    self.uid = uid
    self.name = name
    self.return_type = return_type
    self.params = []
    self.param_by_name = {}
    self.result_param = None

  def Param(self, name, param_type=None):
    p = Param(self, len(self.params), name, param_type)
    self.params.append(p)
    self.param_by_name[name] = p
    return p

  def ParamList(self):
    return [param.param_type + ' ' + param.name for param in self.params]

  def ParamDecl(self):
    if self.params:
      return ', '.join(self.ParamList())
    else:
      return 'void'

  def Finalize(self):
    self.result_param = Param(self, len(self.params), 'result')
    self.result_param.Out(self.return_type)

class Param(object):
  def __init__(self, parent, uid, name, param_type=None):
    self.parent = parent
    self.uid = uid
    self.name = name
    self.base_type = param_type
    self.param_type = param_type
    self.size = None
    self.is_input = False
    self.is_output = False
    self.is_array = False
    self.is_struct = False
    self.is_optional = False

  def GetSizeParam(self):
    assert self.size
    return self.parent.param_by_name[self.size]

  def In(self, ty):
    self.base_type = ty
    self.param_type = ty
    self.is_input = True
    return self

  def InArray(self, ty, size):
    self.base_type = ty
    self.param_type = 'const ' + ty + '*'
    self.size = size
    self.is_input = True
    self.is_array = True
    return self

  def InStruct(self, ty):
    self.base_type = ty
    self.param_type = 'const struct ' + ty + '*'
    self.is_input = True
    self.is_struct = True
    return self

  def InOut(self, ty):
    self.base_type = ty
    self.param_type = ty + '*'
    self.is_input = True
    self.is_output = True
    return self

  def Out(self, ty):
    self.base_type = ty
    self.param_type = ty + '*'
    self.is_output = True
    return self

  def OutArray(self, ty, size):
    self.base_type = ty
    self.param_type = ty + '*'
    self.size = size
    self.is_array = True
    self.is_output = True
    return self

  def Optional(self):
    assert not self.IsPassedByValue()
    self.is_optional = True
    return self

  def IsScalar(self):
    return not self.is_array and not self.is_struct

  def IsPassedByValue(self):
    return not self.is_output and self.IsScalar()