diff --git a/MatFileHandler.Tests/MatFileReaderTests.cs b/MatFileHandler.Tests/MatFileReaderTests.cs index 30ba7c2..f4d291d 100755 --- a/MatFileHandler.Tests/MatFileReaderTests.cs +++ b/MatFileHandler.Tests/MatFileReaderTests.cs @@ -388,6 +388,30 @@ namespace MatFileHandler.Tests Assert.Equal(new[] { 1.0, 3.0, 5.0, 2.0, 4.0, 6.0 }, variable2.ConvertToDoubleArray()); } + /// + /// Test reading a deeply nested table. + /// + [Theory, MemberData(nameof(TestDataFactories))] + public void TestDeepTable(AbstractTestDataFactory testFactory) + { + var matFile = testFactory["table-deep"]; + var obj = matFile["t"].Value as IMatObject; + var table = new TableAdapter(obj); + Assert.Equal(1, table.NumberOfRows); + Assert.Equal(2, table.NumberOfVariables); + Assert.Equal(new[] { "s", "another" }, table.VariableNames); + var s = table["s"] as IStructureArray; + Assert.Equal(new[] { "a", "b", "c" }, s.FieldNames); + var c = s["c", 0]; + var internalTable = new TableAdapter(c); + Assert.Equal(2, internalTable.NumberOfRows); + Assert.Equal(2, internalTable.NumberOfVariables); + Assert.Equal(new[] { "x", "y" }, internalTable.VariableNames); + var y = new StringAdapter(internalTable["y"]); + Assert.Equal("3", y[0]); + Assert.Equal("abc", y[1]); + } + /// /// Test reading a table with strings /// @@ -607,4 +631,4 @@ namespace MatFileHandler.Tests Assert.Equal(new ComplexOf(limits[1], limits[0]), array[1]); } } -} \ No newline at end of file +} diff --git a/MatFileHandler.Tests/test-data/good/table-deep.mat b/MatFileHandler.Tests/test-data/good/table-deep.mat new file mode 100644 index 0000000..37c70e7 Binary files /dev/null and b/MatFileHandler.Tests/test-data/good/table-deep.mat differ diff --git a/MatFileHandler/ObjectParser.cs b/MatFileHandler/ObjectParser.cs new file mode 100644 index 0000000..c799074 --- /dev/null +++ b/MatFileHandler/ObjectParser.cs @@ -0,0 +1,30 @@ +// Copyright 2017-2018 Alexander Luzgarev + +namespace MatFileHandler +{ + /// + /// Parser for object data. + /// + internal static class ObjectParser + { + /// + /// Parse object data. + /// + /// Opaque link array. + /// Current subsystem data. + /// Parsed object. + public static IArray ParseObject(MatNumericalArrayOf uintArray, SubsystemData subsystemData) + { + var (dimensions, indexToObjectId, classIndex) = DataElementReader.ParseOpaqueData(uintArray.Data); + return new OpaqueLink( + uintArray.Name, + string.Empty, + string.Empty, + dimensions, + uintArray, + indexToObjectId, + classIndex, + subsystemData); + } + } +} diff --git a/MatFileHandler/OpaqueLink.cs b/MatFileHandler/OpaqueLink.cs index 003b4dc..803048d 100644 --- a/MatFileHandler/OpaqueLink.cs +++ b/MatFileHandler/OpaqueLink.cs @@ -186,4 +186,4 @@ namespace MatFileHandler } } } -} \ No newline at end of file +} diff --git a/MatFileHandler/SubsystemDataReader.cs b/MatFileHandler/SubsystemDataReader.cs index aca0bcd..980fabc 100644 --- a/MatFileHandler/SubsystemDataReader.cs +++ b/MatFileHandler/SubsystemDataReader.cs @@ -317,21 +317,11 @@ namespace MatFileHandler private static IArray TransformOpaqueData(IArray array, SubsystemData subsystemData) { - if (array is MatNumericalArrayOf uintArray) + if (array is MatNumericalArrayOf uintArray && + uintArray.Data.Length == 6 && + uintArray.Data[0] == 3707764736u) { - if (uintArray.Data[0] == 3707764736u) - { - var (dimensions, indexToObjectId, classIndex) = DataElementReader.ParseOpaqueData(uintArray.Data); - return new OpaqueLink( - uintArray.Name, - string.Empty, - string.Empty, - dimensions, - uintArray, - indexToObjectId, - classIndex, - subsystemData); - } + return ObjectParser.ParseObject(uintArray, subsystemData); } if (array is MatCellArray cellArray) @@ -344,6 +334,26 @@ namespace MatFileHandler } } + if (array is MatStructureArray structureArray) + { + var newFields = new Dictionary>(); + foreach (var pair in structureArray.Fields) + { + var values = pair.Value; + var transformedValues = new List(values.Count); + foreach (var value in values) + { + var transformedValue = TransformOpaqueData(value, subsystemData); + transformedValues.Add(transformedValue); + } + newFields[pair.Key] = transformedValues; + } + foreach (var pair in newFields) + { + structureArray.Fields[pair.Key] = pair.Value; + } + } + return array; } @@ -402,4 +412,4 @@ namespace MatFileHandler => _keyFromEmbeddedObjectPosition[embeddedObjectPosition]; } } -} \ No newline at end of file +}