From f0bd5ceea59ccb4ddd2912d113de361c82b6e919 Mon Sep 17 00:00:00 2001 From: disarray2077 <86157825+disarray2077@users.noreply.github.com> Date: Mon, 27 Dec 2021 16:06:05 -0300 Subject: [PATCH] Fix enum fields enumerator --- BeefLibs/corlib/src/Enum.bf | 76 ++++++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 31 deletions(-) diff --git a/BeefLibs/corlib/src/Enum.bf b/BeefLibs/corlib/src/Enum.bf index 1137494e..33b04902 100644 --- a/BeefLibs/corlib/src/Enum.bf +++ b/BeefLibs/corlib/src/Enum.bf @@ -55,49 +55,63 @@ namespace System return .(); } - private struct EnumFieldsEnumeratorWrapper + private struct EnumFieldsEnumerator where TEnum : enum { - FieldInfo.Enumerator mEnumerator; + TypeInstance mTypeInstance; + int32 mIdx; public this() { - mEnumerator = typeof(TEnum).GetFields(); + mTypeInstance = typeof(TEnum) as TypeInstance; + mIdx = -1; } - public int Index + public void Reset() mut { - get - { - return mEnumerator.Index; - } - } - - public int Count - { - get - { - return mEnumerator.mTypeInstance.[Friend]mFieldDataCount; - } - } - - public FieldInfo Current - { - get - { - return (.)mEnumerator.Current; - } - } - - public bool MoveNext() mut - { - return mEnumerator.MoveNext(); + mIdx = -1; } public void Dispose() { } + public bool MoveNext() mut + { + if (mTypeInstance == null) + return false; + + TypeInstance.FieldData* fieldData = null; + + repeat + { + mIdx++; + if (mIdx == mTypeInstance.[Friend]mFieldDataCount) + return false; + fieldData = &mTypeInstance.[Friend]mFieldDataPtr[mIdx]; + } + while (!fieldData.mFlags.HasFlag(.EnumCase)); + + return true; + } + + public FieldInfo Current + { + get + { + var fieldData = &mTypeInstance.[Friend]mFieldDataPtr[mIdx]; + return FieldInfo(mTypeInstance, fieldData); + } + } + + public int32 Index + { + get + { + return mIdx; + } + } + public Result GetNext() mut { if (!MoveNext()) @@ -106,7 +120,7 @@ namespace System } } - public struct EnumValuesEnumerator : EnumFieldsEnumeratorWrapper, IEnumerator + public struct EnumValuesEnumerator : EnumFieldsEnumerator, IEnumerator where TEnum : enum { public new TEnum Current @@ -125,7 +139,7 @@ namespace System } } - public struct EnumNamesEnumerator : EnumFieldsEnumeratorWrapper, IEnumerator + public struct EnumNamesEnumerator : EnumFieldsEnumerator, IEnumerator where TEnum : enum { public new StringView Current