class_docstr: Base API generator class. We derive several subclasses to implement
  the different backends.
class_docstr_tok: ["Base","API","generator","class",".","We","derive","several","subclasses","to","implement","the","different","backends","."]
code: def _add_function_group(
      self, des: FunctionDescription
  ) -> tuple[set, set, set]:
      lines = self.lines
      handled = True
  
      # Create map to es2 function objects
      es2funcs = {}
      for f in des.es2.group:
          cname = f.shortname
          es2funcs[cname] = f
  
      if des.name == "uniform":
          for t in ("float", "int"):
              for i in (1, 2, 3, 4):
                  args = ", ".join(["v%i" % j for j in range(1, i + 1)])
                  cname = "uniform%i%s" % (i, t[0])
                  sig = "%s(location, %s)" % (apiname(cname), args)
                  self._add_group_function(des, sig, es2funcs[cname])
          for t in ("float", "int"):
              for i in (1, 2, 3, 4):
                  cname = "uniform%i%sv" % (i, t[0])
                  sig = "%s(location, count, values)" % apiname(cname)
                  self._add_group_function(des, sig, es2funcs[cname])
      elif des.name == "uniformMatrix":
          for i in (2, 3, 4):
              cname = "uniformMatrix%ifv" % i
              sig = "%s(location, count, transpose, values)" % apiname(
                  cname
              )
              self._add_group_function(des, sig, es2funcs[cname])
      elif des.name == "vertexAttrib":
          for i in (1, 2, 3, 4):
              args = ", ".join(["v%i" % j for j in range(1, i + 1)])
              cname = "vertexAttrib%if" % i
              sig = "%s(index, %s)" % (apiname(cname), args)
              self._add_group_function(des, sig, es2funcs[cname])
      elif des.name == "texParameter":
          for t in ("float", "int"):
              cname = "texParameter%s" % t[0]
              sig = "%s(target, pname, param)" % apiname(cname)
              self._add_group_function(des, sig, es2funcs[cname])
      else:
          handled = False
  
      if handled:
          self.functions_auto.add(des.name)
      else:
          self.functions_todo.add(des.name)
          lines.append("# todo: Dont know group %s" % des.name)
  
imports: from __future__ import annotations
  import os
  import sys
  import headerparser
  from annotations import parse_anotations
  from OpenGL import GL
label_desc: Use image node_id 5 for calling the ApiGenerator obj's underlying member method code with example usage: obj._add_function_group(des) without return types