diff --git a/BeefLibs/corlib/src/Enum.bf b/BeefLibs/corlib/src/Enum.bf index f39872e1..33b04902 100644 --- a/BeefLibs/corlib/src/Enum.bf +++ b/BeefLibs/corlib/src/Enum.bf @@ -30,12 +30,132 @@ 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 EnumFieldsEnumerator + where TEnum : enum + { + TypeInstance mTypeInstance; + int32 mIdx; + + public this() + { + mTypeInstance = typeof(TEnum) as TypeInstance; + mIdx = -1; + } + + public void Reset() mut + { + 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()) + return .Err; + return Current; + } + } + + public struct EnumValuesEnumerator : EnumFieldsEnumerator, 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 : EnumFieldsEnumerator, 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; + } + } } }