gen_dispatch.py contains a function used to sort Enums, and uses cmp. This patch moves that logic into the Enum class using rich comparison methods instead.
Signed-off-by: Dylan Baker <dylanx.c.ba...@intel.com> --- registry/gl.py | 62 ++++++++++++++++++++++++++++++++++++++++++++++ tests/util/gen_dispatch.py | 42 ++----------------------------- 2 files changed, 64 insertions(+), 40 deletions(-) diff --git a/registry/gl.py b/registry/gl.py index 99f4a41..fafd42f 100644 --- a/registry/gl.py +++ b/registry/gl.py @@ -1076,6 +1076,7 @@ class EnumGroup(object): self.type = 'special' +@functools.total_ordering class Enum(object): """An <enum> XML element. @@ -1122,6 +1123,67 @@ class Enum(object): ' value={self.str_value!r})') return templ.format(self=self) + def __eq__(self, other): + if self.num_value != other.num_value: + return False + elif (self.vendor_namespace is None) != (other.vendor_namespace is None): + return False + elif (self.vendor_namespace in Extension.RATIFIED_NAMESPACES) != \ + (other.vendor_namespace in Extension.RATIFIED_NAMESPACES): + return False + elif (self.vendor_namespace == 'EXT') != \ + (other.vendor_namespace == 'EXT'): + return False + elif self.name != other.name: + return False + return self.api == other.api + + def __lt__(self, other): # pylint: disable=too-many-return-statements + """Less than. + + Sort by numerical value, then vendor_namspace (first for ratified, then + for EXT), then by full name, and finally by api. + + This sort order ensures that names provided by core specifications + precede thos provided by ratified extensions, which procede those + provided by unratified extensions. + + For example: GL_RED < GL_RED_EXT < GL_RED_INTEL + + """ + if self.num_value != other.num_value: + if self.num_value < other.num_value: + return True + return False + + x = self.vendor_namespace is None + y = other.vendor_namespace is None + if x != y: + if x and not y: + return True + return False + + x = self.vendor_namespace in Extension.RATIFIED_NAMESPACES + y = other.vendor_namespace in Extension.RATIFIED_NAMESPACES + if x != y: + if x and not y: + return True + return False + + x = self.vendor_namespace == 'EXT' + y = other.vendor_namespace == 'EXT' + if x != y: + if x and not y: + return True + return False + + if self.name != other.name: + if self.name < other.name: + return True + return False + + return self.api < other.api + @property def vendor_namespace(self): if self.__vendor_namespace is None: diff --git a/tests/util/gen_dispatch.py b/tests/util/gen_dispatch.py index 46869f8..6bfd6c0 100644 --- a/tests/util/gen_dispatch.py +++ b/tests/util/gen_dispatch.py @@ -39,7 +39,6 @@ PIGLIT_TOP_DIR = os.path.join(os.path.dirname(__file__), '..', '..') sys.path.append(PIGLIT_TOP_DIR) import registry.gl -from registry.gl import Extension debug = False @@ -142,45 +141,8 @@ class EnumCode(object): @classmethod def get_unique_enums_in_default_namespace(cls, gl_registry): - def cmp_enums(x, y): - # Sort enums by numerical value, then by vendor namespace, then by - # full name. Given a set of synonymous names for a given enum - # value, this sort order ensures that names provided by core - # specifications precede those provided by ratified extensions, - # which precede thos provided by unratified extensions. - # - # For example, GL_RED will precede GL_RED_EXT will precede - # GL_RED_INTEL. - # - c = cmp(x.num_value, y.num_value) - if c != 0: - return c - - c = cmp(y.vendor_namespace is None, - x.vendor_namespace is None) - if c != 0: - return c - - c = cmp(y.vendor_namespace in Extension.RATIFIED_NAMESPACES, - x.vendor_namespace in Extension.RATIFIED_NAMESPACES) - if c != 0: - return c - - c = cmp(y.vendor_namespace == 'EXT', - x.vendor_namespace == 'EXT') - if c != 0: - return c - - c = cmp(x.name, y.name) - if c != 0: - return c - - return cmp(x.api, y.api) - def append_enum_if_new_value(enum_list, enum): - diff = cmp(enum_list[-1].num_value, enum.num_value) - assert(diff <= 0) - if diff < 0: + if enum_list[-1].num_value < enum.num_value: enum_list.append(enum) return enum_list @@ -190,7 +152,7 @@ class EnumCode(object): if enum_group.type == 'default_namespace' for enum in enum_group.enums ) - enums = sorted(enums, cmp=cmp_enums) + enums = sorted(enums) enums = reduce(append_enum_if_new_value, enums[1:], [enums[0]]) return enums -- 2.2.1 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/piglit