public bool Transfer(IContainerReference sourceContainer, IContainerReference targetContainer, IItem entity) { if (!containers.ContainsKey(sourceContainer)) { return(false); } if (Equals(sourceContainer, targetContainer)) { // nothing to do. return(true); } if (CanAdd(targetContainer, entity)) { if (Remove(sourceContainer, entity)) { if (Add(targetContainer, entity)) { return(true); } // try to restore the broken entity .. if (!Add(sourceContainer, entity)) { throw new Exception("Whoha!"); } } } return(false); }
// public List<IItem> Contents(IContainerReference container, List<IItem> collector) // { // if (!containers.TryGetValue(container, out Container c)) // { // if (collector == null) // { // collector = new List<IItem>(); // } // else // { // collector.Clear(); // } // // return collector; // } // // return c.Contents(collector); // } public ReadOnlyListWrapper <IItem> Contents(IContainerReference container) { if (!containers.TryGetValue(container, out Container c)) { return(EmptySingleton); } return(c.Contents()); }
public bool CanAdd(IContainerReference container, IItem entity) { if (!containers.TryGetValue(container, out Container c)) { return(Container.CanAddPrecheck(container, entity)); } return(c.CanAdd(entity)); }
public bool Remove(IContainerReference container, IItem entity) { if (!containers.TryGetValue(container, out Container c)) { return(false); } var retval = c.Remove(entity); itemParents.Remove(entity); if (c.IsEmpty) { containers.Remove(container); } return(retval); }
public bool Add(IContainerReference container, IItem entity) { if (ContainerOf(entity) != null) { throw new ArgumentException("This item is already part of an collection."); } if (!containers.TryGetValue(container, out Container c)) { c = new Container(container); c.Add(entity); containers[container] = c; itemParents[entity] = container; } else { c.Add(entity); itemParents[entity] = container; } return(true); }
public static bool CanAddPrecheck(IContainerReference id, IItem item) { return(id.ContainerType >= item.ItemType.Container); }
public Container(IContainerReference id) { Id = id ?? throw new ArgumentNullException(nameof(id)); Items = new List <IItem>(); }