From ab6d3a84f9f52fdaafd557347be9f78bf0a89f66 Mon Sep 17 00:00:00 2001 From: Mauricio Matamoros Date: Mon, 23 Mar 2015 20:49:00 +0100 Subject: [PATCH] Location and object engines reworked Locations redefined to allow the same location be placement and beacon Reworked LocationManager to avoid duplicates Reworked GPSRObjectManager to avoid duplicates Robustness enhanced --- Beacon.cs | 70 ------------ Category.cs | 77 +++++++++++--- DifficultyDegree.cs | 6 ++ ExampleFilesGenerator.cs | 41 ++++--- Factory.cs | 49 +++++---- GPSRCmdGen.csproj | 3 +- GPSRObject.cs | 3 + GPSRObjectManager.cs | 209 ++++++++++++++++++------------------ Generator.cs | 12 ++- Loader.cs | 4 +- Location.cs | 30 +++++- LocationManager.cs | 212 ++++++++++++------------------------- Placement.cs | 75 ------------- Room.cs | 153 ++++++++++++++++---------- SpecificLocation.cs | 138 ++++++++++++++++++++++++ WildcardReplacer.cs | 4 +- bin/Release/GPSRCmdGen.exe | Bin 78848 -> 78848 bytes 17 files changed, 569 insertions(+), 517 deletions(-) delete mode 100644 Beacon.cs delete mode 100644 Placement.cs create mode 100644 SpecificLocation.cs diff --git a/Beacon.cs b/Beacon.cs deleted file mode 100644 index 419a73f..0000000 --- a/Beacon.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System; -using System.ComponentModel; -using System.Collections.Generic; -using System.Xml.Serialization; - -namespace GPSRCmdGen -{ - /// - /// Represents a place within a room on which a person can lie - /// - [Serializable, XmlRoot("beacon")] - public class Beacon : Location - { - #region Variables - - /// - /// Stores the room to which the beacon belongs - /// - private Room room; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// Intended for serialization purposes only - public Beacon() : base() { } - - /// - /// Initializes a new instance of the class. - /// - /// The name of the location. - /// Flag indicating whether the location is - /// suitable for placing objects. - public Beacon(string name) : base(name) { } - - #endregion - - #region Properties - - /// - /// Gets a value indicating whether the location is - /// suitable for placing objects. - /// - public override bool IsPlacement { get { return false; } } - - /// - /// Gets or sets the room to which the placement belongs - /// - [XmlIgnore] - public Room Room - { - get { return this.room; } - set - { - if (this.room == value) - return; - this.room = value; - if (value != null) - { - value.AddBeacon(this); - } - } - } - - #endregion - } -} diff --git a/Category.cs b/Category.cs index c01b952..40c8446 100644 --- a/Category.cs +++ b/Category.cs @@ -16,12 +16,12 @@ public class Category : INameable /// /// Stores the default placement default location for objects in the category /// - protected Placement defaultLocation; + protected SpecificLocation defaultLocation; /// /// Stores the list of objects in the category /// - protected List objects; + protected Dictionary objects; #endregion @@ -31,7 +31,7 @@ public class Category : INameable /// Initializes a new instance of the class. /// /// Intended for serialization purposes - public Category() : this("Unknown objects", Placement.TrashBin){ + public Category() : this("Unknown objects", null){ } /// @@ -39,16 +39,21 @@ public Category() : this("Unknown objects", Placement.TrashBin){ /// /// The name of the category. /// The default placement location for objects in the category. - public Category(string name, Placement defaultLocation){ + public Category(string name, SpecificLocation defaultLocation){ this.Name = name; this.defaultLocation = defaultLocation; - this.objects = new List (); + this.objects = new Dictionary(); } #endregion #region Properties + /// + /// Returns the number of objects in the category + /// + public int ObjectCount { get { return this.objects.Count; } } + /// /// Gets the name of the Category /// @@ -68,7 +73,7 @@ public string LocationString { } set { if (this.defaultLocation == null) - this.defaultLocation = new Placement(value); + this.defaultLocation = new SpecificLocation(value, true, false); else this.defaultLocation.Name = value; } @@ -90,7 +95,7 @@ public string RoomString set { if(this.defaultLocation == null) - this.defaultLocation = new Placement("unknown"); + this.defaultLocation = new SpecificLocation("unknown", true, false); this.defaultLocation.Room = new Room(value); } } @@ -99,7 +104,7 @@ public string RoomString /// Gets or sets the default location for objects in the category /// [XmlIgnore] - public Placement DefaultLocation { + public SpecificLocation DefaultLocation { get{ return this.defaultLocation;} set { this.defaultLocation = value; @@ -111,9 +116,9 @@ public Placement DefaultLocation { /// /// Use for (de)serialization purposes only [XmlElement("object")] - public List Objects + public GPSRObject[] Objects { - get { return this.objects; } + get { return new List(this.objects.Values).ToArray(); } set { if(value == null) return; foreach (GPSRObject o in value) @@ -130,10 +135,14 @@ public List Objects /// /// The ibject to add to the category public void AddObject(GPSRObject item){ - if (this.Objects.Contains (item)) + if (item == null) return; - item.Category = this; - this.Objects.Add (item); + if ((item.Category != null) && (item.Category != this)) + item.Category.RemoveObject(item); + if (!this.objects.ContainsKey(item.Name)) + this.objects.Add(item.Name, item); + if (item.Category != this) + item.Category = this; } /// @@ -176,13 +185,53 @@ public void AddObject(string name, GPSRObjectType type, DifficultyDegree tier){ this.AddObject (o); } + /// + /// Gets a value indicating if the category contains an object with the given name + /// + /// The name of the object to look for + /// true if the category contains a object with the given name, false otherwise + public bool Contains(string objectName) + { + return this.objects.ContainsKey(objectName); + } + + /// + /// Removes all objects + /// + public void Clear() + { + this.objects.Clear(); + } + + /// + /// Removes the given GPSRObject from the Category + /// + /// The GPSRObject to remove + /// true if the GPSRObject was in the collection, false otherwise + private bool RemoveObject(GPSRObject item) + { + if (item == null) + return false; + return RemoveObject(item.Name); + } + + /// + /// Removes the given GPSRObject from the room + /// + /// The name of the GPSRObject to remove + /// true if the GPSRObject was in the collection, false otherwise + private bool RemoveObject(string objectName) + { + return this.objects.Remove(objectName); + } + /// /// Returns a that represents the current . /// /// A that represents the current . public override string ToString () { - return string.Format ("{0} [{2} Objects | {1} ]", Name, DefaultLocation.Name, Objects.Count); + return string.Format ("{0} [{2} Objects | {1} ]", Name, DefaultLocation.Name, ObjectCount); } #endregion diff --git a/DifficultyDegree.cs b/DifficultyDegree.cs index 1f6bfb6..c5ce998 100644 --- a/DifficultyDegree.cs +++ b/DifficultyDegree.cs @@ -1,4 +1,5 @@ using System; +using System.Xml.Serialization; namespace GPSRCmdGen { @@ -10,25 +11,30 @@ public enum DifficultyDegree /// /// The difficulty degree is unkwnon /// + [XmlEnum("unknown")] Unknown = -1, /// /// Performing the task is trivial /// + [XmlEnum("none")] None = 0, /// /// Solving the task requires a minimum effort /// A task using an element with this attribute is easy to solve /// + [XmlEnum("easy")] Easy = 1, /// /// Solving the task requires a moderate effort /// A task using an element with this attribute is not so easy to solve /// + [XmlEnum("moderate")] Moderate = 3, /// /// Solving the task requires a high effort /// A task using an element with this attribute is hard to solve /// + [XmlEnum("high")] High = 5 } } diff --git a/ExampleFilesGenerator.cs b/ExampleFilesGenerator.cs index f30413e..d66c877 100644 --- a/ExampleFilesGenerator.cs +++ b/ExampleFilesGenerator.cs @@ -10,25 +10,42 @@ namespace GPSRCmdGen /// /// Example files generator. /// - public static class ExampleFilesGenerator - { + public static class ExampleFilesGenerator + { + /// + /// Adds the location of the objects in the given category list to the given rooms list + /// + /// The list of locations grouped by room + /// The list of objects grouped by category + private static void AddObjectLocations(List rooms, List categories) + { + foreach (Category cat in categories) + { + int ix = -1; + for (int i = 0; i < rooms.Count; ++i) + { + if (rooms[i].Name == cat.RoomString) ix = i; + } + if (ix == -1) + { + ix = rooms.Count; + rooms.Add(new Room(cat.RoomString)); + } + rooms[ix].AddLocation(cat.DefaultLocation); + } + } /// /// Writes down a set of example data files with information gathered from the Factory /// public static void GenerateExampleFiles(){ GestureContainer gestures = new GestureContainer(Factory.GetDefaultGestures()); - CategoryContainer categories = new CategoryContainer(Factory.GetDefaultObjects().Categories); - RoomContainer rooms = new RoomContainer (Factory.GetDefaultLocations ().Rooms); - NameContainer names = new NameContainer (Factory.GetDefaultNames ()); - foreach (Category cat in categories.Categories) { - if (!rooms.Rooms.Contains (cat.DefaultLocation.Room)) - rooms.Rooms.Add (cat.DefaultLocation.Room); - int rix = rooms.Rooms.IndexOf(cat.DefaultLocation.Room); - rooms.Rooms[rix].AddPlacement(cat.DefaultLocation); - } + CategoryContainer categories = new CategoryContainer(Factory.GetDefaultObjects()); + RoomContainer rooms = new RoomContainer (Factory.GetDefaultLocations ()); + NameContainer names = new NameContainer (Factory.GetDefaultNames ()); QuestionsContainer questions = new QuestionsContainer(Factory.GetDefaultQuestions()); - + + AddObjectLocations(rooms.Rooms, categories.Categories); SaveGrammars (); WriteDatafiles (gestures, categories, rooms, names, questions); } diff --git a/Factory.cs b/Factory.cs index 077ed41..dbbdc6a 100644 --- a/Factory.cs +++ b/Factory.cs @@ -27,16 +27,20 @@ public static List GetDefaultGestures () /// Gets a list with predefined locations. /// /// A list with predefined locations. - public static LocationManager GetDefaultLocations () + public static List GetDefaultLocations () { - LocationManager man = new LocationManager(); - man.Add (new Room ("bath room")); - man.Add(new Room("bed room")); - man.Add(new Room("dining room")); - man.Add(new Room("hall")); - man.Add(new Room("kitchen")); - man.Add(new Room("corridor")); - return man; + List tmp = new List(); + Room bedroom = new Room("bedroom"); + bedroom.AddBeacon("chair"); + bedroom.AddPlacement("bin"); + bedroom.AddLocation("bed", true, true); + tmp.Add(bedroom); + tmp.Add (new Room ("bathroom")); + tmp.Add(new Room("dining room")); + tmp.Add(new Room("hall")); + tmp.Add(new Room("kitchen")); + tmp.Add(new Room("corridor")); + return tmp; } /// @@ -85,48 +89,47 @@ public static List GetDefaultNames () /// Gets a GPSRObjectManager which contains example GPSRObjects grouped by category. /// /// A GPSRObjectManager with default objects. - public static GPSRObjectManager GetDefaultObjects () + public static List GetDefaultObjects () { - GPSRObjectManager man = new GPSRObjectManager (); + List tmp = new List(); - Placement shelf = new Placement("shelf"); + SpecificLocation shelf = SpecificLocation.Placement("shelf"); shelf.Room = new Room("dining room"); Category beverages = new Category ("beverages", shelf); beverages.AddObject ("milk", GPSRObjectType.Known ); beverages.AddObject ("coke", GPSRObjectType.Known ); beverages.AddObject ("orange juice", GPSRObjectType.Known ); beverages.AddObject ("beer", GPSRObjectType.Known, DifficultyDegree.High ); - man.Add (beverages); + tmp.Add (beverages); - Placement kitchenTable = new Placement("kitchen table"); + SpecificLocation kitchenTable = SpecificLocation.Placement("kitchen table"); kitchenTable.Room = new Room("kitchen"); Category fruits = new Category ("fruits", kitchenTable); fruits.AddObject ("apple", GPSRObjectType.Alike ); fruits.AddObject ("banana", GPSRObjectType.Alike ); fruits.AddObject ("orange", GPSRObjectType.Alike ); fruits.AddObject ("pear", GPSRObjectType.Alike ); - man.Add (fruits); + tmp.Add (fruits); - Placement dinnerTable = new Placement("dinner table"); + SpecificLocation dinnerTable = SpecificLocation.Placement("dinner table"); dinnerTable.Room = new Room("dining room"); - Category snacks = new Category ("", dinnerTable); + Category snacks = new Category ("snacks", dinnerTable); snacks.AddObject ("lays", GPSRObjectType.Known, DifficultyDegree.Moderate ); snacks.AddObject ("crackers", GPSRObjectType.Known ); snacks.AddObject ("pringles", GPSRObjectType.Known ); snacks.AddObject ("chocolate", GPSRObjectType.Known ); - man.Add (snacks); + tmp.Add (snacks); - Placement bathroomLocker = new Placement("bathroom locker"); - bathroomLocker.Room = new Room("bath room"); + SpecificLocation bathroomLocker = SpecificLocation.Placement("bathroom locker"); + bathroomLocker.Room = new Room("bathroom"); Category cleaningStuff = new Category ("cleaning stuff", bathroomLocker); cleaningStuff.AddObject ("cloth", GPSRObjectType.Alike, DifficultyDegree.High ); cleaningStuff.AddObject ("detergent", GPSRObjectType.Known, DifficultyDegree.High); cleaningStuff.AddObject ("sponge", GPSRObjectType.Known ); cleaningStuff.AddObject ("brush", GPSRObjectType.Known, DifficultyDegree.High ); - man.Add (cleaningStuff); + tmp.Add (cleaningStuff); - - return man; + return tmp; } diff --git a/GPSRCmdGen.csproj b/GPSRCmdGen.csproj index ac428f6..18bb473 100644 --- a/GPSRCmdGen.csproj +++ b/GPSRCmdGen.csproj @@ -38,7 +38,6 @@ - @@ -46,7 +45,7 @@ - + diff --git a/GPSRObject.cs b/GPSRObject.cs index 21cc11a..cbdf06d 100644 --- a/GPSRObject.cs +++ b/GPSRObject.cs @@ -17,16 +17,19 @@ public enum GPSRObjectType /// differences between two of the kind, /// such as two coke cans of the same brand and model). /// + [XmlEnum("known")] Known = 0, /// /// Some object features are known /// (Irregular with perceptible differences between two of the kind, /// such as two apples or bannanas). /// + [XmlEnum("alike")] Alike = 1, /// /// No object features are known, thus, it can not be identified /// + [XmlEnum("unknown")] Unknown = -1 } diff --git a/GPSRObjectManager.cs b/GPSRObjectManager.cs index 0b08165..53d00f4 100644 --- a/GPSRObjectManager.cs +++ b/GPSRObjectManager.cs @@ -1,38 +1,49 @@ using System; using System.Collections.Generic; -using System.ComponentModel; -using System.Xml.Serialization; +using System.ComponentModel; +using System.Text; namespace GPSRCmdGen { - public class GPSRObjectManager : ICollection, ICollection, IEnumerable + public class GPSRObjectManager : IEnumerable { - private List categories; - private List objects; - - public GPSRObjectManager () - { - this.categories = new List (); - this.objects = new List (); - } - - Location GetCategoryLocation (Category category) - { - for (int i = 0; i < this.categories.Count; ++i) { - if (category.Name == this.categories [i].Name) - return this.categories [i].DefaultLocation; - } - return null; - } - - [XmlArray("categories")] - [XmlArrayItem("category")] - internal List Categories{ - get{ return this.categories;} - } - - [XmlIgnore] - public List Objects { get{return this.objects;} } + private Dictionary categories; + + private GPSRObjectManager () + { + this.categories = new Dictionary(); + } + + public Location GetCategoryLocation (Category category) + { + if ((category == null) || !this.categories.ContainsKey(category.Name)) + return null; + return this.categories[category.Name].DefaultLocation; + } + + internal List Categories{ get{ return new List(this.categories.Values);} } + + /// + /// Gets a lists with all the objects in the container. This is an O(n) operation + /// + public List Objects + { + get + { + List objects = new List(100); + foreach (Category c in this.categories.Values) + { + foreach (GPSRObject o in c.Objects) + objects.Add(o); + } + return objects; + } + } + + /// + /// Returns the number of GPSRObjects in the collection + /// + public int CategoryCount { get { return this.categories.Count; } } #region ICollection implementation @@ -40,15 +51,16 @@ public void Add (Category item) { if (item == null) return; - if (!this.categories.Contains (item)) { - this.categories.Add (item); - } + if (!this.categories.ContainsKey (item.Name)) { + this.categories.Add (item.Name, item); + return; + } + Category category = this.categories[item.Name]; foreach (GPSRObject o in item.Objects) { - if (this.objects.Contains (o)) - continue; - this.objects.Add (o); - // Fix category + if (category.Contains (o.Name)) + continue; o.Category = item; + category.AddObject (o); } } @@ -57,92 +69,67 @@ public void Add (GPSRObject item) if (item == null) return; if (item.Category == null) - throw new ArgumentException ("Cannot add objects without a category"); - if (!this.categories.Contains (item.Category)) - this.Add (item.Category); - else if (!this.objects.Contains (item)) { - if (item.Category.DefaultLocation != this.GetCategoryLocation (item.Category)) - throw new Exception ("Category location mismatch"); - this.objects.Add (item); - } + throw new ArgumentException ("Cannot add objects without a category"); + if (!this.categories.ContainsKey(item.Category.Name)) + this.Add(item.Category); + else this.categories[item.Category.Name].AddObject(item); } public void Clear () { - this.objects.Clear (); this.categories.Clear (); } public bool Contains (Category item) - { - return this.categories.Contains (item); + { + if (item == null) return false; + return this.categories.ContainsKey (item.Name); } public bool Contains (Location item) - { - for (int i = 0; i < this.categories.Count; ++i) { - if (item == this.categories [i].DefaultLocation) - return true; - } + { + if (item == null) return false; + foreach (Category c in this.categories.Values) + { + if (c.LocationString == item.Name) + return true; + } return false; } public bool Contains (GPSRObject item) - { - return this.objects.Contains (item); - } - - public void CopyTo (Category[] array, int arrayIndex) - { - this.categories.CopyTo (array, arrayIndex); - } - - public void CopyTo (GPSRObject[] array, int arrayIndex) - { - this.objects.CopyTo (array, arrayIndex); - } - - public bool Remove (Category item) - { - if (this.categories.Remove (item)) { - foreach (GPSRObject o in item.Objects) - this.objects.Remove (o); - return true; - } - return false; - } - - public bool Remove (GPSRObject item) - { - if (item == null) - return false; - if (this.objects.Remove (item)) { - this.categories.Remove (item.Category); - return true; - } + { + foreach (Category c in this.categories.Values) + { + if (c.Contains(item.Name)) + return true; + } return false; + } + + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + foreach (Category c in this.categories.Values){ + sb.Append(c.Name); + sb.Append(" ("); + sb.Append(c.ObjectCount); + sb.Append("), "); + } + if (sb.Length > 2) sb.Length -= 2; + return sb.ToString(); } - public bool Remove (Location item) - { - throw new ArgumentException ("Locations can not be removed directly from this collection"); - } - - /// - /// Returns the number of GPSRObjects in the collection - /// - public int Count { get { return objects.Count; } } - - public bool IsReadOnly { get { return false; } } - #endregion #region IEnumerable implementation IEnumerator System.Collections.Generic.IEnumerable.GetEnumerator () { - return this.categories.GetEnumerator (); - } + return this.categories.Values.GetEnumerator (); + } + + /* IEnumerator System.Collections.Generic.IEnumerable.GetEnumerator () { @@ -156,16 +143,26 @@ IEnumerator System.Collections.Generic.IEnumerable.GetEnumer l.Add (this.categories [i].DefaultLocation); return l.GetEnumerator (); } - - #endregion - - #region IEnumerable implementation - + + */ + + #endregion + + #region IEnumerable implementation + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () { - return this.objects.GetEnumerator (); - } - + return this.categories.Values.GetEnumerator (); + } + #endregion + + #region Singleton + + private static GPSRObjectManager instance; + static GPSRObjectManager() { instance = new GPSRObjectManager(); } + + public static GPSRObjectManager Instance { get { return instance; } } + #endregion } } diff --git a/Generator.cs b/Generator.cs index 76f4f44..31230d0 100644 --- a/Generator.cs +++ b/Generator.cs @@ -58,9 +58,9 @@ public Generator () // Initialize all objects this.rnd = new Random (DateTime.Now.Millisecond); this.allGestures = new List (); - this.allLocations = new LocationManager(); + this.allLocations = LocationManager.Instance; this.allNames = new List (); - this.allObjects = new GPSRObjectManager (); + this.allObjects = GPSRObjectManager.Instance; this.allGrammars = new List (); this.allQuestions = new List(); GenerateSortedDifficultyDegreesArray (); @@ -250,7 +250,9 @@ public void LoadLocations () this.allLocations = Loader.LoadLocations (Loader.GetPath("Locations.xml")); Green("Done!"); } catch { - this.allLocations = Factory.GetDefaultLocations (); + List defaultRooms = Factory.GetDefaultLocations (); + foreach (Room room in defaultRooms) + this.allLocations.Add(room); Err ("Failed! Default Locations loaded"); } } @@ -280,7 +282,9 @@ public void LoadObjects () this.allObjects = Loader.LoadObjects(Loader.GetPath("Objects.xml")); Green("Done!"); } catch { - this.allObjects = Factory.GetDefaultObjects (); + List defaultCategories = Factory.GetDefaultObjects(); + foreach (Category category in defaultCategories) + this.allObjects.Add(category); Err ("Failed! Default Objects loaded"); } } diff --git a/Loader.cs b/Loader.cs index f14c359..1ed3f41 100644 --- a/Loader.cs +++ b/Loader.cs @@ -163,7 +163,7 @@ public static LocationManager LoadLocations(string filePath) RoomContainer container = Load(filePath); if (container == null) throw new Exception("No objects found"); - LocationManager manager = new LocationManager(); + LocationManager manager = LocationManager.Instance; foreach (Room r in container.Rooms) manager.Add(r); return manager; @@ -178,7 +178,7 @@ public static GPSRObjectManager LoadObjects (string filePath) CategoryContainer container = Load (filePath); if (container == null) throw new Exception ("No objects found"); - GPSRObjectManager manager = new GPSRObjectManager(); + GPSRObjectManager manager = GPSRObjectManager.Instance; foreach (Category c in container.Categories) manager.Add (c); return manager; diff --git a/Location.cs b/Location.cs index 0bd69f7..c528e2e 100644 --- a/Location.cs +++ b/Location.cs @@ -6,9 +6,10 @@ namespace GPSRCmdGen { [Serializable, XmlRoot("location")] - [XmlInclude(typeof(Room)), XmlInclude(typeof(Placement)), XmlInclude(typeof(Beacon))] + [XmlInclude(typeof(Room)), XmlInclude(typeof(SpecificLocation)), XmlInclude(typeof(SpecificLocation))] public abstract class Location : INameable, IComparable, IEquatable { + #region Constructors /// @@ -21,11 +22,26 @@ public Location() : this(String.Empty) { } /// Initializes a new instance of the class. /// /// The name of the location. - public Location(string name) + public Location(string name) : this(name, false, false) { this.Name = name; } + /// + /// Initializes a new instance of the class. + /// + /// The name of the location. + /// Indicates whether the location is + /// suitable for placing objects. + /// Indicates whether the location is + /// suitable for placing objects. + public Location(string name, bool placement, bool beacon) + { + this.Name = name; + this.IsPlacement = placement; + this.IsBeacon = beacon; + } + #endregion #region Properties @@ -36,11 +52,19 @@ public Location(string name) [XmlAttribute("name")] public string Name { get; set; } + /// + /// Gets a value indicating whether the location is + /// suitable for placing a person. + /// + [XmlIgnore] + public abstract bool IsBeacon { get; set; } + /// /// Gets a value indicating whether the location is /// suitable for placing objects. /// - public abstract bool IsPlacement { get; } + [XmlIgnore] + public abstract bool IsPlacement { get; set; } public int CompareTo(Location other) { diff --git a/LocationManager.cs b/LocationManager.cs index 3805539..7f2e0f0 100644 --- a/LocationManager.cs +++ b/LocationManager.cs @@ -1,50 +1,25 @@ using System; using System.Collections.Generic; using System.ComponentModel; -using System.Xml.Serialization; +using System.Text; namespace GPSRCmdGen { - public class LocationManager : ICollection, ICollection, ICollection, IEnumerable + public class LocationManager : IEnumerable //, ICollection, ICollection, { - private List rooms; - private List beacons; - private List placements; + private Dictionary rooms; - public LocationManager() + private LocationManager() { - this.rooms = new List(); - this.beacons = new List(); - this.placements = new List(); + this.rooms = new Dictionary(); } - public Room GetRoomOfLocation(string locationName) - { - for (int i = 0; i < this.placements.Count; ++i) - { - if (locationName == this.placements[i].Name) - return this.placements[i].Room; - } - for (int i = 0; i < this.beacons.Count; ++i) - { - if (locationName == this.beacons[i].Name) - return this.beacons[i].Room; - } - return null; - } - - [XmlArray("rooms")] - [XmlArrayItem("room")] - internal List Rooms - { - get { return this.rooms; } - } - - [XmlIgnore] - public List Beacons { get { return this.beacons; } } + internal List Rooms { get { return new List(this.rooms.Values); } } - [XmlIgnore] - public List Placements { get { return this.placements; } } + /// + /// Returns the number of rooms in the collection + /// + public int RoomCount { get { return rooms.Count; } } #region ICollection implementation @@ -52,165 +27,101 @@ public void Add(Room item) { if (item == null) return; - if (!this.rooms.Contains(item)) - { - this.rooms.Add(item); - } - foreach (Beacon b in item.Beacons) + if (!this.rooms.ContainsKey(item.Name)) { - if (this.beacons.Contains(b)) - continue; - this.beacons.Add(b); - // Fix room - b.Room = item; + this.rooms.Add(item.Name, item); + return; } - foreach (Placement o in item.Placements) + Room room = this.rooms[item.Name]; + foreach (SpecificLocation location in item.Locations) { - if (this.placements.Contains(o)) + if (room.Contains(location.Name)) continue; - this.placements.Add(o); - // Fix room - o.Room = item; + location.Room = room; + room.AddLocation(location); } } - public void Add(Beacon item) + public void Add(SpecificLocation item) { if (item == null) return; if (item.Room == null) - throw new ArgumentException("Cannot add beacons without a room"); - if (!this.rooms.Contains(item.Room)) + throw new ArgumentException("Cannot add locations without a room"); + if (!this.rooms.ContainsKey(item.Room.Name)) this.Add(item.Room); - else if (!this.beacons.Contains(item)) - this.beacons.Add(item); - } - - public void Add(Placement item) - { - if (item == null) - return; - if (item.Room == null) - throw new ArgumentException("Cannot add placements without a room"); - if (!this.rooms.Contains(item.Room)) - this.Add(item.Room); - else if (!this.placements.Contains(item)) - this.placements.Add(item); + else this.rooms[item.Room.Name].AddLocation(item); } public void Clear() { - this.placements.Clear(); - this.beacons.Clear(); + foreach (Room room in rooms.Values) + room.Clear(); this.rooms.Clear(); } public bool Contains(Room item) { - return this.rooms.Contains(item); - } - - public bool Contains(Beacon item) - { - return this.beacons.Contains(item); - } - - public bool Contains(Placement item) - { - return this.placements.Contains(item); - } - - public void CopyTo(Room[] array, int arrayIndex) - { - this.rooms.CopyTo(array, arrayIndex); - } - - public void CopyTo(Beacon[] array, int arrayIndex) - { - this.beacons.CopyTo(array, arrayIndex); - } - - public void CopyTo(Placement[] array, int arrayIndex) - { - this.placements.CopyTo(array, arrayIndex); + if (item == null) return false; + return this.rooms.ContainsKey(item.Name); } - public bool Remove(Room item) + public bool Contains(SpecificLocation item) { - if (this.rooms.Remove(item)) + if (item == null) return false; + foreach (Room room in rooms.Values) { - foreach (Beacon b in item.Beacons) - this.beacons.Remove(b); - foreach (Placement p in item.Placements) - this.placements.Remove(p); - return true; + if (room.Contains(item.Name)) + return true; } return false; } - public bool Remove(Beacon item) + public override string ToString() { - if (item == null) - return false; - if (this.beacons.Remove(item)) + StringBuilder sb = new StringBuilder(); + foreach (Room r in this.rooms.Values) { - this.rooms.Remove(item.Room); - return true; + sb.Append(r.Name); + sb.Append(" ("); + sb.Append(r.LocationCount); + sb.Append("), "); } - return false; + if (sb.Length > 2) sb.Length -= 2; + return sb.ToString(); } - public bool Remove(Placement item) + #endregion + + #region IEnumerable implementation + + IEnumerator System.Collections.Generic.IEnumerable.GetEnumerator() { - if (item == null) - return false; - if (this.placements.Remove(item)) + List l = new List(100); + foreach (Room r in this.rooms.Values) { - this.rooms.Remove(item.Room); - return true; + l.Add(r); + foreach (Location b in r.Locations) + l.Add(b); + foreach (Location p in r.Locations) + l.Add(p); } - return false; + return l.GetEnumerator(); } - /// - /// Returns the number of rooms in the collection - /// - public int Count { get { return rooms.Count; } } - - public bool IsReadOnly { get { return false; } } - - #endregion - - #region IEnumerable implementation + /* IEnumerator System.Collections.Generic.IEnumerable.GetEnumerator() { return this.rooms.GetEnumerator(); } - IEnumerator System.Collections.Generic.IEnumerable.GetEnumerator() + IEnumerator System.Collections.Generic.IEnumerable.GetEnumerator() { - return this.beacons.GetEnumerator(); + return this.locations.GetEnumerator(); } - IEnumerator System.Collections.Generic.IEnumerable.GetEnumerator() - { - return this.placements.GetEnumerator(); - } - - IEnumerator System.Collections.Generic.IEnumerable.GetEnumerator() - { - List l = new List(this.rooms.Count + this.beacons.Count + this.placements.Count); - foreach (Room r in this.rooms) - { - l.Add(r); - foreach (Location b in r.Beacons) - l.Add(b); - foreach (Location p in r.Placements) - l.Add(p); - } - return l.GetEnumerator(); - } + */ #endregion @@ -222,6 +133,15 @@ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() } #endregion + + #region Singleton + + private static LocationManager instance; + static LocationManager() { instance = new LocationManager(); } + + public static LocationManager Instance { get { return instance; } } + + #endregion } } diff --git a/Placement.cs b/Placement.cs deleted file mode 100644 index 3aaa042..0000000 --- a/Placement.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; -using System.ComponentModel; -using System.Collections.Generic; -using System.Xml.Serialization; - -namespace GPSRCmdGen -{ - /// - /// Represents a place within a room on which an object can lie - /// - [Serializable, XmlRoot("placement")] - public class Placement : Location - { - #region Variables - - /// - /// Stores the room to which the placement belongs - /// - private Room room; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// Intended for serialization purposes only - public Placement() : base() { } - - /// - /// Initializes a new instance of the class. - /// - /// The name of the location. - /// Flag indicating whether the location is - /// suitable for placing objects. - public Placement(string name) : base(name) { } - - #endregion - - #region Properties - - /// - /// Gets a value indicating whether the location is - /// suitable for placing objects. - /// - public override bool IsPlacement { get { return true; } } - - /// - /// Gets or sets the room to which the placement belongs - /// - [XmlIgnore] - public Room Room - { - get { return this.room; } - set - { - if (this.room == value) - return; - this.room = value; - if (value != null) - { - value.AddPlacement(this); - } - } - } - - /// - /// Gets a placement location called bin - /// - public static Placement TrashBin { get { return new Placement("bin"); } } - - #endregion - } -} diff --git a/Room.cs b/Room.cs index 0f48795..d730dcc 100644 --- a/Room.cs +++ b/Room.cs @@ -9,19 +9,14 @@ namespace GPSRCmdGen /// Represents a room within the house /// [Serializable, XmlRoot("room")] - public class Room : Location, IEquatable + public class Room : Location { #region Variables - /// - /// Stores the list of beacons in this room - /// - protected List beacons; - /// /// Stores the list of placements in this room /// - protected List placements; + protected Dictionary locations; #endregion @@ -40,8 +35,7 @@ public Room() : this(String.Empty) { } /// Flag indicating whether the location is /// suitable for placing objects. public Room(string name) : base(name) { - this.beacons = new List(); - this.placements = new List(); + this.locations = new Dictionary(); } #endregion @@ -49,100 +43,143 @@ public Room(string name) : base(name) { #region Properties /// - /// Gets or sets the list of beacons in the room. + /// Gets a value indicating whether the location is suitable for placing a person. /// - /// Use for (de)serialization purposes only - [XmlElement("beacon")] - public List Beacons - { - get { return this.beacons; } - set - { - if (value == null) return; - foreach (Beacon b in value) - AddBeacon(b); - } - } + [XmlIgnore] + public override bool IsBeacon { get { return false; } set { } } /// - /// Gets a value indicating whether the location is - /// suitable for placing objects. + /// Gets a value indicating whether the location is suitable for placing objects. /// - public override bool IsPlacement { get { return false; } } + [XmlIgnore] + public override bool IsPlacement { get { return false; } set { } } /// /// Gets or sets the list of placements in the room. /// /// Use for (de)serialization purposes only - [XmlElement("placement")] - public List Placements + [XmlElement("location")] + public SpecificLocation[] Locations { - get { return this.placements; } + get { return new List(this.locations.Values).ToArray(); } set { if (value == null) return; - foreach (Placement p in value) - AddPlacement(p); + foreach (SpecificLocation location in value) + AddLocation(location); } } + /// + /// Returns the number of locations in the room + /// + public int LocationCount { get { return this.locations.Count; } } + #endregion #region Methods /// - /// Adds a beacon to the room + /// Adds an beacon to the room /// - /// The beacon to add to the room. - public void AddBeacon(Beacon item) + /// The name of the beacon to add. + public void AddBeacon(string name) { - if (this.Beacons.Contains(item)) - return; - item.Room = this; - this.Beacons.Add(item); + SpecificLocation b = new SpecificLocation(name, false, true); + this.AddLocation(b); } /// - /// Adds an beacon to the room + /// Adds a specific location to the room /// - /// The name of the beacon to add. - public void AddBeacon(string name) + /// The specific location to add to the room. + public void AddLocation(SpecificLocation item) { - Beacon b = new Beacon(name); - this.AddBeacon(b); + if(item == null) + return; + if ((item.Room != null) && (item.Room != this)) + item.Room.RemoveLocation(item); + if (this.locations.ContainsKey(item.Name)) + { + this.locations[item.Name].IsBeacon |= item.IsBeacon; + this.locations[item.Name].IsPlacement |= item.IsPlacement; + } + else + this.locations.Add(item.Name, item); + if (item.Room != this) + item.Room = this; } /// - /// Adds a placement to the room + /// Adds a specific location to the room /// - /// The placement to add to the room. - public void AddPlacement(Placement item) + /// The name of the location. + /// Indicates whether the location is + /// suitable for placing objects. + /// Indicates whether the location is + /// suitable for placing objects. + public void AddLocation(string name, bool placement, bool beacon) { - if (this.Placements.Contains(item)) - return; - item.Room = this; - this.Placements.Add(item); + AddLocation(new SpecificLocation(name, placement, beacon)); } /// - /// Adds an beacon to the room + /// Adds an placement to the room /// /// The name of the placement to add. public void AddPlacement(string name) { - Placement p = new Placement(name); - this.AddPlacement(p); + SpecificLocation p = new SpecificLocation(name, true, false); + this.AddLocation(p); + } + + /// + /// Gets a value indicating if the room contains a location with the given name + /// + /// The name of the room to look for + /// true if the collection contains a room with the given name, false otherwise + public bool Contains(string locationName) + { + return this.locations.ContainsKey(locationName); + } + + /// + /// Removes all locations + /// + public void Clear() + { + this.locations.Clear(); + } + + /// + /// Removes the given location from the room + /// + /// The room to remove + /// true if the room was in the collection, false otherwise + private bool RemoveLocation(SpecificLocation item) + { + if (item == null) + return false; + return RemoveLocation(item.Name); + } + + /// + /// Removes the given location from the room + /// + /// The name of the room to remove + /// true if the room was in the collection, false otherwise + private bool RemoveLocation(string locationName) + { + return this.locations.Remove(locationName); } /// - /// Determines whether the specified is equal to the current by comparing their names. + /// Returns a that represents the current . /// - /// The to compare with the current . - /// true if the specified is equal to the current - /// ; otherwise, false. - public bool Equals(Room other) + /// A that represents the current . + public override string ToString() { - return String.Compare(this.Name, other.Name, true) == 0; + return string.Format("{0} ({1} locations)", Name, LocationCount); } #endregion diff --git a/SpecificLocation.cs b/SpecificLocation.cs new file mode 100644 index 0000000..4d444d7 --- /dev/null +++ b/SpecificLocation.cs @@ -0,0 +1,138 @@ +using System; +using System.ComponentModel; +using System.Collections.Generic; +using System.Xml.Serialization; + +namespace GPSRCmdGen +{ + /// + /// Represents a place within a room on which an object can lie + /// + [Serializable, XmlRoot("location")] + public class SpecificLocation : Location, IEquatable + { + #region Variables + + /// + /// Stores the room to which the placement belongs + /// + private Room room; + + /// + ///Indicates whether the location is suitable for placing a person. + /// + private bool isBeacon; + + /// + /// Indicates whether the location is suitable for placing objects. + /// + private bool isPlacement; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// Intended for serialization purposes only + public SpecificLocation() : base() { } + + /// + /// Initializes a new instance of the class. + /// + /// The name of the location. + /// Indicates whether the location is + /// suitable for placing objects. + /// Indicates whether the location is + /// suitable for placing objects. + public SpecificLocation(string name, bool placement, bool beacon) : base(name, placement, beacon) { } + + #endregion + + #region Properties + + /// + /// Gets a value indicating whether the location is suitable for placing a person. + /// + [XmlAttribute("isBeacon"), DefaultValue(false)] + public override bool IsBeacon + { + get { return this.isBeacon; } + set { this.isBeacon = value; } + } + + /// + /// Gets a value indicating whether the location is suitable for placing objects. + /// + [XmlAttribute("isPlacement"), DefaultValue(false)] + public override bool IsPlacement + { + get { return this.isPlacement; } + set { this.isPlacement = value; } + } + + /// + /// Gets or sets the room to which the placement belongs + /// + [XmlIgnore] + public Room Room + { + get { return this.room; } + set + { + if (this.room == value) + return; + this.room = value; + if (value != null) + value.AddLocation(this); + } + } + + /// + /// Determines whether the specified is equal to the current by comparing their names. + /// + /// The to compare with the current . + /// true if the specified is equal to the current + /// ; otherwise, false. + public bool Equals(SpecificLocation other) + { + return String.Compare(this.Name, other.Name, true) == 0; + } + + public override int GetHashCode() + { + return this.Name.GetHashCode(); + } + + /// + /// Determines whether the specified is equal to the current at object level. + /// + /// The to compare with the current . + /// true if the specified is equal to the current + /// ; otherwise, false. + public override bool Equals(object obj) + { + return base.Equals(obj); + } + + /// + /// Creates a new instance of SpecificLocation with the given name and the properties + /// IsBeacon=true, IsPlacement=false + /// + /// The name of the beacon location + /// A Specific Location + public static SpecificLocation Beacon(string name) { return new SpecificLocation(name, false, true); } + + /// + /// Creates a new instance of SpecificLocation with the given name and the properties + /// IsBeacon=false, IsPlacement=true + /// + /// The name of the placement location + /// A Specific Location + public static SpecificLocation Placement(string name) { return new SpecificLocation(name, true, false); } + + + #endregion + } +} diff --git a/WildcardReplacer.cs b/WildcardReplacer.cs index 5436f53..01a3e82 100644 --- a/WildcardReplacer.cs +++ b/WildcardReplacer.cs @@ -281,7 +281,7 @@ private Location GetLocation(string keycode) switch (keycode) { case "beacon": - item = this.avLocations.First(l => l is Beacon); + item = this.avLocations.First(l => l.IsBeacon); break; case "room": @@ -289,7 +289,7 @@ private Location GetLocation(string keycode) break; case "placement": - item = this.avLocations.First(l => l is Placement); + item = this.avLocations.First(l => l.IsPlacement); break; default: diff --git a/bin/Release/GPSRCmdGen.exe b/bin/Release/GPSRCmdGen.exe index c9f6de9c998cd5ad006e58ff26838fcb468d7213..a79179cb8ddcfe21b940389d7a92a404394d2965 100755 GIT binary patch literal 78848 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 LfB5_Vj|2Y)r%)H$ literal 78848 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