namespace GMap.NET.Internals { using System; using System.Collections.Generic; using System.Diagnostics; using System.Threading; /// /// represent tile /// public struct Tile : IDisposable { public static readonly Tile Empty = new Tile(); GPoint pos; int zoom; PureImage[] overlays; long OverlaysCount; public readonly bool NotEmpty; public Tile(int zoom, GPoint pos) { this.NotEmpty = true; this.zoom = zoom; this.pos = pos; this.overlays = null; this.OverlaysCount = 0; } public IEnumerable Overlays { get { #if PocketPC for (long i = 0, size = OverlaysCount; i < size; i++) #else for (long i = 0, size = Interlocked.Read(ref OverlaysCount); i < size; i++) #endif { yield return overlays[i]; } } } internal void AddOverlay(PureImage i) { if (overlays == null) { overlays = new PureImage[4]; } #if !PocketPC overlays[Interlocked.Increment(ref OverlaysCount) - 1] = i; #else overlays[++OverlaysCount - 1] = i; #endif } internal bool HasAnyOverlays { get { #if PocketPC return OverlaysCount > 0; #else return Interlocked.Read(ref OverlaysCount) > 0; #endif } } public int Zoom { get { return zoom; } private set { zoom = value; } } public GPoint Pos { get { return pos; } private set { pos = value; } } #region IDisposable Members public void Dispose() { if (overlays != null) { #if PocketPC for (long i = OverlaysCount - 1; i >= 0; i--) #else for (long i = Interlocked.Read(ref OverlaysCount) - 1; i >= 0; i--) #endif { #if !PocketPC Interlocked.Decrement(ref OverlaysCount); #else OverlaysCount--; #endif overlays[i].Dispose(); overlays[i] = null; } overlays = null; } } #endregion public static bool operator ==(Tile m1, Tile m2) { return m1.pos == m2.pos && m1.zoom == m2.zoom; } public static bool operator !=(Tile m1, Tile m2) { return !(m1 == m2); } public override bool Equals(object obj) { return base.Equals(obj); } public override int GetHashCode() { return base.GetHashCode(); } } }