1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
using System.Collections.Generic;
using System.Globalization;
namespace System.Reactive
{
/// <summary>
/// Represents value with a timestamp on it.
/// The timestamp typically represents the time the value was received, using an IScheduler's clock to obtain the current time.
/// </summary>
/// <typeparam name="T">The type of the value being timestamped.</typeparam>
#if !NO_SERIALIZABLE
[Serializable]
#endif
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Timestamped", Justification = "Reviewed and agreed upon.")]
public struct Timestamped<T> : IEquatable<Timestamped<T>>
{
private readonly DateTimeOffset _timestamp;
private readonly T _value;
/// <summary>
/// Constructs a timestamped value.
/// </summary>
/// <param name="value">The value to be annotated with a timestamp.</param>
/// <param name="timestamp">Timestamp associated with the value.</param>
public Timestamped(T value, DateTimeOffset timestamp)
{
_timestamp = timestamp;
_value = value;
}
/// <summary>
/// Gets the value.
/// </summary>
public T Value
{
get { return _value; }
}
/// <summary>
/// Gets the timestamp.
/// </summary>
public DateTimeOffset Timestamp
{
get { return _timestamp; }
}
/// <summary>
/// Determines whether the current Timestamped<T> value has the same Value and Timestamp as a specified Timestamped<T> value.
/// </summary>
/// <param name="other">An object to compare to the current Timestamped<T> value.</param>
/// <returns>true if both Timestamped<T> values have the same Value and Timestamp; otherwise, false.</returns>
public bool Equals(Timestamped<T> other)
{
return other.Timestamp.Equals(Timestamp) && EqualityComparer<T>.Default.Equals(Value, other.Value);
}
/// <summary>
/// Determines whether the two specified Timestamped<T> values have the same Value and Timestamp.
/// </summary>
/// <param name="first">The first Timestamped<T> value to compare.</param>
/// <param name="second">The second Timestamped<T> value to compare.</param>
/// <returns>true if the first Timestamped<T> value has the same Value and Timestamp as the second Timestamped<T> value; otherwise, false.</returns>
public static bool operator ==(Timestamped<T> first, Timestamped<T> second)
{
return first.Equals(second);
}
/// <summary>
/// Determines whether the two specified Timestamped<T> values don't have the same Value and Timestamp.
/// </summary>
/// <param name="first">The first Timestamped<T> value to compare.</param>
/// <param name="second">The second Timestamped<T> value to compare.</param>
/// <returns>true if the first Timestamped<T> value has a different Value or Timestamp as the second Timestamped<T> value; otherwise, false.</returns>
public static bool operator !=(Timestamped<T> first, Timestamped<T> second)
{
return !first.Equals(second);
}
/// <summary>
/// Determines whether the specified System.Object is equal to the current Timestamped<T>.
/// </summary>
/// <param name="obj">The System.Object to compare with the current Timestamped<T>.</param>
/// <returns>true if the specified System.Object is equal to the current Timestamped<T>; otherwise, false.</returns>
public override bool Equals(object obj)
{
if (!(obj is Timestamped<T>))
return false;
var other = (Timestamped<T>)obj;
return this.Equals(other);
}
/// <summary>
/// Returns the hash code for the current Timestamped<T> value.
/// </summary>
/// <returns>A hash code for the current Timestamped<T> value.</returns>
public override int GetHashCode()
{
var valueHashCode = Value == null ? 1979 : Value.GetHashCode();
return _timestamp.GetHashCode() ^ valueHashCode;
}
/// <summary>
/// Returns a string representation of the current Timestamped<T> value.
/// </summary>
/// <returns>String representation of the current Timestamped<T> value.</returns>
public override string ToString()
{
return String.Format(CultureInfo.CurrentCulture, "{0}@{1}", Value, Timestamp);
}
}
/// <summary>
/// A helper class with a factory method for creating Timestamped<T> instances.
/// </summary>
public static class Timestamped
{
/// <summary>
/// Creates an instance of a Timestamped<T>. This is syntactic sugar that uses type inference
/// to avoid specifying a type in a constructor call, which is very useful when using anonymous types.
/// </summary>
/// <param name="value">The value to be annotated with a timestamp.</param>
/// <param name="timestamp">Timestamp associated with the value.</param>
/// <returns>Creates a new timestamped value.</returns>
public static Timestamped<T> Create<T>(T value, DateTimeOffset timestamp)
{
return new Timestamped<T>(value, timestamp);
}
}
}
|