////////////////////////////////////////////////////////////////////////////
// VClsPtr.cpp
// オブジェクトの構築・破棄を管理する仮想上のポインタ
//
//#include "stdafx.h"
#include "VClsPtr.h"

using namespace NNabikiVClsPtr;

////////////////////////////////////////////////////////////////////////////
// CCPInterface
// VClsPtrで管理するクラスが継承すべきクラス

// 通称：構築
// 機能：参照カウンタ計算用のセマフォを構築する
CCPInterface::CCPInterface()
	: RefCnt( 0 ), m_Semaphore( 1 )
{

}

// 通称：破棄
// 機能：参照カウンタ計算用のセマフォを破棄する
CCPInterface::~CCPInterface()
{

}


// 通称：参照カウンタの加算
// 機能：セマフォによる待ち合わせを行い、参照カウンタの加算を行う
bool CCPInterface::AddRef()
{
	if ( !in() ) return false;	// セマフォによる待ち合わせ
	RefCnt++;		// インクリメント
	return out();	// セマフォを開放
}

// 通称：参照カウンタの減算
// 機能：セマフォによる待ち合わせを行い、参照カウンタの減算を行う
// 　　　参照カウンタが０になったら自身を破棄する
bool CCPInterface::Release()
{
	if ( !in() ) return false;	// セマフォによる待ち合わせ
	RefCnt--;		// デクリメント
	if ( 0 == RefCnt ) { // 参照カウンタが０になったら自身を破棄する
		DeleteThis();
		return true;
	}
	return out();	// セマフォを開放
}

// 通称：クリティカルセクションに入る
// 機能：セマフォによる待ち合わせを行う。
bool CCPInterface::in()
{
	// m_Semaphore.P();
	return true;
}

// 通称：クリティカルセクションから抜ける
// 機能：セマフォのカウンタを加算する。
bool CCPInterface::out()
{
	// m_Semaphore.V();
	return true;
}

// CCPInterface::AddRefを呼び出すための静的関数
bool CCPInterface::glb_AddRef( CCPInterface *p )
{
	return p->AddRef();
};

// CCPInterface::Releaseを呼び出すための静的関数
bool CCPInterface::glb_Release( CCPInterface *p )
{
	return p->Release();
};

// 自身を破棄する
void CCPInterface::DeleteThis()
{
	delete this;
}
