"Regan Heath" <regan@netwin.co.nz> wrote:opszuzgtvj23k2f5@nrage.netwin.co.nz...
> On Mon, 7 Nov 2005 06:59:22 +0000 (UTC), Shawn Liu 
> <
Shawn_member@pathlink.com> wrote:
>> C struct has bit fields ability, e.g
>>
>> typedef struct tag_SCRIPT_STATE {
>> WORD uBidiLevel         :5;
template BITWISE(T)
{
// bit value set
void btvs(T* pData, uint bitnum, uint val){
 *pData &=  ~(0x01 << bitnum);
 if(val) *pData |= (0x01 << bitnum); 
}
// bit value get
T btvg(T* data, uint bitnum){
 return cast(T)((*data >> bitnum) & 0x01);
}
}
alias BITWISE!(BYTE).btvs btvs;
alias BITWISE!(WORD).btvs btvs;
alias BITWISE!(DWORD).btvs btvs;
alias BITWISE!(BYTE).btvg btvg;
alias BITWISE!(WORD).btvg btvg;
alias BITWISE!(DWORD).btvg btvg;
 
struct SCRIPT_STATE {
WORD data;
// getter
uint uBidiLevel()   { return cast(uint)(data & 0x1F);}
uint fOverrideDirection()  { return btvg(data, 5); }
uint fInhibitSymSwap()  { return btvg(data, 6); }
uint fCharShape()    { return btvg(data, 7); }
uint fDigitSubstitute()  { return btvg(data, 8); }
uint fInhibitLigate()   { return btvg(data, 9); }
uint fDisplayZWG()    { return btvg(data, 10); }
uint fArabicNumContext()  { return btvg(data, 11); }
uint fGcpClusters()   { return btvg(data, 12); }
uint fReserved()   { return btvg(data, 13); }
uint fEngineReserved()  { return 0; }//do nothing with reserved
// setter
void uBidiLevel(uint val)    { data &= 0xFFE0; data |= (val & 0x1F); }
void fOverrideDirection(uint val)  { btvs(&data, 5, val); }
void fInhibitSymSwap(uint val)  { btvs(&data, 6, val); }
void fCharShape(uint val)   { btvs(&data, 7, val); }
void fDigitSubstitute(uint val)  { btvs(&data, 8, val); }
void fInhibitLigate(uint val)  { btvs(&data, 9, val); }
void fDisplayZWG(uint val)   { btvs(&data, 10, val); }
void fArabicNumContext(uint val) { btvs(&data, 11, val); }
void fGcpClusters(uint val)   { btvs(&data, 12, val); }
void fReserved(uint val)   { btvs(&data, 13, val); }
void fEngineReserved(uint val)  { } //do nothing with reserved
}