Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

281 lines
4.3 KiB
C++

//-----------------------------------------------------------------------------+
// Copyright (C), 1998-2007, SH Software Co. Ltd.
// = FileName : BitTable.cpp
// = Version : ver2.0
// = Author : zjq
// = CreateDate : 2002-09-09
// = Description: 类的定义
// = Maintainers:
//
//-----------------------------------------------------------------------------+
#include "StdAfx.h"
#include "BitTable.h"
BitTable::BitTable(long unitNum,long unitSize)
: bOwner(true),length(unitNum),unit(unitSize)
{
if(unitNum > 0)
{
pData = new char[GetByteSize()];
}
else
{
pData = NULL;
}
Reset();
}
BitTable::BitTable(void* p,long byteSize, bool bClient) : bOwner(!bClient),unit(1)
{
if(bOwner)
{
pData = new char[byteSize];
memcpy(p, pData, byteSize);
}
else
{
pData = (char*)p;
}
length = byteSize * 8;
}
BitTable& BitTable::operator = (const BitTable& bTable)
{
SetUnitSize(bTable.GetUnitSize());
Realloc(bTable.GetLength());
memcpy(pData,(const char*)bTable,bTable.GetByteSize());
return *this;
}
void BitTable::Attach(long byteSize,char *p)
{
if(pData != NULL && bOwner)
{
delete[] pData;
}
pData = p;
length = byteSize * 8 / unit;
}
char* BitTable::Detach()
{
char* p = pData;
pData = NULL;
length = 0;
return p;
}
BitTable::~BitTable()
{
if(pData != NULL && bOwner)
{
delete[] pData;
}
}
long BitTable::BitToByte(long bitNum)
{
long byteSize = bitNum / 8;
if(bitNum % 8 != 0)
{
byteSize++;
}
return byteSize;
}
bool BitTable::IsValidIndex(long i) const
{
return i >= 0 && i < length;
}
long BitTable::GetLength() const
{
return length;
}
long BitTable::GetByteSize() const
{
return BitToByte(length * unit);
}
long BitTable::GetBitSize() const
{
return length * unit;
}
void BitTable::SetUnitSize(long size)
{
long oldUnit = unit;
unit = size;
length *= oldUnit / unit;
}
long BitTable::GetUnitSize() const
{
return unit;
}
void BitTable::Realloc(long unitNum)
{
if(unitNum != length)
{
char *p = pData;
if(unitNum > 0)
{
pData = new char[BitToByte(unitNum * unit)];
}
else
{
pData = NULL;
}
if(pData != NULL && p != NULL)
{
if(length < unitNum)
{
memcpy(pData, p, BitToByte(length * unit));
}
else
{
memcpy(pData, p, BitToByte(unitNum * unit));
}
}
length = unitNum;
if(p != NULL && bOwner)
{
delete[] p;
}
}
}
//bit read/write,使用位索引,非单元索引!
bool BitTable::operator[](long i)
{
long byteIndex,bitIndex;
BitToByte(i, byteIndex, bitIndex);
char mask = 1 << bitIndex;
return (pData[byteIndex] & mask) != 0;
}
void BitTable::Set(long i)
{
long byteIndex,bitIndex;
BitToByte(i, byteIndex, bitIndex);
char mask = 1 << bitIndex;
(pData[byteIndex]) |= mask;
}
void BitTable::Reset(long i)
{
long byteIndex,bitIndex;
BitToByte(i, byteIndex, bitIndex);
char mask = ~(1 << bitIndex);
(pData[byteIndex]) &= mask;
}
//unit read/write
long BitTable::GetValue(long i) const
{
long byteIndex,bitIndex;
UnitToByte(i,byteIndex,bitIndex);
char res = (pData[byteIndex] >> bitIndex);
if(unit == 1)
{
return res & 1;
}
else if(unit == 2)
{
return res & 3;
}
else
{
return res & 15;
}
}
void BitTable::SetValue(long i,char value)
{
long byteIndex,bitIndex;
UnitToByte(i,byteIndex,bitIndex);
(pData[byteIndex])|=value << bitIndex;
}
void BitTable::SetAll(char value)
{
for(long i = 0; i < length; i++)
{
SetValue(i,value);
}
}
void BitTable::SetAll()
{
if(pData != NULL)
{
memset(pData,255,GetByteSize());
}
}
void BitTable::Reset()
{
if(pData != NULL)
{
memset(pData,0,GetByteSize());
}
}
//data transfer
BitTable::operator char() const
{
return *(pData);
}
BitTable::operator int() const
{
return *((int*)pData);
}
BitTable::operator float() const
{
return *((float*)pData);
}
BitTable::operator double() const
{
return *((double*)pData);
}
BitTable::operator const char*() const
{
return pData;
}
BitTable::operator const int*() const
{
return (int*)pData;
}
BitTable::operator const float*() const
{
return (float*)pData;
}
BitTable::operator const double*() const
{
return (double*)pData;
}
void BitTable::BitToByte(long i,long& byteIndex, long& bitIndex) const
{
byteIndex = i / 8;
bitIndex = i % 8;
}
//单元定位
void BitTable::UnitToByte(long i, long& byteIndex, long& bitIndex) const
{
BitToByte( i * unit, byteIndex, bitIndex);
}