From 60c0377d95b7487dad257dc5f44d7c1d7814cfa9 Mon Sep 17 00:00:00 2001 From: disarray2077 <86157825+disarray2077@users.noreply.github.com> Date: Mon, 27 Dec 2021 13:45:52 -0300 Subject: [PATCH 1/2] Add IsDefined, GetValues and GetNames to Enum class --- BeefLibs/corlib/src/Enum.bf | 118 ++++++++++++++++++++++++++++++++++-- 1 file changed, 112 insertions(+), 6 deletions(-) diff --git a/BeefLibs/corlib/src/Enum.bf b/BeefLibs/corlib/src/Enum.bf index f39872e1..1137494e 100644 --- a/BeefLibs/corlib/src/Enum.bf +++ b/BeefLibs/corlib/src/Enum.bf @@ -30,12 +30,118 @@ namespace System return .Err; } - /*public override void ToString(String strBuffer) mut + public static bool IsDefined(T value) + where T : enum { - Type type = GetType(); - int32* iPtr = (int32*)((int)(&this) + (int)type.Size); - EnumToString(type, strBuffer, *iPtr); - //EnumToString(GetType(), ) - }*/ + var typeInst = (TypeInstance)typeof(T); + for (var field in typeInst.GetFields()) + { + if (field.[Friend]mFieldData.[Friend]mData == (.)value) + return true; + } + + return false; + } + + public static readonly EnumValuesEnumerator GetValues() + where TEnum : enum + { + return .(); + } + + public static readonly EnumNamesEnumerator GetNames() + where TEnum : enum + { + return .(); + } + + private struct EnumFieldsEnumeratorWrapper + where TEnum : enum + { + FieldInfo.Enumerator mEnumerator; + + public this() + { + mEnumerator = typeof(TEnum).GetFields(); + } + + public int Index + { + 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(); + } + + public void Dispose() + { + } + + public Result GetNext() mut + { + if (!MoveNext()) + return .Err; + return Current; + } + } + + public struct EnumValuesEnumerator : EnumFieldsEnumeratorWrapper, IEnumerator + where TEnum : enum + { + public new TEnum Current + { + get + { + return (.)base.Current.[Friend]mFieldData.[Friend]mData; + } + } + + public new Result GetNext() mut + { + if (!MoveNext()) + return .Err; + return Current; + } + } + + public struct EnumNamesEnumerator : EnumFieldsEnumeratorWrapper, IEnumerator + where TEnum : enum + { + public new StringView Current + { + get + { + return (.)base.Current.[Friend]mFieldData.[Friend]mName; + } + } + + public new Result GetNext() mut + { + if (!MoveNext()) + return .Err; + return Current; + } + } } } 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 2/2] 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