20using System.Diagnostics;
22using System.Threading;
23using System.Collections.Generic;
47 if (m_n_obj != IntPtr.Zero)
50 m_n_obj = IntPtr.Zero;
55 if (Interlocked.Decrement(ref m_ctx.refCount) == 0)
56 GC.ReRegisterForFinalize(m_ctx);
60 GC.SuppressFinalize(
this);
63 #region Object Invariant
65 private void ObjectInvariant()
67 Debug.Assert(this.m_ctx !=
null);
73 private Context m_ctx =
null;
74 private IntPtr m_n_obj = IntPtr.Zero;
76 internal Z3Object(Context ctx)
78 Debug.Assert(ctx !=
null);
80 Interlocked.Increment(ref ctx.refCount);
84 internal Z3Object(Context ctx, IntPtr obj)
86 Debug.Assert(ctx !=
null);
88 Interlocked.Increment(ref ctx.refCount);
94 internal virtual void IncRef(IntPtr o) { }
95 internal virtual void DecRef(IntPtr o) { }
97 internal virtual void CheckNativeObject(IntPtr obj) { }
99 internal virtual IntPtr NativeObject
101 get {
return m_n_obj; }
104 if (value != IntPtr.Zero) { CheckNativeObject(value); IncRef(value); }
105 if (m_n_obj != IntPtr.Zero) { DecRef(m_n_obj); }
110 internal static IntPtr GetNativeObject(Z3Object s)
112 if (s ==
null)
return new IntPtr();
113 return s.NativeObject;
116 internal Context Context
124 internal static IntPtr[] ArrayToNative(Z3Object[] a)
127 if (a ==
null)
return null;
128 IntPtr[] an =
new IntPtr[a.Length];
129 for (uint i = 0; i < a.Length; i++)
130 if (a[i] !=
null) an[i] = a[i].NativeObject;
134 internal static IntPtr[] EnumToNative<T>(IEnumerable<T> a) where T : Z3Object
137 if (a ==
null)
return null;
138 IntPtr[] an =
new IntPtr[a.Count()];
140 foreach (var ai
in a)
142 if (ai !=
null) an[i] = ai.NativeObject;
148 internal static uint ArrayLength(Z3Object[] a)
150 return (a ==
null)?0:(uint)a.Length;
Internal base class for interfacing with native Z3 objects. Should not be used externally.
void Dispose()
Disposes of the underlying native Z3 object.