2016-01-21

QIODevice互換メモリ読み取りクラス

Qtでファイルからデータを読み込むには、QFileクラスを使用します。バイト配列ならQBufferが利用できます。どちらも、QIODeviceの派生クラスです。既にメモリ上にデータが存在している状態で、QIODeviceの皮をかぶせてデータを読み取りたい場合、一つの方法は、QBuffer::setData()を使用するやり方です。

QBuffer b; 
b.setData("Hello, world", 12);

普通の用途ならこれで良いのですが、これだと、QBufferの内部でQByteArrayが作られて、データのコピーが発生しますので、内部の仕組みを知ってしまうと、この方法は使いたくなくなります。そこで、余計なコピーを行わずに、直接メモリから読み取るQIODevice派生クラスを作ってみました。

MemoryReader.h
MemoryReader.cpp

読み取り専用なので、書き込みはサポートしません。

使い方

#include "MemoryReader.h"

int main(int argc, char *argv[])
{
    MemoryReader r;
    r.setData("Hello, world", 12);

    if (r.open(MemoryReader::ReadOnly)) {
        char tmp[2];
        tmp[1] = 0;
        while (r.getChar(tmp)) {
            qDebug(tmp);
        }
    }

    return 0;
}