using System.Collections; using System.Threading; using FrostFS.Refs; namespace FrostFS.SDK.ClientV2.Mappers.GRPC; public static class VersionMapper { private static readonly Hashtable _cacheMessages = []; private static readonly Hashtable _cacheModels = []; private static SpinLock _spinlock = new(); public static Version ToMessage(this FrostFsVersion model) { var key = model.Major << 16 + model.Minor; if (!_cacheMessages.ContainsKey(key)) { bool lockTaken = false; try { _spinlock.Enter(ref lockTaken); var message = new Version { Major = (uint)model.Major, Minor = (uint)model.Minor }; _cacheMessages.Add(key, message); return message; } catch (System.ArgumentException) { // ignore attempt to add duplicate } finally { if (lockTaken) _spinlock.Exit(false); } } return (Version)_cacheMessages[key]; } public static FrostFsVersion ToModel(this Version message) { var key = (int)message.Major << 16 + (int)message.Minor; if (!_cacheModels.ContainsKey(key)) { bool lockTaken = false; try { _spinlock.Enter(ref lockTaken); var model = new FrostFsVersion((int)message.Major, (int)message.Minor); _cacheModels.Add(key, model); return model; } catch (System.ArgumentException) { // ignore attempt to add duplicate } finally { if (lockTaken) _spinlock.Exit(false); } } return (FrostFsVersion)_cacheModels[key]; } }