This is an automated email from the ASF dual-hosted git repository.

junrushao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm-ffi.git


The following commit(s) were added to refs/heads/main by this push:
     new fc6cf8a  fix(enum): add class iteration and len (#558)
fc6cf8a is described below

commit fc6cf8a0596b6cc1a7f3b453d18bab3c60310622
Author: Junru Shao <[email protected]>
AuthorDate: Mon Apr 20 12:29:20 2026 -0700

    fix(enum): add class iteration and len (#558)
---
 python/tvm_ffi/dataclasses/enum.py  | 17 ++++++++++++++++-
 tests/python/test_dataclass_enum.py | 10 ++++++++++
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/python/tvm_ffi/dataclasses/enum.py 
b/python/tvm_ffi/dataclasses/enum.py
index cc130ea..610c6c3 100644
--- a/python/tvm_ffi/dataclasses/enum.py
+++ b/python/tvm_ffi/dataclasses/enum.py
@@ -207,6 +207,21 @@ class _ClassProperty:
 # ---------------------------------------------------------------------------
 
 
+class _EnumMeta(type(Object)):
+    """Metaclass for :class:`Enum` that wires class-level iteration and length.
+
+    Kept as a dedicated subclass of ``type(Object)`` so ``iter(MyEnum)`` and
+    ``len(MyEnum)`` only resolve on :class:`Enum` subclasses, rather than
+    mutating the shared ``Object`` metaclass globally.
+    """
+
+    def __iter__(cls) -> Iterator[Any]:
+        return iter(cls.by_value)  # ty: ignore[unresolved-attribute]
+
+    def __len__(cls) -> int:
+        return len(cls.by_value)  # ty: ignore[unresolved-attribute]
+
+
 @dataclass_transform(
     eq_default=False,
     order_default=False,
@@ -214,7 +229,7 @@ class _ClassProperty:
     field_specifiers=(Field, field, entry, auto),
 )
 @c_class("ffi.Enum", init=False)
-class Enum(Object):
+class Enum(Object, metaclass=_EnumMeta):
     """A named-singleton registry with cross-language identity.
 
     Subclasses declare variants: frozen, named, ordinal-indexed
diff --git a/tests/python/test_dataclass_enum.py 
b/tests/python/test_dataclass_enum.py
index af16601..d5a7925 100644
--- a/tests/python/test_dataclass_enum.py
+++ b/tests/python/test_dataclass_enum.py
@@ -118,6 +118,16 @@ def test_entries_iteration_order() -> None:
     assert values[2].same_as(Ordered.c)
 
 
+def test_class_iteration_and_len() -> None:
+    class Ordered(Enum, type_key=_unique_key("OrderedIter")):
+        a = auto()
+        b = auto()
+        c = auto()
+
+    assert list(Ordered) == [Ordered.a, Ordered.b, Ordered.c]
+    assert len(Ordered) == 3
+
+
 def test_frozen_variants() -> None:
     class Frozen(Enum, type_key=_unique_key("Frozen")):
         flag: bool

Reply via email to