1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-16 15:24:10 +02:00

Merge pull request #1308 from disarray2077/patch-4

Add IsDefined<T>, GetValues<T> and GetNames<T> to Enum class
This commit is contained in:
Brian Fiete 2021-12-27 20:28:28 +01:00 committed by GitHub
commit c5e1e70409
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -30,12 +30,132 @@ namespace System
return .Err; return .Err;
} }
/*public override void ToString(String strBuffer) mut public static bool IsDefined<T>(T value)
where T : enum
{ {
Type type = GetType(); var typeInst = (TypeInstance)typeof(T);
int32* iPtr = (int32*)((int)(&this) + (int)type.Size); for (var field in typeInst.GetFields())
EnumToString(type, strBuffer, *iPtr); {
//EnumToString(GetType(), ) if (field.[Friend]mFieldData.[Friend]mData == (.)value)
}*/ return true;
}
return false;
}
public static readonly EnumValuesEnumerator<TEnum> GetValues<TEnum>()
where TEnum : enum
{
return .();
}
public static readonly EnumNamesEnumerator<TEnum> GetNames<TEnum>()
where TEnum : enum
{
return .();
}
private struct EnumFieldsEnumerator<TEnum>
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<FieldInfo> GetNext() mut
{
if (!MoveNext())
return .Err;
return Current;
}
}
public struct EnumValuesEnumerator<TEnum> : EnumFieldsEnumerator<TEnum>, IEnumerator<TEnum>
where TEnum : enum
{
public new TEnum Current
{
get
{
return (.)base.Current.[Friend]mFieldData.[Friend]mData;
}
}
public new Result<TEnum> GetNext() mut
{
if (!MoveNext())
return .Err;
return Current;
}
}
public struct EnumNamesEnumerator<TEnum> : EnumFieldsEnumerator<TEnum>, IEnumerator<StringView>
where TEnum : enum
{
public new StringView Current
{
get
{
return (.)base.Current.[Friend]mFieldData.[Friend]mName;
}
}
public new Result<StringView> GetNext() mut
{
if (!MoveNext())
return .Err;
return Current;
}
}
} }
} }