Even better handling of embedded objects

This commit is contained in:
Alexander Luzgarev 2025-04-08 16:19:47 +02:00
parent cc3bdc000c
commit 5080f35e69
5 changed files with 81 additions and 17 deletions

View File

@ -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>
@ -607,4 +631,4 @@ namespace MatFileHandler.Tests
Assert.Equal(new ComplexOf<T>(limits[1], limits[0]), array[1]); Assert.Equal(new ComplexOf<T>(limits[1], limits[0]), array[1]);
} }
} }
} }

Binary file not shown.

View 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);
}
}
}

View File

@ -186,4 +186,4 @@ namespace MatFileHandler
} }
} }
} }
} }

View File

@ -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;
} }
@ -402,4 +412,4 @@ namespace MatFileHandler
=> _keyFromEmbeddedObjectPosition[embeddedObjectPosition]; => _keyFromEmbeddedObjectPosition[embeddedObjectPosition];
} }
} }
} }