// 你必须定义一个 `main()` 函数入口。
#include
using namespace std;
#include
typedef const char* FX_LPCSTR;
typedef char FX_CHAR;
typedef int FX_STRSIZE;
typedef int FX_BOOL;
typedef unsigned char FX_BYTE;
#define FX_Alloc(type, size) (type*)calloc(size, sizeof(type))
#define FX_Free(ptr) free(ptr)
struct CFX_StringData {
long m_nRefs;
FX_STRSIZE m_nDataLength;
FX_STRSIZE m_nAllocLength;
FX_CHAR m_String[1];
};
static CFX_StringData* FX_AllocString(int nLen)
{
// |nLen| is currently declared as in |int|. TODO(palmer): It should be
// a |size_t|, or at least unsigned.
if (nLen == 0 || nLen < 0) {
return NULL;
}
int nSize = nLen;
nSize += sizeof(long) * 3 + 1;
CFX_StringData* pData = (CFX_StringData*)FX_Alloc(FX_BYTE, nSize);
if (!pData) {
return NULL;
}
pData->m_nAllocLength = nLen;
pData->m_nDataLength = nLen;
pData->m_nRefs = 1;
pData->m_String[nLen] = 0;
return pData;
}
static void FX_ReleaseString(CFX_StringData* pData)
{
if (pData == NULL) {
return;
}
pData->m_nRefs --;
if (pData->m_nRefs <= 0) {
FX_Free(pData);
}
}
class CFX_Object
{
public:
void* operator new(size_t size, FX_LPCSTR file, int line)
{
return malloc(size);
}
void operator delete(void*p,FX_LPCSTR file,int size)
{
free(p);
}
void* operator new(size_t size)
{
return malloc(size);
}
void operator delete(void* p)
{
free(p);
}
void* operator new[] (size_t size, FX_LPCSTR file, int line)
{
return malloc(size);
}
void operator delete[] (void* p, FX_LPCSTR file, int line)
{
free(p);
}
void* operator new[] (size_t size)
{
return malloc(size);
}
void operator delete[] (void* p)
{
free(p);
}
void* operator new (size_t, void* buf)
{
return buf;
}
void operator delete (void*, void*) {}
};
class CFX_ByteString : public CFX_Object
{
public:
CFX_ByteString(FX_LPCSTR ptr, FX_STRSIZE len = -1);
protected:
struct CFX_StringData* m_pData;
void AllocCopy(CFX_ByteString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex) const;
};
CFX_ByteString::CFX_ByteString(FX_LPCSTR lpsz, FX_STRSIZE nLen)
{
if (nLen < 0) {
nLen = lpsz ? (FX_STRSIZE)strlen(lpsz) : 0;
}
if (nLen) {
m_pData = FX_AllocString(nLen);
if (m_pData) {
memcpy(m_pData->m_String, lpsz, nLen);
}
} else {
m_pData = NULL;
}
}
void CFX_ByteString::AllocCopy(CFX_ByteString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex) const
{
return;
}
int main()
{
cout << sizeof(CFX_StringData) << endl;
return 0;
}