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; + } + } } }