using Dalamud.Plugin.Services;
using Dalamud.Plugin;
using FFXIVClientStructs.FFXIV.Common.Lua;
using OtterGui.Log;
using Penumbra.GameData.Data;
using Penumbra.GameData.DataContainers.Bases;
using Penumbra.GameData.Structs;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CustomizePlus.GameData.ReverseSearchDictionaries.Bases;
/// A base class for dictionaries from NPC names to their IDs.
/// The plugin interface.
/// A logger.
/// The data manger to fetch the data from.
/// The name of the data share.
/// The version of the data share.
/// The factory function to create the data from.
public abstract class ReverseNameDictionary(
IDalamudPluginInterface pluginInterface,
Logger log,
IDataManager gameData,
string name,
int version,
Func> factory)
: DataSharer>(pluginInterface, log, name, gameData.Language, version, factory),
IReadOnlyDictionary
{
///
public IEnumerator> GetEnumerator()
=> Value.Select(kvp => new KeyValuePair(kvp.Key, new NpcId(kvp.Value))).GetEnumerator();
///
IEnumerator IEnumerable.GetEnumerator()
=> GetEnumerator();
///
public int Count
=> Value.Count;
///
public bool ContainsKey(string key)
=> Value.ContainsKey(key);
///
public bool TryGetValue(string key, [NotNullWhen(true)] out NpcId value)
{
if (!Value.TryGetValue(key, out var uintVal))
{
value = default;
return false;
}
value = new NpcId(uintVal);
return true;
}
///
public NpcId this[string key]
=> new NpcId(Value[key]);
///
public IEnumerable Keys
=> Value.Keys;
///
public IEnumerable Values
=> Value.Values.Select(k => new NpcId(k));
///
protected override long ComputeMemory()
=> DataUtility.DictionaryMemory(16, Count) + Keys.Sum(v => v.Length * 2); //this seems to be only used by diagnostics stuff so I don't particularly care for this to be correct.
///
protected override int ComputeTotalCount()
=> Count;
}