From 8fa9d124701267ae7cae851bb0f37f3704d434eb Mon Sep 17 00:00:00 2001 From: Alexander Luzgarev Date: Sun, 3 Mar 2019 16:45:45 +0100 Subject: [PATCH] Implement DurationAdapter --- MatFileHandler.Tests/MatFileReaderTests.cs | 15 ++++++ .../test-data/good/duration.mat | Bin 0 -> 534 bytes MatFileHandler/DurationAdapter.cs | 44 ++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 MatFileHandler.Tests/test-data/good/duration.mat create mode 100644 MatFileHandler/DurationAdapter.cs diff --git a/MatFileHandler.Tests/MatFileReaderTests.cs b/MatFileHandler.Tests/MatFileReaderTests.cs index bdb91e8..b317cf3 100755 --- a/MatFileHandler.Tests/MatFileReaderTests.cs +++ b/MatFileHandler.Tests/MatFileReaderTests.cs @@ -434,6 +434,21 @@ namespace MatFileHandler.Tests Assert.That(str[3], Is.EqualTo("æøå")); } + /// + /// Test duration objects. + /// + [Test] + public void TestDuration() + { + var matFile = GetTests("good")["duration"]; + var d = matFile["d"].Value as IMatObject; + var duration = new DurationAdapter(d); + Assert.That(duration.Dimensions, Is.EquivalentTo(new[] { 1, 3 })); + Assert.That(duration[0], Is.EqualTo(TimeSpan.FromTicks(12345678L))); + Assert.That(duration[1], Is.EqualTo(new TimeSpan(0, 2, 4))); + Assert.That(duration[2], Is.EqualTo(new TimeSpan(1, 3, 5))); + } + private static AbstractTestDataFactory GetTests(string factoryName) => new MatTestDataFactory(Path.Combine(TestDirectory, factoryName)); diff --git a/MatFileHandler.Tests/test-data/good/duration.mat b/MatFileHandler.Tests/test-data/good/duration.mat new file mode 100644 index 0000000000000000000000000000000000000000..162bbe524bfb761526e502bff222a8d73a6dab69 GIT binary patch literal 534 zcmeZu4DoSvQZUssQ1EpO(M`+DN!3vZ$Vn_o%P-2cQV4Jk_w+L}(NSo>!ow@%=yR6n`|e1`RMd@qtnlvguMc17@m4N z%qX8Z;Yor7L&PO^N051Tj4<;)BqSyzFkg~!ICGMLaZP}ovVivnhYW#)rcaU*wzZBm zb_(kf++L&~S|s15_(&(g(rtxQeER={8J27w&p4c}8Xw9O+Ylu%U%cb4QE|}WZXs^2 zpzcSH7yhz0Q2e6&rujo+*`Xtjui_0JeEZI4^3^B6FioS3;Sr0*Jcc9M3qBc4m_2jy z8Gg_J3Lfk zJd$01^vSL&-!ca7U4NM`2h07iXgagm!Kk18tc@DmmmlpN%DYcD36}3!_}YCte{@xH zf`f1Vi(mc%7y9SL-CS5RAueOjp~b>?ZEqYBzG>r^^UwX#`6gHUP5W6E{ORFYeJ5u1 kqofJ{_}KpZG;d-wm341m=9pMN@iMdOPjME8ea^c70K41GL;wH) literal 0 HcmV?d00001 diff --git a/MatFileHandler/DurationAdapter.cs b/MatFileHandler/DurationAdapter.cs new file mode 100644 index 0000000..c7a6a35 --- /dev/null +++ b/MatFileHandler/DurationAdapter.cs @@ -0,0 +1,44 @@ +// Copyright 2017-2018 Alexander Luzgarev + +using System; + +namespace MatFileHandler +{ + /// + /// A better interface for using duration objects. + /// + public class DurationAdapter + { + private readonly int[] dimensions; + private readonly double[] data; + + /// + /// Initializes a new instance of the class. + /// + /// Source duration object. + public DurationAdapter(IArray array) + { + var matObject = array as IMatObject; + if (matObject?.ClassName != "duration") + { + throw new ArgumentException("The object provided is not a duration."); + } + + var dataObject = matObject["millis", 0]; + data = dataObject.ConvertToDoubleArray(); + dimensions = dataObject.Dimensions; + } + + /// + /// Gets duration array dimensions. + /// + public int[] Dimensions => dimensions; + + /// + /// Gets duration object at given position. + /// + /// Indices. + /// Value. + public TimeSpan this[params int[] list] => TimeSpan.FromTicks((long)(10000.0 * data[Dimensions.DimFlatten(list)])); + } +} \ No newline at end of file