8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-31 12:43:02 +01:00
firebird-mirror/src/include/fb_blk.h

109 lines
2.8 KiB
C
Raw Normal View History

2001-05-23 15:26:42 +02:00
#ifndef INCLUDE_FB_BLK
#define INCLUDE_FB_BLK
#include "../common/classes/alloc.h"
2001-05-23 15:26:42 +02:00
2001-12-24 03:51:06 +01:00
struct blk
{
};
typedef blk* BLK;
typedef blk* BlkPtr;
2008-01-16 08:15:01 +01:00
// Traditional way to check handle type
template<SSHORT BlockType>
class PoolType : public blk
{
public:
bool checkHandle() const
{
if (!this)
{
return false;
}
return MemoryPool::blk_type(this) == BlockType;
}
};
template<SSHORT BLOCK_TYPE = 0>
2008-01-16 08:15:01 +01:00
class pool_alloc : public PoolType<BLOCK_TYPE>
2001-12-24 03:51:06 +01:00
{
public:
#ifdef DEBUG_GDS_ALLOC
void* operator new(size_t s, MemoryPool& p, char* file, int line)
{ return p.calloc(s, BLOCK_TYPE, file, line); }
void* operator new[](size_t s, MemoryPool& p, char* file, int line)
{ return p.calloc(s, BLOCK_TYPE, file, line); }
#else
2001-12-24 03:51:06 +01:00
void* operator new(size_t s, MemoryPool& p )
{ return p.calloc(s, BLOCK_TYPE); }
2001-12-24 03:51:06 +01:00
void* operator new[](size_t s, MemoryPool& p)
{ return p.calloc(s, BLOCK_TYPE); }
#endif
void operator delete(void* mem, MemoryPool& p)
{ if (mem) p.deallocate(mem); }
2001-12-24 03:51:06 +01:00
void operator delete[](void* mem, MemoryPool& p)
{ if (mem) p.deallocate(mem); }
2001-12-24 03:51:06 +01:00
void operator delete(void* mem) { if (mem) MemoryPool::globalFree(mem); }
void operator delete[](void* mem) { if (mem) MemoryPool::globalFree(mem); }
2001-12-24 03:51:06 +01:00
private:
/* These operators are off-limits */
void* operator new(size_t s) { return 0; }
void* operator new[](size_t s) { return 0; }
};
template<typename RPT, SSHORT BLOCK_TYPE = 0>
2008-01-16 08:15:01 +01:00
class pool_alloc_rpt : public PoolType<BLOCK_TYPE>
2001-12-24 03:51:06 +01:00
{
public:
typedef RPT blk_repeat_type;
#ifdef DEBUG_GDS_ALLOC
2003-10-20 12:34:33 +02:00
void* operator new(size_t s, MemoryPool& p, int rpt, char* file, int line)
{ return p.calloc(s + sizeof(RPT) * rpt, BLOCK_TYPE, file, line); }
#else
2001-12-24 03:51:06 +01:00
void* operator new(size_t s, MemoryPool& p, int rpt)
2003-10-20 12:34:33 +02:00
{ return p.calloc(s + sizeof(RPT) * rpt, BLOCK_TYPE); }
#endif
2003-10-20 12:34:33 +02:00
void operator delete(void* mem, MemoryPool& p, int rpt)
{ if (mem) p.deallocate(mem); }
void operator delete(void* mem) { if (mem) MemoryPool::globalFree(mem); }
2001-12-24 03:51:06 +01:00
private:
// These operations are not supported on static repeat-base objects
void* operator new[](size_t s, MemoryPool& p)
{ return 0; }
void operator delete[](void* mem, MemoryPool& p)
{ }
void operator delete[](void* mem) { }
private:
/* These operators are off-limits */
void* operator new(size_t s) { return 0; }
void* operator new[](size_t s) { return 0; }
};
2001-05-23 15:26:42 +02:00
2008-01-16 08:15:01 +01:00
// New way to check handle type
template<SSHORT BlockType>
class LocalType
{
private:
const SSHORT blockType;
public:
LocalType() : blockType(BlockType) { }
bool checkHandle() const
{
if (!this)
{
return false;
}
return blockType == BlockType;
}
};
2001-05-23 15:26:42 +02:00
#endif /* INCLUDE_FB_BLK */
2003-10-20 12:34:33 +02:00