mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-19 16:40:26 +02:00
104 lines
2 KiB
Beef
104 lines
2 KiB
Beef
using System.Collections.Generic;
|
|
|
|
namespace System
|
|
{
|
|
class PropertyBag
|
|
{
|
|
public Dictionary<String, Object> mProperties ~ DeleteDictionyAndKeysAndItems!(_);
|
|
|
|
public void Add<T>(String key, T value) where T : struct
|
|
{
|
|
if (mProperties == null)
|
|
mProperties = new Dictionary<String, Object>();
|
|
String* keyPtr;
|
|
Object* objPtr;
|
|
if (mProperties.TryAdd(key, out keyPtr, out objPtr))
|
|
{
|
|
*keyPtr = new String(key);
|
|
*objPtr = new box value;
|
|
}
|
|
else
|
|
{
|
|
delete *objPtr;
|
|
*objPtr = new box value;
|
|
}
|
|
}
|
|
|
|
public void Add(String key, StringView value)
|
|
{
|
|
if (mProperties == null)
|
|
mProperties = new Dictionary<String, Object>();
|
|
String* keyPtr;
|
|
Object* objPtr;
|
|
if (mProperties.TryAdd(key, out keyPtr, out objPtr))
|
|
{
|
|
*keyPtr = new String(key);
|
|
*objPtr = new String(value);
|
|
}
|
|
else
|
|
{
|
|
delete *objPtr;
|
|
*objPtr = new String(value);
|
|
}
|
|
}
|
|
|
|
public bool Get<T>(String key, out T value)
|
|
{
|
|
if (mProperties == null)
|
|
{
|
|
value = default;
|
|
return false;
|
|
}
|
|
|
|
Object val;
|
|
if (!mProperties.TryGetValue(key, out val))
|
|
{
|
|
value = default;
|
|
return false;
|
|
}
|
|
|
|
value = (T)val;
|
|
return true;
|
|
}
|
|
|
|
public T Get<T>(String key, T defaultVal = default)
|
|
{
|
|
T val;
|
|
if (!Get(key, out val))
|
|
val = defaultVal;
|
|
return val;
|
|
}
|
|
|
|
public static bool operator==(PropertyBag lhs, PropertyBag rhs)
|
|
{
|
|
if (lhs.mProperties.Count != rhs.mProperties.Count)
|
|
return false;
|
|
|
|
for (let kv in lhs.mProperties)
|
|
{
|
|
Object lhsVal = kv.value;
|
|
Object rhsVal;
|
|
if (!rhs.Get(kv.key, out rhsVal))
|
|
return false;
|
|
|
|
var lhsType = lhsVal.GetType();
|
|
if (lhsType != rhsVal.GetType())
|
|
return false;
|
|
|
|
switch (lhsType)
|
|
{
|
|
case typeof(String):
|
|
if ((String)lhsVal != (String)rhsVal)
|
|
return false;
|
|
case typeof(Boolean):
|
|
if ((bool)lhsVal != (bool)rhsVal)
|
|
return false;
|
|
default:
|
|
if (lhsVal != rhsVal)
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
}
|