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
}