using System;
using System.Runtime.InteropServices;
using static System.Buffers.Binary.BinaryPrimitives;
namespace PKHeX.Core;
///
/// Unpacks data from legality binary inputs.
///
public static class LearnsetReader
{
private static readonly Learnset EMPTY = new([], []);
///
/// Loads a learnset by reading 16-bit move,level pairs.
///
/// Entry data
public static Learnset[] GetArray(BinLinkerAccessor16 entries)
{
var result = new Learnset[entries.Length];
result[0] = EMPTY; // empty entry
for (int i = 1; i < result.Length; i++)
result[i] = ReadLearnset16(entries[i]);
return result;
}
///
/// Reads a Level up move pool definition from a single move pool definition.
///
private static Learnset ReadLearnset16(ReadOnlySpan data)
{
if (data.Length == 0)
return EMPTY;
// move[], .. level[]
var count = data.Length / 3;
var size = count << 1; // 2 bytes per move
var moves = MemoryMarshal.Cast(data[..size]).ToArray();
if (!BitConverter.IsLittleEndian)
ReverseEndianness(moves, moves);
var levels = data.Slice(size, count).ToArray();
return new Learnset(moves, levels);
}
}