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
+}