diff Pml/Elements/Dictionary.cs @ 0:3ab940a0c7a0

Initial commit
author Ivo Smits <Ivo@UCIS.nl>
date Tue, 11 Sep 2012 16:28:53 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Pml/Elements/Dictionary.cs	Tue Sep 11 16:28:53 2012 +0200
@@ -0,0 +1,165 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace UCIS.Pml {
+	public class PmlDictionary : PmlElement, IDictionary<string, PmlElement>, ICollection<PmlElement> {
+		private List<KeyValuePair<string, PmlElement>> pItems = new List<KeyValuePair<string, PmlElement>>();
+
+		public PmlDictionary() { }
+		public PmlDictionary(String[] keys, params PmlElement[] values) {
+			if (keys.Length != values.Length) throw new ArgumentException("keys.Length != values.Length", "values");
+			for (int i = 0; i < keys.Length; i++) Add(keys[i], values[i]);
+		}
+		public PmlDictionary(params KeyValuePair<string, PmlElement>[] Elements) {
+			foreach (KeyValuePair<string, PmlElement> Item in Elements) pItems.Add(Item);
+		}
+		public PmlDictionary(IEnumerable<KeyValuePair<string, PmlElement>> Elements) {
+			foreach (KeyValuePair<string, PmlElement> Item in Elements) pItems.Add(Item);
+		}
+
+		public override PmlElement GetChild(string Name) {
+			foreach (KeyValuePair<string, PmlElement> KVP in pItems) {
+				if (KVP.Key.Equals(Name, StringComparison.InvariantCultureIgnoreCase)) return KVP.Value;
+			}
+			return null;
+		}
+		public override PmlElement GetChild(int index) {
+			return pItems[index].Value;
+		}
+		public bool TryGetValue(string key, out PmlElement value) {
+			value = GetChild(key);
+			return (value != null);
+		}
+		public PmlElement this[string key] {
+			get { return GetChild(key); }
+			set {
+				Remove(key);
+				Add(key, value);
+			}
+		}
+
+		public PmlElement Add(string Key, PmlElement Element) {
+			if (Element == null) Element = new PmlNull();
+			pItems.Add(new KeyValuePair<string, PmlElement>(Key, Element));
+			return Element;
+		}
+		private void Add(KeyValuePair<string, PmlElement> item) {
+			pItems.Add(item);
+		}
+		public void Add(PmlElement item) {
+			Add("", item);
+		}
+
+		void IDictionary<string, PmlElement>.Add(string key, PmlElement value) {
+			Add(key, value);
+		}
+		void ICollection<KeyValuePair<string, PmlElement>>.Add(KeyValuePair<string, PmlElement> item) {
+			Add(item);
+		}
+
+		public bool Remove(PmlElement item) {
+			foreach (KeyValuePair<string, PmlElement> KVP in pItems) {
+				if (KVP.Value == item) {
+					pItems.Remove(KVP);
+					return true;
+				}
+			}
+			return false;
+		}
+		public bool Remove(string Key) {
+			foreach (KeyValuePair<string, PmlElement> KVP in pItems) {
+				if (KVP.Key.Equals(Key, StringComparison.InvariantCultureIgnoreCase)) {
+					pItems.Remove(KVP);
+					return true;
+				}
+			}
+			return false;
+		}
+		public bool Remove(KeyValuePair<string, PmlElement> item) {
+			return ((ICollection<KeyValuePair<string, PmlElement>>)pItems).Remove(item);
+		}
+
+		public int Count {
+			get { return pItems.Count; }
+		}
+
+		public void Clear() {
+			pItems.Clear();
+		}
+
+		public bool Contains(PmlElement item) {
+			foreach (KeyValuePair<string, PmlElement> KVP in pItems) {
+				if (KVP.Value == item) return true;
+			}
+			return false;
+		}
+		bool ICollection<KeyValuePair<string, PmlElement>>.Contains(KeyValuePair<string, PmlElement> item) {
+			return ((ICollection<KeyValuePair<string, PmlElement>>)pItems).Contains(item);
+		}
+		public bool ContainsKey(string key) {
+			foreach (KeyValuePair<string, PmlElement> KVP in pItems) {
+				if (KVP.Key.Equals(key, StringComparison.InvariantCultureIgnoreCase)) return true;
+			}
+			return false;
+		}
+
+		void ICollection<KeyValuePair<string, PmlElement>>.CopyTo(KeyValuePair<string, PmlElement>[] array, int arrayIndex) {
+			((ICollection<KeyValuePair<string, PmlElement>>)pItems).CopyTo(array, arrayIndex);
+		}
+		void ICollection<PmlElement>.CopyTo(PmlElement[] array, int arrayIndex) {
+			foreach (KeyValuePair<string, PmlElement> KVP in pItems) {
+				array[arrayIndex] = KVP.Value;
+				arrayIndex += 1;
+			}
+		}
+
+		public ICollection<string> Keys {
+			get {
+				List<string> Ret = new List<string>();
+				foreach (KeyValuePair<string, PmlElement> KVP in pItems) Ret.Add(KVP.Key);
+				return Ret;
+			}
+		}
+		public ICollection<PmlElement> Values {
+			get {
+				List<PmlElement> Ret = new List<PmlElement>();
+				foreach (KeyValuePair<string, PmlElement> KVP in pItems) Ret.Add(KVP.Value);
+				return Ret;
+			}
+		}
+		public IEnumerator<KeyValuePair<string, PmlElement>> GetEnumerator() { return pItems.GetEnumerator(); }
+		IEnumerator IEnumerable.GetEnumerator() { return pItems.GetEnumerator(); }
+		IEnumerator<PmlElement> IEnumerable<PmlElement>.GetEnumerator() { return Values.GetEnumerator(); }
+
+		public bool IsReadOnly { get { return false; } }
+
+
+		public override PmlType Type { get { return PmlType.Dictionary; } }
+
+		public override object ToObject() { return pItems; }
+		public override string ToString() { return null; }
+		public override bool ToBoolean() { return pItems.Count > 0; }
+		public override byte ToByte() { return (Byte)pItems.Count; }
+		public override decimal ToDecimal() { return pItems.Count; }
+		public override double ToDouble() { return pItems.Count; }
+		public override short ToInt16() { return (Int16)pItems.Count; }
+		public override int ToInt32() { return pItems.Count; }
+		public override long ToInt64() { return pItems.Count; }
+		public override sbyte ToSByte() { return (SByte)pItems.Count; }
+		public override float ToSingle() { return pItems.Count; }
+		public override ushort ToUInt16() { return (UInt16)pItems.Count; }
+		public override uint ToUInt32() { return (UInt32)pItems.Count; }
+		public override ulong ToUInt64() { return (UInt64)pItems.Count; }
+		public override char ToChar() { return '\0'; }
+		public override byte[] ToByteArray() { return null; }
+
+		//public override PmlElement GetChild(string name) { return GetChild(name); }
+		//public override PmlElement GetChild(int index) { return GetChild(index); }
+		public override IEnumerable<PmlElement> GetChildren() { return Values; }
+		public override IEnumerable<KeyValuePair<String, PmlElement>> GetNamedChildren() { return pItems; }
+		public override int GetChildCount() { return pItems.Count; }
+		public override void AddChild(string name, PmlElement value) { Add(name, value); }
+		public override void AddChild(PmlElement value) { Add(value); }
+	}
+}
\ No newline at end of file