using System; using System.Collections.Concurrent; using System.Collections.Generic; using Christie_net.annotation; using Christie_net.datagear.command; using Christie_net.datagear.dg; namespace Christie_net.datagear { public class DataGears { protected SortedDictionary>> dataGears = new SortedDictionary>>(); private readonly object syncObject = new object(); /// /// 新しいdataGearの追加 /// /// /// public void Put(string key, DataGear dg) { lock (syncObject) { if (dataGears.ContainsKey(key)) { dataGears[key].Enqueue(dg); } else { var queue = new ConcurrentQueue>(); queue.Enqueue(dg); dataGears.Add(key, queue); } } } /// /// DataGeraの取得と削除 /// /// /// public object Take(string key) { object data = null; // Queueからの取得は参照渡し DataGear dataGear; if (dataGears[key].TryDequeue(out dataGear)) { data = dataGear.GetData(); } // DataGeraを削除取り出ししたのでkeyも削除 if (dataGears[key].IsEmpty) { dataGears.Remove(key); } return data; } /// /// DataGeraを削除せずに取得 /// /// /// public object Peek(string key) { object data = null; DataGear dataGear; if (dataGears[key].TryPeek(out dataGear)) { data = dataGear.GetData(); } return data; } /// /// commandによりDataの取得 /// /// /// public object GetData(Command cm) { lock (syncObject) { CommandType type = cm.type; if (type == CommandType.TAKE || type == CommandType.REMOTETAKE) { return Take(cm.key); } else if (type == CommandType.PEEK || type == CommandType.REMOTEPEEK){ return Peek(cm.key); } return null; } } /// /// Dataを挿入する /// /// public void SetData(Command cm) { lock (syncObject) { Put(cm.key, cm.dg); } } /// /// 既にkeyが含まれているか返す /// /// /// public bool ContainsKey(string key) { lock (syncObject) { return dataGears.ContainsKey(key); } } } }