code: def type_name(self, t, generate=True):
          
          # no Test case for these
          # elif isinstance(t, typedesc.Argument):
          # elif isinstance(t, typedesc.CvQualifiedType):
          # elif isinstance(t, typedesc.Variable):
          #   return "%s" % self.type_name(t.typ, generate)
          # elif isinstance(t, typedesc.Enumeration):
          #   return t.name
  
          if isinstance(t, typedesc.FundamentalType):
              return self.FundamentalType(t)
          elif isinstance(t, typedesc.ArrayType):
              return "%s * %s" % (self.type_name(t.typ, generate), t.size)
          elif isinstance(t, typedesc.PointerType):
              self.enable_pointer_type()
              return "POINTER_T(%s)" % (self.type_name(t.typ, generate))
          elif isinstance(t, typedesc.FunctionType):
              args = [
                  self.type_name(
                      x,
                      generate) for x in [
                      t.returns] +
                  list(
                      t.iterArgTypes())]
              if "__stdcall__" in t.attributes:
                  return "ctypes.WINFUNCTYPE(%s)" % ", ".join(args)
              else:
                  return "ctypes.CFUNCTYPE(%s)" % ", ".join(args)
          # elif isinstance(t, typedesc.Structure):
          # elif isinstance(t, typedesc.Typedef):
          # elif isinstance(t, typedesc.Union):
          return t.name
docs: Returns a string containing an expression that can be used to
          refer to the type. Assumes the 'from ctypes import *'
          namespace is available.