Browse Source

Added some documentation to value stores.

pull/3255/head
Steven Kirk 7 years ago
parent
commit
69e702320b
  1. 7
      src/Avalonia.Base/PropertyStore/BindingEntry.cs
  2. 5
      src/Avalonia.Base/PropertyStore/ConstantValueEntry.cs
  3. 7
      src/Avalonia.Base/PropertyStore/IPriorityValueEntry.cs
  4. 7
      src/Avalonia.Base/PropertyStore/IValue.cs
  5. 6
      src/Avalonia.Base/PropertyStore/IValueSink.cs
  6. 5
      src/Avalonia.Base/PropertyStore/LocalValueEntry.cs
  7. 11
      src/Avalonia.Base/PropertyStore/PriorityValue.cs
  8. 15
      src/Avalonia.Base/ValueStore.cs

7
src/Avalonia.Base/PropertyStore/BindingEntry.cs

@ -6,10 +6,17 @@ using Avalonia.Threading;
namespace Avalonia.PropertyStore namespace Avalonia.PropertyStore
{ {
/// <summary>
/// Represents an untyped interface to <see cref="BindingEntry{T}"/>.
/// </summary>
internal interface IBindingEntry : IPriorityValueEntry, IDisposable internal interface IBindingEntry : IPriorityValueEntry, IDisposable
{ {
} }
/// <summary>
/// Stores a binding in a <see cref="ValueStore"/> or <see cref="PriorityValue{T}"/>.
/// </summary>
/// <typeparam name="T">The property type.</typeparam>
internal class BindingEntry<T> : IBindingEntry, IPriorityValueEntry<T>, IObserver<BindingValue<T>> internal class BindingEntry<T> : IBindingEntry, IPriorityValueEntry<T>, IObserver<BindingValue<T>>
{ {
private IValueSink _sink; private IValueSink _sink;

5
src/Avalonia.Base/PropertyStore/ConstantValueEntry.cs

@ -5,6 +5,11 @@ using Avalonia.Data;
namespace Avalonia.PropertyStore namespace Avalonia.PropertyStore
{ {
/// <summary>
/// Stores a value with a priority in a <see cref="ValueStore"/> or
/// <see cref="PriorityValue{T}"/>.
/// </summary>
/// <typeparam name="T">The property type.</typeparam>
internal class ConstantValueEntry<T> : IPriorityValueEntry<T> internal class ConstantValueEntry<T> : IPriorityValueEntry<T>
{ {
public ConstantValueEntry( public ConstantValueEntry(

7
src/Avalonia.Base/PropertyStore/IPriorityValueEntry.cs

@ -5,6 +5,9 @@ using Avalonia.Data;
namespace Avalonia.PropertyStore namespace Avalonia.PropertyStore
{ {
/// <summary>
/// Represents an untyped interface to <see cref="IPriorityValueEntry{T}"/>.
/// </summary>
internal interface IPriorityValueEntry : IValue internal interface IPriorityValueEntry : IValue
{ {
BindingPriority Priority { get; } BindingPriority Priority { get; }
@ -12,6 +15,10 @@ namespace Avalonia.PropertyStore
void Reparent(IValueSink sink); void Reparent(IValueSink sink);
} }
/// <summary>
/// Represents an object that can act as an entry in a <see cref="PriorityValue{T}"/>.
/// </summary>
/// <typeparam name="T">The property type.</typeparam>
internal interface IPriorityValueEntry<T> : IPriorityValueEntry, IValue<T> internal interface IPriorityValueEntry<T> : IPriorityValueEntry, IValue<T>
{ {
} }

7
src/Avalonia.Base/PropertyStore/IValue.cs

@ -4,12 +4,19 @@
namespace Avalonia.PropertyStore namespace Avalonia.PropertyStore
{ {
/// <summary>
/// Represents an untyped interface to <see cref="IValue{T}"/>.
/// </summary>
internal interface IValue internal interface IValue
{ {
Optional<object> Value { get; } Optional<object> Value { get; }
BindingPriority ValuePriority { get; } BindingPriority ValuePriority { get; }
} }
/// <summary>
/// Represents an object that can act as an entry in a <see cref="ValueStore"/>.
/// </summary>
/// <typeparam name="T">The property type.</typeparam>
internal interface IValue<T> : IValue internal interface IValue<T> : IValue
{ {
new Optional<T> Value { get; } new Optional<T> Value { get; }

6
src/Avalonia.Base/PropertyStore/IValueSink.cs

@ -1,10 +1,12 @@
using System; using Avalonia.Data;
using Avalonia.Data;
#nullable enable #nullable enable
namespace Avalonia.PropertyStore namespace Avalonia.PropertyStore
{ {
/// <summary>
/// Represents an entity that can receive change notifications in a <see cref="ValueStore"/>.
/// </summary>
internal interface IValueSink internal interface IValueSink
{ {
void ValueChanged<T>( void ValueChanged<T>(

5
src/Avalonia.Base/PropertyStore/LocalValueEntry.cs

@ -4,6 +4,11 @@
namespace Avalonia.PropertyStore namespace Avalonia.PropertyStore
{ {
/// <summary>
/// Stores a value with local value priority in a <see cref="ValueStore"/> or
/// <see cref="PriorityValue{T}"/>.
/// </summary>
/// <typeparam name="T">The property type.</typeparam>
internal class LocalValueEntry<T> : IValue<T> internal class LocalValueEntry<T> : IValue<T>
{ {
private T _value; private T _value;

11
src/Avalonia.Base/PropertyStore/PriorityValue.cs

@ -6,6 +6,17 @@ using Avalonia.Data;
namespace Avalonia.PropertyStore namespace Avalonia.PropertyStore
{ {
/// <summary>
/// Stores a set of prioritized values and bindings in a <see cref="ValueStore"/>.
/// </summary>
/// <typeparam name="T">The property type.</typeparam>
/// <remarks>
/// When more than a single value or binding is applied to a property in an
/// <see cref="AvaloniaObject"/>, the entry in the <see cref="ValueStore"/> is converted into
/// a <see cref="PriorityValue{T}"/>. This class holds any number of
/// <see cref="IPriorityValueEntry{T}"/> entries (sorted first by priority and then in the order
/// they were added) plus a local value.
/// </remarks>
internal class PriorityValue<T> : IValue<T>, IValueSink internal class PriorityValue<T> : IValue<T>, IValueSink
{ {
private readonly IValueSink _sink; private readonly IValueSink _sink;

15
src/Avalonia.Base/ValueStore.cs

@ -1,5 +1,4 @@
using System; using System;
using System.Collections.Generic;
using Avalonia.Data; using Avalonia.Data;
using Avalonia.PropertyStore; using Avalonia.PropertyStore;
using Avalonia.Utilities; using Avalonia.Utilities;
@ -8,6 +7,20 @@ using Avalonia.Utilities;
namespace Avalonia namespace Avalonia
{ {
/// <summary>
/// Stores styled property values for an <see cref="AvaloniaObject"/>.
/// </summary>
/// <remarks>
/// At its core this class consists of an <see cref="AvaloniaProperty"/> to
/// <see cref="IValue"/> mapping which holds the current values for each set property. This
/// <see cref="IValue"/> can be in one of 4 states:
///
/// - For a single local value it will be an instance of <see cref="LocalValueEntry{T}"/>.
/// - For a single value of a priority other than LocalValue it will be an instance of
/// <see cref="ConstantValueEntry{T}"/>`
/// - For a single binding it will be an instance of <see cref="BindingEntry{T}"/>
/// - For all other cases it will be an instance of <see cref="PriorityValue{T}"/>
/// </remarks>
internal class ValueStore : IValueSink internal class ValueStore : IValueSink
{ {
private readonly AvaloniaObject _owner; private readonly AvaloniaObject _owner;

Loading…
Cancel
Save