From a4061b9af0ed7f49f190e03a68d8b6bb1b793449 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Fri, 5 Feb 2016 02:13:03 +0600 Subject: [PATCH] encapsulate dict and list --- Assembly-CSharp.csproj | 1 + .../IsoTools/Scripts/Internal/IsoAssocList.cs | 51 +++++++++++++++++++ .../Scripts/Internal/IsoAssocList.cs.meta | 12 +++++ Assets/IsoTools/Scripts/IsoObject.cs | 23 ++++----- Assets/IsoTools/Scripts/IsoWorld.cs | 42 ++++----------- 5 files changed, 84 insertions(+), 45 deletions(-) create mode 100644 Assets/IsoTools/Scripts/Internal/IsoAssocList.cs create mode 100644 Assets/IsoTools/Scripts/Internal/IsoAssocList.cs.meta diff --git a/Assembly-CSharp.csproj b/Assembly-CSharp.csproj index e080e67..bb01da7 100644 --- a/Assembly-CSharp.csproj +++ b/Assembly-CSharp.csproj @@ -51,6 +51,7 @@ + diff --git a/Assets/IsoTools/Scripts/Internal/IsoAssocList.cs b/Assets/IsoTools/Scripts/Internal/IsoAssocList.cs new file mode 100644 index 0000000..53749df --- /dev/null +++ b/Assets/IsoTools/Scripts/Internal/IsoAssocList.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; + +namespace IsoTools.Internal { + public class IsoAssocList { + IsoList _list; + Dictionary _dict; + IEqualityComparer _comparer; + + public IsoAssocList() { + _list = new IsoList(); + _dict = new Dictionary(); + _comparer = EqualityComparer.Default; + } + + public IsoAssocList(int capacity) { + _list = new IsoList(capacity); + _dict = new Dictionary(capacity); + _comparer = EqualityComparer.Default; + } + + public IsoList RawList { + get { + return _list; + } + } + + public void Add(T item) { + if ( !_dict.ContainsKey(item) ) { + _dict.Add(item, _list.Count); + _list.Push(item); + } + } + + public void Remove(T item) { + int index; + if ( _dict.TryGetValue(item, out index) ) { + _dict.Remove(item); + var reordered =_list.UnorderedRemoveAt(index); + if ( !_comparer.Equals(reordered, item) ) { + _dict[reordered] = index; + } + } + } + + public void Clear() { + _list.Clear(); + _dict.Clear(); + } + } +} diff --git a/Assets/IsoTools/Scripts/Internal/IsoAssocList.cs.meta b/Assets/IsoTools/Scripts/Internal/IsoAssocList.cs.meta new file mode 100644 index 0000000..566ae82 --- /dev/null +++ b/Assets/IsoTools/Scripts/Internal/IsoAssocList.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: da238ac7d8fe342d3a862a1c158c2469 +timeCreated: 1454613003 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/IsoTools/Scripts/IsoObject.cs b/Assets/IsoTools/Scripts/IsoObject.cs index e428465..6a1d618 100644 --- a/Assets/IsoTools/Scripts/IsoObject.cs +++ b/Assets/IsoTools/Scripts/IsoObject.cs @@ -165,16 +165,15 @@ namespace IsoTools { // --------------------------------------------------------------------- public class InternalState { - public bool Dirty = false; - public bool Placed = false; - public Rect ScreenRect = new Rect(); - public float Offset3d = 0.0f; - public IsoUtils.MinMax MinMax3d = IsoUtils.MinMax.zero; - public Vector2 MinSector = Vector2.zero; - public Vector2 MaxSector = Vector2.zero; - public Dictionary SelfDependsD = new Dictionary(); - public IsoList SelfDependsL = new IsoList(); - public HashSet TheirDepends = new HashSet(); + public bool Dirty = false; + public bool Placed = false; + public Rect ScreenRect = new Rect(); + public float Offset3d = 0.0f; + public IsoUtils.MinMax MinMax3d = IsoUtils.MinMax.zero; + public Vector2 MinSector = Vector2.zero; + public Vector2 MaxSector = Vector2.zero; + public IsoAssocList SelfDepends = new IsoAssocList(47); + public IsoAssocList TheirDepends = new IsoAssocList(47); } public InternalState Internal = new InternalState(); @@ -278,10 +277,6 @@ namespace IsoTools { // --------------------------------------------------------------------- void Awake() { - Internal.SelfDependsD = new Dictionary(47); - Internal.SelfDependsL = new IsoList(47); - Internal.TheirDepends = new HashSet(new IsoObject[47]); - Internal.TheirDepends.Clear(); FixLastProperties(); FixIsoPosition(); } diff --git a/Assets/IsoTools/Scripts/IsoWorld.cs b/Assets/IsoTools/Scripts/IsoWorld.cs index 93a52fd..bae6f13 100644 --- a/Assets/IsoTools/Scripts/IsoWorld.cs +++ b/Assets/IsoTools/Scripts/IsoWorld.cs @@ -441,12 +441,7 @@ namespace IsoTools { for ( int i = 0, e = sec.objects.Count; i < e; ++i ) { var obj_b = sec.objects[i]; if ( obj_a != obj_b && !obj_b.Internal.Dirty && IsIsoObjectDepends(obj_a, obj_b) ) { - var a_depends_d = obj_a.Internal.SelfDependsD; - var a_depends_l = obj_a.Internal.SelfDependsL; - if ( !a_depends_d.ContainsKey(obj_b) ) { - a_depends_d.Add(obj_b, a_depends_l.Count); - a_depends_l.Push(obj_b); - } + obj_a.Internal.SelfDepends.Add(obj_b); obj_b.Internal.TheirDepends.Add(obj_a); } } @@ -459,12 +454,7 @@ namespace IsoTools { for ( int i = 0, e = sec.objects.Count; i < e; ++i ) { var obj_b = sec.objects[i]; if ( obj_a != obj_b && !obj_b.Internal.Dirty && IsIsoObjectDepends(obj_b, obj_a) ) { - var b_depends_d = obj_b.Internal.SelfDependsD; - var b_depends_l = obj_b.Internal.SelfDependsL; - if ( !b_depends_d.ContainsKey(obj_a) ) { - b_depends_d.Add(obj_a, b_depends_l.Count); - b_depends_l.Push(obj_a); - } + obj_b.Internal.SelfDepends.Add(obj_a); obj_a.Internal.TheirDepends.Add(obj_b); } } @@ -600,24 +590,14 @@ namespace IsoTools { } void ClearIsoObjectDepends(IsoObject iso_object) { - var their_depends_iter = iso_object.Internal.TheirDepends.GetEnumerator(); - while ( their_depends_iter.MoveNext() ) { - var their_iso_object = their_depends_iter.Current; - if ( !their_iso_object.Internal.Dirty ) { - var their_depends_d = their_depends_iter.Current.Internal.SelfDependsD; - var their_depends_l = their_depends_iter.Current.Internal.SelfDependsL; - int index; - if ( their_depends_d.TryGetValue(iso_object, out index) ) { - their_depends_d.Remove(iso_object); - var reordered = their_depends_l.UnorderedRemoveAt(index); - if ( reordered != iso_object ) { - their_depends_d[reordered] = index; - } - } + var their_depends_l = iso_object.Internal.TheirDepends.RawList; + for ( int i = 0, e = their_depends_l.Count; i < e; ++i ) { + var their_depend = their_depends_l[i]; + if ( !their_depend.Internal.Dirty ) { + their_depend.Internal.SelfDepends.Remove(iso_object); } } - iso_object.Internal.SelfDependsD.Clear(); - iso_object.Internal.SelfDependsL.Clear(); + iso_object.Internal.SelfDepends.Clear(); iso_object.Internal.TheirDepends.Clear(); } @@ -646,9 +626,9 @@ namespace IsoTools { return depth; } iso_object.Internal.Placed = true; - var depends_l = iso_object.Internal.SelfDependsL; - for ( int i = 0, e = iso_object.Internal.SelfDependsL.Count; i < e; ++i ) { - depth = RecursivePlaceIsoObject(depends_l[i], depth); + var self_depends_l = iso_object.Internal.SelfDepends.RawList; + for ( int i = 0, e = self_depends_l.Count; i < e; ++i ) { + depth = RecursivePlaceIsoObject(self_depends_l[i], depth); } if ( iso_object.mode == IsoObject.Mode.Mode3d ) { var zoffset = iso_object.Internal.Offset3d;