This repository has been archived by the owner on Nov 3, 2023. It is now read-only.
/
ChipmunkObject.cs
115 lines (96 loc) · 2.18 KB
/
ChipmunkObject.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
//
// ChipmunkObject.cs
//
// Authors:
// Stephane Delcroix <stephane@delcroix.org>
//
// Copyright 2012 S. Delcroix
//
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
namespace Chipmunk
{
public class ChipmunkObject : IDisposable
{
static Dictionary<IntPtr, List<ChipmunkObject>> references = new Dictionary<IntPtr, List<ChipmunkObject>> ();
public HandleRef Handle { get; private set;}
public void Dispose ()
{
Cleanup ();
System.GC.SuppressFinalize (this);
}
bool refcount;
protected ChipmunkObject (IntPtr ptr, bool refcount = true)
{
Handle = new HandleRef (this, ptr);
this.refcount = refcount;
if (refcount)
AddRef (this, ptr);
}
public static bool operator ==(ChipmunkObject a, ChipmunkObject b)
{
if (System.Object.ReferenceEquals (a, b))
return true;
if (((object)a == null) || ((object)b == null))
return false;
return a.Handle.Handle == b.Handle.Handle;
}
public static bool operator != (ChipmunkObject a, ChipmunkObject b)
{
return !(a == b);
}
public override bool Equals (System.Object obj)
{
var other = obj as ChipmunkObject;
if ((object)other == null)
return false;
return this == other;
}
public override int GetHashCode ()
{
return Handle.Handle.GetHashCode ();
}
~ChipmunkObject ()
{
Cleanup ();
}
void Cleanup ()
{
if (refcount && RemoveRef (this, Handle.Handle))
Free ();
Handle = new HandleRef (this, IntPtr.Zero);
}
protected virtual void Free ()
{
}
static void AddRef (ChipmunkObject obj, IntPtr ptr)
{
List<ChipmunkObject> list;
if (!references.TryGetValue (ptr, out list)){
list = new List<ChipmunkObject> ();
references.Add (ptr, list);
}
list.Add (obj);
}
static bool RemoveRef (ChipmunkObject obj, IntPtr ptr)
{
List<ChipmunkObject> list;
if (references.TryGetValue (ptr, out list)) {
list.Remove (obj);
if (list.Count == 0) {
references.Remove (ptr);
return true;
}
return false;
}
#if DEBUG
throw new InvalidOperationException ();
#endif
return false;
}
}
}