Skip to content

Commit

Permalink
Add concrete methods for constructing a primitive value
Browse files Browse the repository at this point in the history
  • Loading branch information
nirinchev committed Sep 9, 2020
1 parent 8a9b5a9 commit 701a1f2
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 20 deletions.
3 changes: 2 additions & 1 deletion Realm/Realm/Dynamic/MetaRealmObject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ internal class MetaRealmObject : DynamicMetaObject
.MakeGenericMethod(typeof(DynamicRealmObject));

private static readonly MethodInfo PrimitiveValueGetMethod = typeof(PrimitiveValue).GetMethod(nameof(PrimitiveValue.Get), BindingFlags.Public | BindingFlags.Instance);
private static readonly MethodInfo CreatePrimitiveMethod = typeof(PrimitiveValue).GetMethod(nameof(PrimitiveValue.Create), BindingFlags.Public | BindingFlags.Static);
private static readonly MethodInfo CreatePrimitiveMethod = typeof(PrimitiveValue).GetMethod(nameof(PrimitiveValue.Generic), BindingFlags.Public | BindingFlags.Static);

private static readonly ObjectHandle DummyHandle = new ObjectHandle(null, IntPtr.Zero);

Expand Down Expand Up @@ -206,6 +206,7 @@ public override DynamicMetaObject BindSetMember(SetMemberBinder binder, DynamicM
var valueExpression = value.Expression;
switch (property.Type.UnderlyingType())
{
// V10TODO: split these into individual cases to avoid calling the generic method
case PropertyType.Int:
case PropertyType.Bool:
case PropertyType.Float:
Expand Down
75 changes: 74 additions & 1 deletion Realm/Realm/Native/PrimitiveValue.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,80 @@ internal struct PrimitiveValue
[FieldOffset(8)]
internal double double_value;

public static PrimitiveValue Create<T>(T value, PropertyType type)
public static PrimitiveValue Bool(bool value)
{
return new PrimitiveValue
{
type = PropertyType.Bool,
has_value = true,
bool_value = value
};
}

public static PrimitiveValue NullableBool(bool? value) => new PrimitiveValue
{
type = PropertyType.NullableBool,
has_value = value.HasValue,
bool_value = value.GetValueOrDefault()
};

public static PrimitiveValue Int(long value) => new PrimitiveValue
{
type = PropertyType.Int,
has_value = true,
int_value = value
};

public static PrimitiveValue NullableInt(long? value) => new PrimitiveValue
{
type = PropertyType.NullableInt,
has_value = value.HasValue,
int_value = value.GetValueOrDefault()
};

public static PrimitiveValue Float(float value) => new PrimitiveValue
{
type = PropertyType.Float,
has_value = true,
float_value = value
};

public static PrimitiveValue NullableFloat(float? value) => new PrimitiveValue
{
type = PropertyType.NullableFloat,
has_value = value.HasValue,
float_value = value.GetValueOrDefault()
};

public static PrimitiveValue Double(double value) => new PrimitiveValue
{
type = PropertyType.Double,
has_value = true,
double_value = value
};

public static PrimitiveValue NullableDouble(double? value) => new PrimitiveValue
{
type = PropertyType.NullableDouble,
has_value = value.HasValue,
double_value = value.GetValueOrDefault()
};

public static PrimitiveValue Date(DateTimeOffset value) => new PrimitiveValue
{
type = PropertyType.Date,
has_value = true,
int_value = value.ToUniversalTime().Ticks
};

public static PrimitiveValue NullableDate(DateTimeOffset? value) => new PrimitiveValue
{
type = PropertyType.NullableDate,
has_value = value.HasValue,
int_value = value.GetValueOrDefault().ToUniversalTime().Ticks
};

public static PrimitiveValue Generic<T>(T value, PropertyType type)
{
var result = new PrimitiveValue
{
Expand Down
4 changes: 2 additions & 2 deletions Realm/Realm/RealmList.cs
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ public override int IndexOf(T value)
case PropertyType.Data | PropertyType.Nullable:
return _listHandle.Find(Operator.Convert<T, byte[]>(value));
default:
return _listHandle.Find(PrimitiveValue.Create(value, _argumentType));
return _listHandle.Find(PrimitiveValue.Generic(value, _argumentType));
}
}

Expand Down Expand Up @@ -268,7 +268,7 @@ public override IRealmCollection<T> Freeze()
binaryHandler(Operator.Convert<T, byte[]>(item));
break;
default:
primitiveHandler(PrimitiveValue.Create(item, _argumentType));
primitiveHandler(PrimitiveValue.Generic(item, _argumentType));
break;
}
}
Expand Down
32 changes: 16 additions & 16 deletions Realm/Realm/RealmObject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -371,84 +371,84 @@ protected void SetCharValue(string propertyName, char value)
{
Debug.Assert(IsManaged, "Object is not managed, but managed access was attempted");

_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.Create(value, PropertyType.Int));
_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.Int(value));
}

protected void SetCharValueUnique(string propertyName, char value)
{
Debug.Assert(IsManaged, "Object is not managed, but managed access was attempted");

_objectHandle.SetPrimitiveUnique(_metadata.ColumnKeys[propertyName], PrimitiveValue.Create(value, PropertyType.Int));
_objectHandle.SetPrimitiveUnique(_metadata.ColumnKeys[propertyName], PrimitiveValue.Int(value));
}

protected void SetNullableCharValue(string propertyName, char? value)
{
Debug.Assert(IsManaged, "Object is not managed, but managed access was attempted");

_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.Create(value, PropertyType.NullableInt));
_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.NullableInt(value));
}

protected void SetNullableCharValueUnique(string propertyName, char? value)
{
Debug.Assert(IsManaged, "Object is not managed, but managed access was attempted");

_objectHandle.SetPrimitiveUnique(_metadata.ColumnKeys[propertyName], PrimitiveValue.Create(value, PropertyType.NullableInt));
_objectHandle.SetPrimitiveUnique(_metadata.ColumnKeys[propertyName], PrimitiveValue.NullableInt(value));
}

protected void SetSingleValue(string propertyName, float value)
{
Debug.Assert(IsManaged, "Object is not managed, but managed access was attempted");

_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.Create(value, PropertyType.Float));
_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.Float(value));
}

protected void SetNullableSingleValue(string propertyName, float? value)
{
Debug.Assert(IsManaged, "Object is not managed, but managed access was attempted");

_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.Create(value, PropertyType.NullableFloat));
_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.NullableFloat(value));
}

protected void SetDoubleValue(string propertyName, double value)
{
Debug.Assert(IsManaged, "Object is not managed, but managed access was attempted");

_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.Create(value, PropertyType.Double));
_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.Double(value));
}

protected void SetNullableDoubleValue(string propertyName, double? value)
{
Debug.Assert(IsManaged, "Object is not managed, but managed access was attempted");

_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.Create(value, PropertyType.NullableDouble));
_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.NullableDouble(value));
}

protected void SetBooleanValue(string propertyName, bool value)
{
Debug.Assert(IsManaged, "Object is not managed, but managed access was attempted");

_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.Create(value, PropertyType.Bool));
_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.Bool(value));
}

protected void SetNullableBooleanValue(string propertyName, bool? value)
{
Debug.Assert(IsManaged, "Object is not managed, but managed access was attempted");

_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.Create(value, PropertyType.NullableBool));
_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.NullableBool(value));
}

protected void SetDateTimeOffsetValue(string propertyName, DateTimeOffset value)
{
Debug.Assert(IsManaged, "Object is not managed, but managed access was attempted");

_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.Create(value, PropertyType.Date));
_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.Date(value));
}

protected void SetNullableDateTimeOffsetValue(string propertyName, DateTimeOffset? value)
{
Debug.Assert(IsManaged, "Object is not managed, but managed access was attempted");

_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.Create(value, PropertyType.NullableDate));
_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.NullableDate(value));
}

// Originally a generic fallback, now used only for RealmObject To-One relationship properties
Expand Down Expand Up @@ -485,30 +485,30 @@ protected void SetRealmIntegerValue<T>(string propertyName, RealmInteger<T> valu
{
Debug.Assert(IsManaged, "Object is not managed, but managed access was attempted");

_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.Create(value, PropertyType.Int));
_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.Int(value.ToLong()));
}

protected void SetNullableRealmIntegerValue<T>(string propertyName, RealmInteger<T>? value)
where T : struct, IComparable<T>, IFormattable
{
Debug.Assert(IsManaged, "Object is not managed, but managed access was attempted");

_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.Create(value, PropertyType.NullableInt));
_objectHandle.SetPrimitive(_metadata.ColumnKeys[propertyName], PrimitiveValue.NullableInt(value.ToLong()));
}

protected void SetRealmIntegerValueUnique<T>(string propertyName, RealmInteger<T> value)
where T : struct, IComparable<T>, IFormattable
{
Debug.Assert(IsManaged, "Object is not managed, but managed access was attempted");
_objectHandle.SetPrimitiveUnique(_metadata.ColumnKeys[propertyName], PrimitiveValue.Create(value, PropertyType.Int));
_objectHandle.SetPrimitiveUnique(_metadata.ColumnKeys[propertyName], PrimitiveValue.Int(value.ToLong()));
}

protected void SetNullableRealmIntegerValueUnique<T>(string propertyName, RealmInteger<T>? value)
where T : struct, IComparable<T>, IFormattable
{
Debug.Assert(IsManaged, "Object is not managed, but managed access was attempted");

_objectHandle.SetPrimitiveUnique(_metadata.ColumnKeys[propertyName], PrimitiveValue.Create(value, PropertyType.NullableInt));
_objectHandle.SetPrimitiveUnique(_metadata.ColumnKeys[propertyName], PrimitiveValue.NullableInt(value.ToLong()));
}

#endregion
Expand Down

0 comments on commit 701a1f2

Please sign in to comment.