QAD 1.7.0
backport PIChunkStream optimizations to ChunkStream
This commit is contained in:
@@ -46,9 +46,15 @@ public:
|
||||
int id;
|
||||
T data;
|
||||
};
|
||||
template <typename T> static Chunk<T> chunk(int id, const T & data) {return Chunk<T>(id, data);}
|
||||
template <typename T>
|
||||
struct ChunkConst {
|
||||
ChunkConst(int i, const T & d): id(i), data(d) {}
|
||||
int id;
|
||||
const T & data;
|
||||
};
|
||||
template <typename T> static ChunkConst<T> chunk(int id, const T & data) {return ChunkConst<T>(id, data);}
|
||||
|
||||
template <typename T> ChunkStream & add(int id, const T & data) {*this << Chunk<T>(id, data); return *this;}
|
||||
template <typename T> ChunkStream & add(int id, const T & data) {*this << ChunkConst<T>(id, data); return *this;}
|
||||
|
||||
void setSource(const QByteArray & data);
|
||||
void setSource(QDataStream & str);
|
||||
@@ -88,6 +94,7 @@ private:
|
||||
QMap<int, QByteArray> data_map;
|
||||
|
||||
template <typename T> friend ChunkStream & operator <<(ChunkStream & s, const ChunkStream::Chunk<T> & c);
|
||||
template <typename T> friend ChunkStream & operator <<(ChunkStream & s, const ChunkStream::ChunkConst<T> & c);
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
@@ -111,5 +118,26 @@ ChunkStream & operator <<(ChunkStream & s, const ChunkStream::Chunk<T> & c) {
|
||||
}
|
||||
return s;
|
||||
}
|
||||
template <typename T>
|
||||
ChunkStream & operator <<(ChunkStream & s, const ChunkStream::ChunkConst<T> & c) {
|
||||
QByteArray ba;
|
||||
QDataStream bas(&ba, QIODevice::WriteOnly);
|
||||
bas.setVersion(QDataStream::Qt_4_8);
|
||||
bas << c.data;
|
||||
switch (s.version_) {
|
||||
case ChunkStream::Version_1:
|
||||
s.stream_ << c.id << ba;
|
||||
break;
|
||||
case ChunkStream::Version_2:
|
||||
if (s.data_->isEmpty())
|
||||
s.stream_ << uchar(uchar(s.version_) | 0x80);
|
||||
ChunkStream::writeVInt(s.stream_, c.id);
|
||||
ChunkStream::writeVInt(s.stream_, ba.size());
|
||||
s.stream_.writeRawData(ba.data(), ba.size());
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
#endif // CHUNKSTREAM_H
|
||||
|
||||
Reference in New Issue
Block a user