エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

Byte Reader

まずは骨格になる抽象クラス。

typedef unsigned char  BYTE;
typedef unsigned short HALF;
typedef unsigned long  WORD;

static const int BITS_PER_BYTE = 8;
static const int BITS_PER_HALF = BITS_PER_BYTE * 2;
static const int BITS_PER_WORD = BITS_PER_HALF * 2;

class Reader
{
public:
    virtual ~Reader() {}

    BYTE readByte()
    {
        return read();
    }

    HALF readHalf()
    {
        HALF result = readByte();
        result <<= BITS_PER_BYTE;
        result |=  readByte();
        return result;
    }

    WORD readWord()
    {
        WORD result = readHalf();
        result <<= BITS_PER_HALF;
        result |=  readHalf();
        return result;
    }

protected:
    virtual BYTE read() = 0;
};

half/wordの読み出しはビッグエンディアンということで。


続き。実際に読み出しをする具象クラス。

class ByteArrayReader : public Reader
{
public:
    ByteArrayReader(const BYTE* values, int length) : itr_(values), end_(values + length) {}

protected:
    BYTE read()
    {
        if(itr_ < end_)
            return *itr_++;
        else
            return 0;
    }

private:
    const BYTE* itr_;
    const BYTE* end_;
};

追記:うっかりタブ文字をそのまま使ってしまった。修正。