From 6c274997692707a2eae4c59b4a89c50d3f5657c4 Mon Sep 17 00:00:00 2001 From: Sebastian Godelet Date: Wed, 23 Jun 2021 16:21:08 +1000 Subject: [PATCH] Create generic ThreadSafeValue --- Meade.net.UnitTests/ThreadSafeBoolTests.cs | 4 ++-- .../ThreadSafeDateTimeTests.cs | 4 ++-- Meade.net.UnitTests/ThreadSafeEnumTests.cs | 4 ++-- .../ThreadSafeNullableDoubleTests.cs | 4 ++-- Meade.net/Meade.net.csproj | 5 +--- Meade.net/SharedResources.cs | 16 ++++++------- Meade.net/ThreadSafeBool.cs | 17 ------------- Meade.net/ThreadSafeDateTime.cs | 20 ---------------- Meade.net/ThreadSafeEnum.cs | 21 ---------------- Meade.net/ThreadSafeNullableDouble.cs | 24 ------------------- Meade.net/ThreadSafeValue.cs | 18 ++++++++++++++ 11 files changed, 35 insertions(+), 102 deletions(-) delete mode 100644 Meade.net/ThreadSafeBool.cs delete mode 100644 Meade.net/ThreadSafeDateTime.cs delete mode 100644 Meade.net/ThreadSafeEnum.cs delete mode 100644 Meade.net/ThreadSafeNullableDouble.cs create mode 100644 Meade.net/ThreadSafeValue.cs diff --git a/Meade.net.UnitTests/ThreadSafeBoolTests.cs b/Meade.net.UnitTests/ThreadSafeBoolTests.cs index adeee40..beb2ddf 100644 --- a/Meade.net.UnitTests/ThreadSafeBoolTests.cs +++ b/Meade.net.UnitTests/ThreadSafeBoolTests.cs @@ -10,7 +10,7 @@ namespace Meade.net.UnitTests public void When_Assigned_ThenValueIsSame(bool value) { // given - ThreadSafeBool sut = value; + ThreadSafeValue sut = value; // when bool actual = sut; @@ -26,7 +26,7 @@ namespace Meade.net.UnitTests public void When_SetValue_ThenValueIsUpdated(bool initialValue, bool setValue) { // given - ThreadSafeBool sut = initialValue; + ThreadSafeValue sut = initialValue; // when sut.Set(setValue); diff --git a/Meade.net.UnitTests/ThreadSafeDateTimeTests.cs b/Meade.net.UnitTests/ThreadSafeDateTimeTests.cs index e20e46a..3123a33 100644 --- a/Meade.net.UnitTests/ThreadSafeDateTimeTests.cs +++ b/Meade.net.UnitTests/ThreadSafeDateTimeTests.cs @@ -12,7 +12,7 @@ namespace Meade.net.UnitTests public void When_Assigned_ThenValueIsSame(DateTime value) { // given - ThreadSafeDateTime sut = value; + ThreadSafeValue sut = value; // when DateTime actual = sut; @@ -25,7 +25,7 @@ namespace Meade.net.UnitTests public void When_SetValue_ThenValueIsUpdated(DateTime initialValue, DateTime setValue) { // given - ThreadSafeDateTime sut = initialValue; + ThreadSafeValue sut = initialValue; // when sut.Set(setValue); diff --git a/Meade.net.UnitTests/ThreadSafeEnumTests.cs b/Meade.net.UnitTests/ThreadSafeEnumTests.cs index f542eed..da89b5c 100644 --- a/Meade.net.UnitTests/ThreadSafeEnumTests.cs +++ b/Meade.net.UnitTests/ThreadSafeEnumTests.cs @@ -12,7 +12,7 @@ namespace Meade.net.UnitTests public void When_Assigned_ThenValueIsSame(PierSide value) { // given - ThreadSafeEnum sut = value; + ThreadSafeValue sut = value; // when PierSide actual = sut; @@ -33,7 +33,7 @@ namespace Meade.net.UnitTests public void When_SetValue_ThenValueIsUpdated(PierSide initialValue, PierSide setValue) { // given - ThreadSafeEnum sut = initialValue; + ThreadSafeValue sut = initialValue; // when sut.Set(setValue); diff --git a/Meade.net.UnitTests/ThreadSafeNullableDoubleTests.cs b/Meade.net.UnitTests/ThreadSafeNullableDoubleTests.cs index ea7bd78..492a4e9 100644 --- a/Meade.net.UnitTests/ThreadSafeNullableDoubleTests.cs +++ b/Meade.net.UnitTests/ThreadSafeNullableDoubleTests.cs @@ -12,7 +12,7 @@ namespace Meade.net.UnitTests public void When_Assigned_ThenValueIsSame(double? value) { // given - ThreadSafeNullableDouble sut = value; + ThreadSafeValue sut = value; // when double? actual = sut; @@ -32,7 +32,7 @@ namespace Meade.net.UnitTests public void When_SetValue_ThenValueIsUpdated(double? initialValue, double? setValue) { // given - ThreadSafeNullableDouble sut = initialValue; + ThreadSafeValue sut = initialValue; // when sut.Set(setValue); diff --git a/Meade.net/Meade.net.csproj b/Meade.net/Meade.net.csproj index 1a6b06e..8681147 100644 --- a/Meade.net/Meade.net.csproj +++ b/Meade.net/Meade.net.csproj @@ -146,10 +146,7 @@ - - - - + diff --git a/Meade.net/SharedResources.cs b/Meade.net/SharedResources.cs index b27a0e6..6567a07 100644 --- a/Meade.net/SharedResources.cs +++ b/Meade.net/SharedResources.cs @@ -502,7 +502,7 @@ namespace ASCOM.Meade.net ParkedPosition = parkedPosition; } - private static readonly ThreadSafeBool _isParked = false; + private static readonly ThreadSafeValue _isParked = false; public static bool IsParked { get => _isParked; @@ -516,7 +516,7 @@ namespace ASCOM.Meade.net private set => Interlocked.Exchange(ref _parkedPosition, value); } - private static readonly ThreadSafeEnum _sideOfPier = PierSide.pierUnknown; + private static readonly ThreadSafeValue _sideOfPier = PierSide.pierUnknown; /// /// Start with . /// As we do not know the physical declination axis position, we have to keep track manually. @@ -527,14 +527,14 @@ namespace ASCOM.Meade.net internal set => _sideOfPier.Set(value); } - private static readonly ThreadSafeNullableDouble _targetRightAscension = null as double?; + private static readonly ThreadSafeValue _targetRightAscension = null as double?; public static double? TargetRightAscension { get => _targetRightAscension; internal set => _targetRightAscension.Set(value); } - private static readonly ThreadSafeNullableDouble _targetDeclination = null as double?; + private static readonly ThreadSafeValue _targetDeclination = null as double?; public static double? TargetDeclination { get => _targetDeclination; @@ -548,28 +548,28 @@ namespace ASCOM.Meade.net internal set => Interlocked.Exchange(ref _slewSettleTime, value); } - private static readonly ThreadSafeBool _isLongFormat = false; + private static readonly ThreadSafeValue _isLongFormat = false; public static bool IsLongFormat { get => _isLongFormat; internal set => _isLongFormat.Set(value); } - private static readonly ThreadSafeBool _movingPrimary = false; + private static readonly ThreadSafeValue _movingPrimary = false; public static bool MovingPrimary { get => _movingPrimary; internal set => _movingPrimary.Set(value); } - private static readonly ThreadSafeBool _movingSecondary = false; + private static readonly ThreadSafeValue _movingSecondary = false; public static bool MovingSecondary { get => _movingSecondary; internal set => _movingSecondary.Set(value); } - private static readonly ThreadSafeDateTime _earliestNonSlewingTime = DateTime.MinValue; + private static readonly ThreadSafeValue _earliestNonSlewingTime = DateTime.MinValue; public static DateTime EarliestNonSlewingTime { get => _earliestNonSlewingTime; diff --git a/Meade.net/ThreadSafeBool.cs b/Meade.net/ThreadSafeBool.cs deleted file mode 100644 index b60d275..0000000 --- a/Meade.net/ThreadSafeBool.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Threading; - -namespace ASCOM.Meade.net -{ - public class ThreadSafeBool - { - private object _value; - - public ThreadSafeBool(in bool value) => _value = value; - - public void Set(in bool value) => Interlocked.Exchange(ref _value, value); - - public static implicit operator ThreadSafeBool(in bool value) => new ThreadSafeBool(value); - - public static implicit operator bool(ThreadSafeBool @this) => (bool)@this._value; - } -} \ No newline at end of file diff --git a/Meade.net/ThreadSafeDateTime.cs b/Meade.net/ThreadSafeDateTime.cs deleted file mode 100644 index c336ef2..0000000 --- a/Meade.net/ThreadSafeDateTime.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Threading; - -namespace ASCOM.Meade.net -{ - public class ThreadSafeDateTime - { - private long _value; - - public ThreadSafeDateTime(in DateTime value) => _value = DateTimeToLong(value); - - public void Set(in DateTime value) => Interlocked.Exchange(ref _value, DateTimeToLong(value)); - - private static long DateTimeToLong(in DateTime value) => value.ToUniversalTime().Ticks; - - public static implicit operator ThreadSafeDateTime(in DateTime value) => new ThreadSafeDateTime(value); - - public static implicit operator DateTime(ThreadSafeDateTime @this) => new DateTime(Interlocked.Read(ref @this._value), DateTimeKind.Utc); - } -} \ No newline at end of file diff --git a/Meade.net/ThreadSafeEnum.cs b/Meade.net/ThreadSafeEnum.cs deleted file mode 100644 index f942dfc..0000000 --- a/Meade.net/ThreadSafeEnum.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Threading; - -namespace ASCOM.Meade.net -{ - public class ThreadSafeEnum - where T: struct, Enum - { - private long _value; - - public ThreadSafeEnum(T value) => _value = EnumToLong(value); - - public void Set(T value) => Interlocked.Exchange(ref _value, EnumToLong(value)); - - private static long EnumToLong(T value) => Convert.ToInt64(value); - - public static implicit operator ThreadSafeEnum(T value) => new ThreadSafeEnum(value); - - public static implicit operator T(ThreadSafeEnum @this) => (T) Enum.ToObject(typeof(T), Interlocked.Read(ref @this._value)); - } -} \ No newline at end of file diff --git a/Meade.net/ThreadSafeNullableDouble.cs b/Meade.net/ThreadSafeNullableDouble.cs deleted file mode 100644 index 4a8efd1..0000000 --- a/Meade.net/ThreadSafeNullableDouble.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Threading; - -namespace ASCOM.Meade.net -{ - public class ThreadSafeNullableDouble - { - private long _value; - - public ThreadSafeNullableDouble(in double? value) => _value = NullableDoubleToLong(value); - - public void Set(in double? value) => Interlocked.Exchange(ref _value, NullableDoubleToLong(value)); - - private static long NullableDoubleToLong(in double? value) => BitConverter.DoubleToInt64Bits(value ?? double.NaN); - - public static implicit operator ThreadSafeNullableDouble(in double? value) => new ThreadSafeNullableDouble(value); - - public static implicit operator double?(ThreadSafeNullableDouble @this) - { - var doubleValue = BitConverter.Int64BitsToDouble(Interlocked.Read(ref @this._value)); - return double.IsNaN(doubleValue) ? null as double? : doubleValue; - } - } -} \ No newline at end of file diff --git a/Meade.net/ThreadSafeValue.cs b/Meade.net/ThreadSafeValue.cs new file mode 100644 index 0000000..652fa88 --- /dev/null +++ b/Meade.net/ThreadSafeValue.cs @@ -0,0 +1,18 @@ +using JetBrains.Annotations; +using System.Threading; + +namespace ASCOM.Meade.net +{ + public class ThreadSafeValue + { + private object _value; + + public ThreadSafeValue(in T value) => _value = value; + + public void Set(in T value) => Interlocked.Exchange(ref _value, value); + + public static implicit operator ThreadSafeValue(in T value) => new ThreadSafeValue(value); + + public static implicit operator T([NotNull] ThreadSafeValue @this) => (T)(@this?._value ?? default); + } +} \ No newline at end of file