⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 virtualtable.h

📁 AMOP 0.3 is an Automatic Mock Object for C++. By using ABI and template techniques, it can simulate
💻 H
字号:
#ifndef __AMOP_VIRTUALTABLE_HH
#define __AMOP_VIRTUALTABLE_HH

#include "Config.h"
#include "MockObjectException.h"
#include "ObjectHolder.h"
#include <assert.h>

namespace amop
{
namespace Detail
{

//------------------------------------------------------------------
class TNotImplemented
{
public:
	void Func()
	{
		throw TNotImplementedException();
	}
};

//------------------------------------------------------------------
static void* GetNotImplementedFunc()
{
	typedef void (TNotImplemented::*TNotImplementedFuncPtr)();
	
	TNotImplementedFuncPtr _ptr = &TNotImplemented::Func;
	void* p = HorribleCast<void*>(_ptr);
	
	return p; 
}

//------------------------------------------------------------------
class TVirtualTable
{
public:
	void* mVtable[MAX_NUM_VIRTUAL_FUNCTIONS];
	void* mVtpr;
	TObjectHolder* mThis;

	TVirtualTable(TObjectHolder* object)
	{
		mVtpr = &mVtable[0];
		mThis = object;
	}

	static TObjectHolder* GetThis(void* callerThisAddres)
	{
		void* callerThis = *((void**)callerThisAddres);
		
		// _this pointer should point to &mVtable[0]
		TVirtualTable* _this = (TVirtualTable*)callerThis;

		assert(callerThis == &_this->mVtable[0]);

		return _this->mThis;        
	}
};

//------------------------------------------------------------------
static TVirtualTable* CreateVirtualTable(TObjectHolder* object)
{
	TVirtualTable* vtable = new TVirtualTable(object);

	for(size_t i = 0 ; i < MAX_NUM_VIRTUAL_FUNCTIONS; ++i)
		vtable->mVtable[i] = GetNotImplementedFunc();

	return vtable;
}

}

}

#endif //__AMOP_VIRTUALTABLE_HH

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -