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

📄 checkoffsetfunc.h

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

#include "MockObjectException.h"
#include "Config.h"

namespace amop
{

namespace Detail
{

//------------------------------------------------------------------
class TCheck 
{
public:
	static bool mIsCheckCall;
};

namespace Inner
{

//------------------------------------------------------------------
typedef int (TCheck::*TCheckFuncPtr) ();

//------------------------------------------------------------------
template<int I>
class TCheckIdx
{
public:
	int Func() { TCheck::mIsCheckCall = true; return I; }
};

//------------------------------------------------------------------
template<int I>
static void* GetIndexFuncRecur(size_t i)
{
	typedef int (TCheckIdx<I>::*TCheckFuncPtr)();
	
	TCheckFuncPtr _ptr = &TCheckIdx<I>::Func;
	void* p = HorribleCast<void*>(_ptr);
	
	if(i == I)
		return p;
	else
		return GetIndexFuncRecur<I+1>(i);
}

//------------------------------------------------------------------
template<>
static void* GetIndexFuncRecur<MAX_NUM_VIRTUAL_FUNCTIONS>(size_t i)
{
	return 0;
}

//------------------------------------------------------------------
static void* GetIndexFunc(size_t i)
{
	return GetIndexFuncRecur<0>(i);
}

}

//------------------------------------------------------------------
static TCheck* CreateCheckObject()
{
	static void* vtable[MAX_NUM_VIRTUAL_FUNCTIONS];
	static void* vtbl = &vtable[0];
		
	for(size_t i = 0 ; i < MAX_NUM_VIRTUAL_FUNCTIONS; ++i)
		vtable[i] = Inner::GetIndexFunc(i);
			
	return (TCheck*)&vtbl;
}

//------------------------------------------------------------------
template <class T>
size_t GetOffset(T memFuncPtr)
{
	Inner::TCheckFuncPtr check = 
		 reinterpret_cast<Inner::TCheckFuncPtr>(memFuncPtr);

	TCheck::mIsCheckCall = false; 
	TCheck* checkObject = CreateCheckObject();
	
	size_t offset = (checkObject->*check)();	

	if(!TCheck::mIsCheckCall)
	{
		throw TNotPureVirtualException();
	}

	return offset;
}

}

}

#endif //__AMOP_CHECKOFFSETFUNC_HH

⌨️ 快捷键说明

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