inline unsigned int RangeCoder::GetChar()
{
  return(UnpackRead->GetChar());
}
 
 
void RangeCoder::InitDecoder(Unpack *UnpackRead)
{
  RangeCoder::UnpackRead=UnpackRead;
 
  low=code=0;
  range=uint(-1);
  for (int i=0;i < 4;i++)
    code=(code << 8) | GetChar();
}
 
 
// (int) cast before "low" added only to suppress compiler warnings.
#define ARI_DEC_NORMALIZE(code,low,range,read)                           \
{                                                                        \
  while ((low^(low+range))<TOP || range<BOT && ((range=-(int)low&(BOT-1)),1)) \
  {                                                                      \
    code=(code << 8) | read->GetChar();                                  \
    range <<= 8;                                                         \
    low <<= 8;                                                           \
  }                                                                      \
}
 
 
inline int RangeCoder::GetCurrentCount() 
{
  return (code-low)/(range /= SubRange.scale);
}
 
 
inline uint RangeCoder::GetCurrentShiftCount(uint SHIFT) 
{
  return (code-low)/(range >>= SHIFT);
}
 
 
inline void RangeCoder::Decode()
{
  low += range*SubRange.LowCount;
  range *= SubRange.HighCount-SubRange.LowCount;
}

V688 The 'UnpackRead' function argument possesses the same name as one of the class members, which can result in a confusion.