2024-06-02 06:18:57 +00:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
|
|
|
|
namespace Flow.Launcher.Infrastructure
|
|
|
|
|
|
{
|
|
|
|
|
|
public class TranslationMapping
|
|
|
|
|
|
{
|
2025-07-13 15:29:41 +00:00
|
|
|
|
private bool _isConstructed;
|
2024-06-02 06:18:57 +00:00
|
|
|
|
|
2025-07-13 15:39:44 +00:00
|
|
|
|
// Assuming one original item maps to multi translated items
|
|
|
|
|
|
// list[i] is the last translated index + 1 of original index i
|
2026-01-03 05:44:21 +00:00
|
|
|
|
// Using short instead of int to save memory
|
|
|
|
|
|
private List<short> _originalToTranslatedBuilder;
|
|
|
|
|
|
private short[] _originalToTranslated;
|
|
|
|
|
|
|
|
|
|
|
|
public TranslationMapping(int capacityHint = 16)
|
|
|
|
|
|
{
|
|
|
|
|
|
_originalToTranslatedBuilder = new List<short>(capacityHint);
|
|
|
|
|
|
}
|
2025-04-09 12:06:17 +00:00
|
|
|
|
|
2025-07-13 07:56:25 +00:00
|
|
|
|
public void AddNewIndex(int translatedIndex, int length)
|
2024-06-02 06:18:57 +00:00
|
|
|
|
{
|
2025-07-13 15:29:41 +00:00
|
|
|
|
if (_isConstructed)
|
|
|
|
|
|
throw new InvalidOperationException("Mapping shouldn't be changed after construction");
|
2026-01-03 05:44:21 +00:00
|
|
|
|
|
|
|
|
|
|
var value = translatedIndex + length;
|
|
|
|
|
|
if (value > short.MaxValue)
|
|
|
|
|
|
throw new ArgumentOutOfRangeException(nameof(translatedIndex),
|
|
|
|
|
|
"Translation index exceeds maximum supported value (32,767)");
|
|
|
|
|
|
|
|
|
|
|
|
_originalToTranslatedBuilder.Add((short)value);
|
2024-06-02 06:18:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public int MapToOriginalIndex(int translatedIndex)
|
|
|
|
|
|
{
|
2026-01-03 05:44:21 +00:00
|
|
|
|
if (_originalToTranslated == null)
|
|
|
|
|
|
throw new InvalidOperationException("Mapping must be constructed before use");
|
|
|
|
|
|
|
|
|
|
|
|
if (translatedIndex > short.MaxValue)
|
|
|
|
|
|
throw new ArgumentOutOfRangeException(nameof(translatedIndex),
|
|
|
|
|
|
"Translation index exceeds maximum supported value (32,767)");
|
|
|
|
|
|
|
|
|
|
|
|
var searchResult = Array.BinarySearch(_originalToTranslated, (short)translatedIndex);
|
2025-12-07 10:16:09 +00:00
|
|
|
|
return searchResult >= 0 ? searchResult + 1 : ~searchResult;
|
2024-06-02 06:18:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-13 15:29:41 +00:00
|
|
|
|
public void EndConstruct()
|
2024-06-02 06:18:57 +00:00
|
|
|
|
{
|
2025-07-13 15:29:41 +00:00
|
|
|
|
if (_isConstructed)
|
2024-06-02 06:18:57 +00:00
|
|
|
|
throw new InvalidOperationException("Mapping has already been constructed");
|
2026-01-03 05:44:21 +00:00
|
|
|
|
|
|
|
|
|
|
// Convert to array to save memory (no List overhead, no excess capacity)
|
|
|
|
|
|
_originalToTranslated = _originalToTranslatedBuilder.ToArray();
|
|
|
|
|
|
_originalToTranslatedBuilder = null; // Allow GC to collect the List
|
2025-07-13 15:29:41 +00:00
|
|
|
|
_isConstructed = true;
|
2024-06-02 06:18:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|