Skip to content

Minor changes and bug fixes. #64

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Nov 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 1 addition & 6 deletions src/UnityMvvmToolkit.Core/Internal/Helpers/HashCodeHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,7 @@ public static int GetMemberHashCode(Type contextType, string memberName)
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int GetPropertyConverterHashCode(IPropertyValueConverter converter, string converterName = null)
{
var targetTypeHash = converter.TargetType.GetHashCode();
var sourceTypeHash = converter.SourceType.GetHashCode();

return string.IsNullOrWhiteSpace(converterName)
? CombineHashCode(targetTypeHash, sourceTypeHash)
: CombineHashCode(converterName.GetHashCode(), targetTypeHash, sourceTypeHash);
return GetPropertyWrapperConverterId(converter.TargetType, converter.SourceType, converterName);
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ namespace UnityMvvmToolkit.Core.Internal.ObjectHandlers
{
internal sealed class ObjectWrapperHandler : IDisposable
{
private static readonly int ReadOnlyPropertyHashCode = typeof(IReadOnlyProperty<>).GetHashCode();

private readonly ValueConverterHandler _valueConverterHandler;

private readonly Dictionary<int, ICommandWrapper> _commandWrappers;
Expand Down Expand Up @@ -77,22 +79,18 @@ public TProperty GetPropertyAs<TProperty, TValueType>(IBindingContext context, M

var converterId = HashCodeHelper.GetPropertyWrapperConverterId(targetType, sourceType);

if (_wrappersByConverter.TryGetValue(converterId, out var propertyWrappers))
{
if (propertyWrappers.Count > 0)
{
return (TProperty) propertyWrappers
.Dequeue()
.AsPropertyWrapper()
.SetProperty(property);
}
}
else
var isProperty = property is IProperty;

var wrapperId = isProperty ? converterId : GetReadOnlyWrapperId(converterId);

if (TryGetObjectWrapper(wrapperId, out var objectWrapper))
{
_wrappersByConverter.Add(converterId, new Queue<IObjectWrapper>());
return (TProperty) objectWrapper
.AsPropertyWrapper()
.SetProperty(property);
}

var wrapperType = property is IProperty
var wrapperType = isProperty
? typeof(PropertyCastWrapper<,>).MakeGenericType(sourceType, targetType)
: typeof(ReadOnlyPropertyCastWrapper<,>).MakeGenericType(sourceType, targetType);

Expand All @@ -115,19 +113,15 @@ public TProperty GetProperty<TProperty, TValueType>(IBindingContext context, Bin
var converterId =
HashCodeHelper.GetPropertyWrapperConverterId(targetType, sourceType, bindingData.ConverterName);

if (_wrappersByConverter.TryGetValue(converterId, out var propertyWrappers))
{
if (propertyWrappers.Count > 0)
{
return (TProperty) propertyWrappers
.Dequeue()
.AsPropertyWrapper()
.SetProperty(property);
}
}
else
var isProperty = property is IProperty;

var wrapperId = isProperty ? converterId : GetReadOnlyWrapperId(converterId);

if (TryGetObjectWrapper(wrapperId, out var objectWrapper))
{
_wrappersByConverter.Add(converterId, new Queue<IObjectWrapper>());
return (TProperty) objectWrapper
.AsPropertyWrapper()
.SetProperty(property);
}

if (_valueConverterHandler.TryGetValueConverterById(converterId, out var valueConverter) == false)
Expand All @@ -138,7 +132,7 @@ public TProperty GetProperty<TProperty, TValueType>(IBindingContext context, Bin

var args = new object[] { valueConverter };

var wrapperType = property is IProperty
var wrapperType = isProperty
? typeof(PropertyConvertWrapper<,>).MakeGenericType(sourceType, targetType)
: typeof(ReadOnlyPropertyConvertWrapper<,>).MakeGenericType(sourceType, targetType);

Expand Down Expand Up @@ -177,20 +171,12 @@ public ICommandWrapper GetCommandWrapper(IBindingContext context, CommandBinding
var converterId =
HashCodeHelper.GetCommandWrapperConverterId(commandValueType, bindingData.ConverterName);

if (_wrappersByConverter.TryGetValue(converterId, out var commandWrappers))
if (TryGetObjectWrapper(converterId, out var objectWrapper))
{
if (commandWrappers.Count > 0)
{
return commandWrappers
.Dequeue()
.AsCommandWrapper()
.SetCommand(commandId, command)
.RegisterParameter(bindingData.ElementId, bindingData.ParameterValue);
}
}
else
{
_wrappersByConverter.Add(converterId, new Queue<IObjectWrapper>());
return objectWrapper
.AsCommandWrapper()
.SetCommand(commandId, command)
.RegisterParameter(bindingData.ElementId, bindingData.ParameterValue);
}

if (_valueConverterHandler.TryGetValueConverterById(converterId, out var valueConverter) == false)
Expand All @@ -215,7 +201,7 @@ public void ReturnProperty(IPropertyWrapper propertyWrapper)
{
AssureIsNotDisposed();

ReturnWrapper(propertyWrapper);
ReturnObjectWrapper(propertyWrapper);
}

public void ReturnCommandWrapper(ICommandWrapper commandWrapper, int elementId)
Expand All @@ -228,7 +214,8 @@ public void ReturnCommandWrapper(ICommandWrapper commandWrapper, int elementId)
}

_commandWrappers.Remove(commandWrapper.CommandId);
ReturnWrapper(commandWrapper);

ReturnObjectWrapper(commandWrapper);
}

public void Dispose()
Expand Down Expand Up @@ -347,10 +334,41 @@ private void CreateParameterValueConverterInstances(int converterId, IParameterV
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void ReturnWrapper(IObjectWrapper wrapper)
private bool TryGetObjectWrapper(int wrapperId, out IObjectWrapper objectWrapper)
{
if (_wrappersByConverter.TryGetValue(wrapperId, out var objectWrappers))
{
if (objectWrappers.Count > 0)
{
objectWrapper = objectWrappers.Dequeue();
return true;
}
}
else
{
_wrappersByConverter.Add(wrapperId, new Queue<IObjectWrapper>());
}

objectWrapper = default;
return false;
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void ReturnObjectWrapper(IObjectWrapper wrapper)
{
wrapper.Reset();
_wrappersByConverter[wrapper.ConverterId].Enqueue(wrapper);

switch (wrapper)
{
case IProperty:
case ICommandWrapper:
_wrappersByConverter[wrapper.ConverterId].Enqueue(wrapper);
break;

default:
_wrappersByConverter[GetReadOnlyWrapperId(wrapper.ConverterId)].Enqueue(wrapper);
break;
}
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
Expand All @@ -361,5 +379,11 @@ private void AssureIsNotDisposed()
throw new ObjectDisposedException(nameof(ObjectWrapperHandler));
}
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static int GetReadOnlyWrapperId(int wrapperConverterId)
{
return HashCodeHelper.CombineHashCode(wrapperConverterId, ReadOnlyPropertyHashCode);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,7 @@ public static int GetMemberHashCode(Type contextType, string memberName)
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int GetPropertyConverterHashCode(IPropertyValueConverter converter, string converterName = null)
{
var targetTypeHash = converter.TargetType.GetHashCode();
var sourceTypeHash = converter.SourceType.GetHashCode();

return string.IsNullOrWhiteSpace(converterName)
? CombineHashCode(targetTypeHash, sourceTypeHash)
: CombineHashCode(converterName.GetHashCode(), targetTypeHash, sourceTypeHash);
return GetPropertyWrapperConverterId(converter.TargetType, converter.SourceType, converterName);
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ namespace UnityMvvmToolkit.Core.Internal.ObjectHandlers
{
internal sealed class ObjectWrapperHandler : IDisposable
{
private static readonly int ReadOnlyPropertyHashCode = typeof(IReadOnlyProperty<>).GetHashCode();

private readonly ValueConverterHandler _valueConverterHandler;

private readonly Dictionary<int, ICommandWrapper> _commandWrappers;
Expand Down Expand Up @@ -77,22 +79,18 @@ public TProperty GetPropertyAs<TProperty, TValueType>(IBindingContext context, M

var converterId = HashCodeHelper.GetPropertyWrapperConverterId(targetType, sourceType);

if (_wrappersByConverter.TryGetValue(converterId, out var propertyWrappers))
{
if (propertyWrappers.Count > 0)
{
return (TProperty) propertyWrappers
.Dequeue()
.AsPropertyWrapper()
.SetProperty(property);
}
}
else
var isProperty = property is IProperty;

var wrapperId = isProperty ? converterId : GetReadOnlyWrapperId(converterId);

if (TryGetObjectWrapper(wrapperId, out var objectWrapper))
{
_wrappersByConverter.Add(converterId, new Queue<IObjectWrapper>());
return (TProperty) objectWrapper
.AsPropertyWrapper()
.SetProperty(property);
}

var wrapperType = property is IProperty
var wrapperType = isProperty
? typeof(PropertyCastWrapper<,>).MakeGenericType(sourceType, targetType)
: typeof(ReadOnlyPropertyCastWrapper<,>).MakeGenericType(sourceType, targetType);

Expand All @@ -115,19 +113,15 @@ public TProperty GetProperty<TProperty, TValueType>(IBindingContext context, Bin
var converterId =
HashCodeHelper.GetPropertyWrapperConverterId(targetType, sourceType, bindingData.ConverterName);

if (_wrappersByConverter.TryGetValue(converterId, out var propertyWrappers))
{
if (propertyWrappers.Count > 0)
{
return (TProperty) propertyWrappers
.Dequeue()
.AsPropertyWrapper()
.SetProperty(property);
}
}
else
var isProperty = property is IProperty;

var wrapperId = isProperty ? converterId : GetReadOnlyWrapperId(converterId);

if (TryGetObjectWrapper(wrapperId, out var objectWrapper))
{
_wrappersByConverter.Add(converterId, new Queue<IObjectWrapper>());
return (TProperty) objectWrapper
.AsPropertyWrapper()
.SetProperty(property);
}

if (_valueConverterHandler.TryGetValueConverterById(converterId, out var valueConverter) == false)
Expand All @@ -138,7 +132,7 @@ public TProperty GetProperty<TProperty, TValueType>(IBindingContext context, Bin

var args = new object[] { valueConverter };

var wrapperType = property is IProperty
var wrapperType = isProperty
? typeof(PropertyConvertWrapper<,>).MakeGenericType(sourceType, targetType)
: typeof(ReadOnlyPropertyConvertWrapper<,>).MakeGenericType(sourceType, targetType);

Expand Down Expand Up @@ -177,20 +171,12 @@ public ICommandWrapper GetCommandWrapper(IBindingContext context, CommandBinding
var converterId =
HashCodeHelper.GetCommandWrapperConverterId(commandValueType, bindingData.ConverterName);

if (_wrappersByConverter.TryGetValue(converterId, out var commandWrappers))
if (TryGetObjectWrapper(converterId, out var objectWrapper))
{
if (commandWrappers.Count > 0)
{
return commandWrappers
.Dequeue()
.AsCommandWrapper()
.SetCommand(commandId, command)
.RegisterParameter(bindingData.ElementId, bindingData.ParameterValue);
}
}
else
{
_wrappersByConverter.Add(converterId, new Queue<IObjectWrapper>());
return objectWrapper
.AsCommandWrapper()
.SetCommand(commandId, command)
.RegisterParameter(bindingData.ElementId, bindingData.ParameterValue);
}

if (_valueConverterHandler.TryGetValueConverterById(converterId, out var valueConverter) == false)
Expand All @@ -215,7 +201,7 @@ public void ReturnProperty(IPropertyWrapper propertyWrapper)
{
AssureIsNotDisposed();

ReturnWrapper(propertyWrapper);
ReturnObjectWrapper(propertyWrapper);
}

public void ReturnCommandWrapper(ICommandWrapper commandWrapper, int elementId)
Expand All @@ -228,7 +214,8 @@ public void ReturnCommandWrapper(ICommandWrapper commandWrapper, int elementId)
}

_commandWrappers.Remove(commandWrapper.CommandId);
ReturnWrapper(commandWrapper);

ReturnObjectWrapper(commandWrapper);
}

public void Dispose()
Expand Down Expand Up @@ -347,10 +334,41 @@ private void CreateParameterValueConverterInstances(int converterId, IParameterV
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void ReturnWrapper(IObjectWrapper wrapper)
private bool TryGetObjectWrapper(int wrapperId, out IObjectWrapper objectWrapper)
{
if (_wrappersByConverter.TryGetValue(wrapperId, out var objectWrappers))
{
if (objectWrappers.Count > 0)
{
objectWrapper = objectWrappers.Dequeue();
return true;
}
}
else
{
_wrappersByConverter.Add(wrapperId, new Queue<IObjectWrapper>());
}

objectWrapper = default;
return false;
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void ReturnObjectWrapper(IObjectWrapper wrapper)
{
wrapper.Reset();
_wrappersByConverter[wrapper.ConverterId].Enqueue(wrapper);

switch (wrapper)
{
case IProperty:
case ICommandWrapper:
_wrappersByConverter[wrapper.ConverterId].Enqueue(wrapper);
break;

default:
_wrappersByConverter[GetReadOnlyWrapperId(wrapper.ConverterId)].Enqueue(wrapper);
break;
}
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
Expand All @@ -361,5 +379,11 @@ private void AssureIsNotDisposed()
throw new ObjectDisposedException(nameof(ObjectWrapperHandler));
}
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static int GetReadOnlyWrapperId(int wrapperConverterId)
{
return HashCodeHelper.CombineHashCode(wrapperConverterId, ReadOnlyPropertyHashCode);
}
}
}
Loading