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());
|
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>
|
/// <summary>
|
||||||
/// Test reading a table with strings
|
/// Test reading a table with strings
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -317,21 +317,11 @@ namespace MatFileHandler
|
|||||||
|
|
||||||
private static IArray TransformOpaqueData(IArray array, SubsystemData subsystemData)
|
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)
|
return ObjectParser.ParseObject(uintArray, subsystemData);
|
||||||
{
|
|
||||||
var (dimensions, indexToObjectId, classIndex) = DataElementReader.ParseOpaqueData(uintArray.Data);
|
|
||||||
return new OpaqueLink(
|
|
||||||
uintArray.Name,
|
|
||||||
string.Empty,
|
|
||||||
string.Empty,
|
|
||||||
dimensions,
|
|
||||||
uintArray,
|
|
||||||
indexToObjectId,
|
|
||||||
classIndex,
|
|
||||||
subsystemData);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (array is MatCellArray cellArray)
|
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;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user