Even better handling of embedded objects
This commit is contained in:
parent
cc3bdc000c
commit
5080f35e69
@ -388,6 +388,30 @@ namespace MatFileHandler.Tests
|
||||
Assert.Equal(new[] { 1.0, 3.0, 5.0, 2.0, 4.0, 6.0 }, variable2.ConvertToDoubleArray());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test reading a deeply nested table.
|
||||
/// </summary>
|
||||
[Theory, MemberData(nameof(TestDataFactories))]
|
||||
public void TestDeepTable(AbstractTestDataFactory<IMatFile> 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]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test reading a table with strings
|
||||
/// </summary>
|
||||
@ -607,4 +631,4 @@ namespace MatFileHandler.Tests
|
||||
Assert.Equal(new ComplexOf<T>(limits[1], limits[0]), array[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
BIN
MatFileHandler.Tests/test-data/good/table-deep.mat
Normal file
BIN
MatFileHandler.Tests/test-data/good/table-deep.mat
Normal file
Binary file not shown.
30
MatFileHandler/ObjectParser.cs
Normal file
30
MatFileHandler/ObjectParser.cs
Normal file
@ -0,0 +1,30 @@
|
||||
// Copyright 2017-2018 Alexander Luzgarev
|
||||
|
||||
namespace MatFileHandler
|
||||
{
|
||||
/// <summary>
|
||||
/// Parser for object data.
|
||||
/// </summary>
|
||||
internal static class ObjectParser
|
||||
{
|
||||
/// <summary>
|
||||
/// Parse object data.
|
||||
/// </summary>
|
||||
/// <param name="uintArray">Opaque link array.</param>
|
||||
/// <param name="subsystemData">Current subsystem data.</param>
|
||||
/// <returns>Parsed object.</returns>
|
||||
public static IArray ParseObject(MatNumericalArrayOf<uint> 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);
|
||||
}
|
||||
}
|
||||
}
|
@ -186,4 +186,4 @@ namespace MatFileHandler
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -317,21 +317,11 @@ namespace MatFileHandler
|
||||
|
||||
private static IArray TransformOpaqueData(IArray array, SubsystemData subsystemData)
|
||||
{
|
||||
if (array is MatNumericalArrayOf<uint> uintArray)
|
||||
if (array is MatNumericalArrayOf<uint> 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<string, List<IArray>>();
|
||||
foreach (var pair in structureArray.Fields)
|
||||
{
|
||||
var values = pair.Value;
|
||||
var transformedValues = new List<IArray>(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];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user