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
project(qad)
set(qad_MAJOR 2)
set(qad_MINOR 1)
set(qad_MINOR 2)
set(qad_REVISION 0)
set(qad_SUFFIX beta)
set(qad_SUFFIX )
set(qad_COMPANY 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.second = QString::number(p);
} else
ret.first = QString::number(v);
ret.first = QString::number(v, 'g', 8);
return ret;
}

View File

@@ -23,6 +23,7 @@
#include <QDataStream>
#include <QBuffer>
#include <QByteArray>
#include <QDebug>
#include <QMap>
#include "qad_utils_export.h"
@@ -64,22 +65,55 @@ public:
bool atEnd() const {return stream_.atEnd();}
Version version() const {return (Version)version_;}
int read();
void readAll();
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>
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);
if (!ba.isEmpty()) {
QDataStream s(ba); s.setVersion(QDataStream::Qt_4_8);
QDataStream s(ba);
s.setVersion(QDataStream::Qt_4_8);
s >> v;
}
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:
void _init();
@@ -97,12 +131,37 @@ private:
template <typename T> friend ChunkStream & operator <<(ChunkStream & s, const ChunkStream::ChunkConst<T> & c);
};
template <typename T>
ChunkStream & operator <<(ChunkStream & s, const ChunkStream::Chunk<T> & c) {
QByteArray ba;
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);
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_) {
case ChunkStream::Version_1:
s.stream_ << c.id << ba;
@@ -118,12 +177,11 @@ 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;
__writeChunkConstData(ba, c);
switch (s.version_) {
case ChunkStream::Version_1:
s.stream_ << c.id << ba;