'Classes/ActiveBasic/ObjectHandle.ab

/*!
@file
@brief GC避け用のオブジェクトハンドルについての関数群。
*/

Namespace ActiveBasic

/*!
@brief オブジェクトハンドルを確保する。
@param[in] obj ハンドル化したいオブジェクト
@return ハンドル
@throw ArgumentNullException objがNothingのとき
@throw OutOfMemoryException ハンドル領域の確保ができなかったとき
@date 2008/08/13
@auther Egtra
*/
Function AllocObjectHandle(obj As Object) As LONG_PTR
	If IsNothing(obj) Then
		Throw New System.ArgumentNullException("obj")
	End If
	Detail.handleList.Add(obj)
	AllocObjectHandle = ObjPtr(obj) As LONG_PTR
End Function

/*!
@brief オブジェクトハンドルからオブジェクトを得る。
@param[in] h ハンドル
@return 対応するオブジェクト
@throw ArgumentNullException hが0のとき
@date 2008/08/13
@auther Egtra
*/
Function GetObjectFromHandle(h As LONG_PTR) As Object
	If h = 0 Then
		Throw New System.ArgumentNullException("h")
	End If
	GetObjectFromHandle = _System_PtrObj(h As VoidPtr)
	System.Diagnostics.Debug.Assert(Not IsNothing(GetObjectFromHandle))
End Function
	
/*!
@brief オブジェクトハンドルを解放する。
@param[in] h ハンドル
@return 対応するオブジェクト
@throw ArgumentNullException hが0のとき
@date 2008/08/13
@auther Egtra
*/
Function ReleaseObjectHandle(h As LONG_PTR) As Object
	If h = 0 Then
		Throw New System.ArgumentNullException("h")
	End If
	ReleaseObjectHandle = _System_PtrObj(h As VoidPtr)
	Detail.handleList.Remove(ReleaseObjectHandle)
	System.Diagnostics.Debug.Assert(Not IsNothing(ReleaseObjectHandle))
End Function

Namespace Detail
	Dim handleList = New System.Collections.Generic.List<Object>
End Namespace
	
End Namespace
