chunkstream patch for enums (old Qt)

This commit is contained in:
2021-03-20 01:19:44 +03:00
parent b14a48da6e
commit 42f445d7ca
3 changed files with 72 additions and 14 deletions

View File

@@ -2,9 +2,9 @@ cmake_minimum_required(VERSION 3.0)
cmake_policy(SET CMP0017 NEW) # need include() with .cmake cmake_policy(SET CMP0017 NEW) # need include() with .cmake
project(qad) project(qad)
set(qad_MAJOR 2) set(qad_MAJOR 2)
set(qad_MINOR 1) set(qad_MINOR 2)
set(qad_REVISION 0) set(qad_REVISION 0)
set(qad_SUFFIX beta) set(qad_SUFFIX )
set(qad_COMPANY SHS) set(qad_COMPANY SHS)
set(qad_DOMAIN org.SHS) set(qad_DOMAIN org.SHS)

View File

@@ -1178,7 +1178,7 @@ QPair<QString, QString> Graphic::gridMark(double v) const {
ret.first = QString::fromUtf8("%1·10").arg(v); ret.first = QString::fromUtf8("%1·10").arg(v);
ret.second = QString::number(p); ret.second = QString::number(p);
} else } else
ret.first = QString::number(v); ret.first = QString::number(v, 'g', 8);
return ret; return ret;
} }

View File

@@ -23,6 +23,7 @@
#include <QDataStream> #include <QDataStream>
#include <QBuffer> #include <QBuffer>
#include <QByteArray> #include <QByteArray>
#include <QDebug>
#include <QMap> #include <QMap>
#include "qad_utils_export.h" #include "qad_utils_export.h"
@@ -64,22 +65,55 @@ public:
bool atEnd() const {return stream_.atEnd();} bool atEnd() const {return stream_.atEnd();}
Version version() const {return (Version)version_;} Version version() const {return (Version)version_;}
int read(); int read();
void readAll(); void readAll();
int getID() {return last_id;} int getID() {return last_id;}
template <typename T>
T getData() const {T ret; QDataStream s(last_data); s.setVersion(QDataStream::Qt_4_8); s >> ret; return ret;}
template <typename T> template <typename T>
void get(T & v) const {v = getData<T>();} void get(T & v) const {v = getData<T>();}
template <typename T>
const ChunkStream & get(int id, T & v) const { template <typename T> typename std::enable_if<!std::is_enum<T>::value, T>::type
getData() const {
QDataStream s(last_data);
s.setVersion(QDataStream::Qt_4_8);
T ret;
s >> ret;
return ret;
}
template <typename T> typename std::enable_if<std::is_enum<T>::value, T>::type
getData() const {
QDataStream s(last_data);
s.setVersion(QDataStream::Qt_4_8);
typename std::underlying_type<T>::type ret;
s >> ret;
return (T)ret;
}
template <typename T> typename std::enable_if<!std::is_enum<T>::value, const ChunkStream &>::type
get(int id, T & v) const {
QByteArray ba = data_map.value(id); QByteArray ba = data_map.value(id);
if (!ba.isEmpty()) { if (!ba.isEmpty()) {
QDataStream s(ba); s.setVersion(QDataStream::Qt_4_8); QDataStream s(ba);
s.setVersion(QDataStream::Qt_4_8);
s >> v; s >> v;
} }
return *this; return *this;
} }
template <typename T> typename std::enable_if<std::is_enum<T>::value, const ChunkStream &>::type
get(int id, T & v) const {
QByteArray ba = data_map.value(id);
if (!ba.isEmpty()) {
QDataStream s(ba);
s.setVersion(QDataStream::Qt_4_8);
typename std::underlying_type<T>::type iv;
s >> iv;
v = (T)iv;
}
return *this;
}
private: private:
void _init(); void _init();
@@ -97,12 +131,37 @@ private:
template <typename T> friend ChunkStream & operator <<(ChunkStream & s, const ChunkStream::ChunkConst<T> & c); template <typename T> friend ChunkStream & operator <<(ChunkStream & s, const ChunkStream::ChunkConst<T> & c);
}; };
template <typename T> template <typename T> typename std::enable_if<!std::is_enum<T>::value, void>::type
ChunkStream & operator <<(ChunkStream & s, const ChunkStream::Chunk<T> & c) { __writeChunkData(QByteArray & ba, const ChunkStream::Chunk<T> & c) {
QByteArray ba;
QDataStream bas(&ba, QIODevice::WriteOnly); QDataStream bas(&ba, QIODevice::WriteOnly);
bas.setVersion(QDataStream::Qt_4_8); bas.setVersion(QDataStream::Qt_4_8);
bas << c.data; bas << c.data;
}
template <typename T> typename std::enable_if<std::is_enum<T>::value, void>::type
__writeChunkData(QByteArray & ba, const ChunkStream::Chunk<T> & c) {
QDataStream bas(&ba, QIODevice::WriteOnly);
bas.setVersion(QDataStream::Qt_4_8);
typename std::underlying_type<T>::type iv = c.data;
bas << iv;
}
template <typename T> typename std::enable_if<!std::is_enum<T>::value, void>::type
__writeChunkConstData(QByteArray & ba, const ChunkStream::ChunkConst<T> & c) {
QDataStream bas(&ba, QIODevice::WriteOnly);
bas.setVersion(QDataStream::Qt_4_8);
bas << c.data;
}
template <typename T> typename std::enable_if<std::is_enum<T>::value, void>::type
__writeChunkConstData(QByteArray & ba, const ChunkStream::ChunkConst<T> & c) {
QDataStream bas(&ba, QIODevice::WriteOnly);
bas.setVersion(QDataStream::Qt_4_8);
typename std::underlying_type<T>::type iv = c.data;
bas << iv;
}
template <typename T>
ChunkStream & operator <<(ChunkStream & s, const ChunkStream::Chunk<T> & c) {
QByteArray ba;
__writeChunkData(ba, c);
switch (s.version_) { switch (s.version_) {
case ChunkStream::Version_1: case ChunkStream::Version_1:
s.stream_ << c.id << ba; s.stream_ << c.id << ba;
@@ -118,12 +177,11 @@ ChunkStream & operator <<(ChunkStream & s, const ChunkStream::Chunk<T> & c) {
} }
return s; return s;
} }
template <typename T> template <typename T>
ChunkStream & operator <<(ChunkStream & s, const ChunkStream::ChunkConst<T> & c) { ChunkStream & operator <<(ChunkStream & s, const ChunkStream::ChunkConst<T> & c) {
QByteArray ba; QByteArray ba;
QDataStream bas(&ba, QIODevice::WriteOnly); __writeChunkConstData(ba, c);
bas.setVersion(QDataStream::Qt_4_8);
bas << c.data;
switch (s.version_) { switch (s.version_) {
case ChunkStream::Version_1: case ChunkStream::Version_1:
s.stream_ << c.id << ba; s.stream_ << c.id << ba;