15#ifndef QQSBCOLLECTION_H
16#define QQSBCOLLECTION_H
18#include <QtQuick3DUtils/private/qtquick3dutilsglobal_p.h>
20#include <QtCore/qfile.h>
21#include <QtCore/qset.h>
22#include <QtCore/qmap.h>
24#include <rhi/qshader.h>
33 virtual ~QQsbCollection();
35 struct Q_QUICK3DUTILS_EXPORT Entry
39 explicit Entry(
const QByteArray &key) : key(key)
43 Entry(
const QByteArray &key, qint64 value) : key(key), value(value)
47 bool isValid()
const {
return !key.isEmpty(); }
53 using FeatureSet = QMap<QByteArray,
bool>;
56 static FeatureSet toFeatureSet(
const T &ssgFeatureSet)
59 for (quint32 i = 0, end = T::Count; i != end; ++i) {
60 auto def = T::fromIndex(i);
61 if (ssgFeatureSet.isSet(def))
62 ret.insert(T::asDefineString(def),
true);
67 struct Q_QUICK3DUTILS_EXPORT EntryDesc {
68 QByteArray materialKey;
69 FeatureSet featureSet;
72 QByteArray generateSha()
const;
73 static QByteArray generateSha(
const QByteArray &materialKey,
const FeatureSet &featureSet);
76 using EntryMap = QSet<Entry>;
77 virtual EntryMap availableEntries()
const = 0;
78 virtual Entry addEntry(
const QByteArray &key,
const EntryDesc &entryDesc) = 0;
79 virtual bool extractEntry(Entry entry, EntryDesc &entryDesc) = 0;
88 bool readEndHeader(QDataStream &ds, qint64 *startPos, quint8 *version);
89 void writeEndHeader(QDataStream &ds, qint64 startPos, quint8 version, quint64 magic);
90 bool readEndHeader(QIODevice *device, EntryMap *entries, quint8 *version);
91 void writeEndHeader(QIODevice *device,
const EntryMap &entries);
94Q_DECLARE_TYPEINFO(QQsbCollection::Entry, Q_PRIMITIVE_TYPE);
96Q_QUICK3DUTILS_EXPORT
QDataStream &operator<<(QDataStream &stream,
const QQsbCollection::Entry &entry);
97Q_QUICK3DUTILS_EXPORT
QDataStream &operator>>(QDataStream &stream, QQsbCollection::Entry &entry);
98Q_QUICK3DUTILS_EXPORT
QDataStream &operator<<(QDataStream &stream,
const QQsbCollection::EntryDesc &entryDesc);
99Q_QUICK3DUTILS_EXPORT
QDataStream &operator>>(QDataStream &stream, QQsbCollection::EntryDesc &entryDesc);
101Q_QUICK3DUTILS_EXPORT size_t qHash(
const QQsbCollection::Entry &entry, size_t);
102Q_QUICK3DUTILS_EXPORT
bool operator==(
const QQsbCollection::Entry &l,
const QQsbCollection::Entry &r);
110 QQsbInMemoryCollection() =
default;
112 EntryMap availableEntries()
const override;
113 Entry addEntry(
const QByteArray &key,
const EntryDesc &entryDesc) override;
114 bool extractEntry(Entry entry, EntryDesc &entryDesc) override;
118 bool load(
const QString &filename);
119 bool save(
const QString &filename);
122 Q_DISABLE_COPY(QQsbInMemoryCollection);
124 QHash<Entry, EntryDesc> entries;
133 Read = QIODevice::ReadOnly,
134 Write = (QIODevice::WriteOnly | QIODevice::Truncate)
137 explicit QQsbIODeviceCollection(
const QString &filePath);
138 explicit QQsbIODeviceCollection(QIODevice &dev);
139 ~QQsbIODeviceCollection();
141 bool map(MapMode mode);
144 EntryMap availableEntries()
const override;
145 Entry addEntry(
const QByteArray &key,
const EntryDesc &entryDesc) override;
146 bool extractEntry(Entry entry, EntryDesc &entryDesc) override;
149 static void dumpInfo(
const QString &device);
150 static void dumpInfo(QIODevice &device);
153 Q_DISABLE_COPY(QQsbIODeviceCollection);
155 enum class DeviceOwner : quint8
162 DeviceOwner devOwner = DeviceOwner::Self;
163 quint8 version = Version::Unknown;
friend bool operator==(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
Returns true if lhs and rhs are equal, otherwise returns false.
\inmodule QtCore\reentrant
QDataStream & operator>>(QDataStream &s, QKeyCombination &combination)
static const char * borderText()
static constexpr qint64 HeaderSize
static QString lockFileName(const QString &name)
static constexpr quint64 MagicaDS
static constexpr quint32 QtVersion
constexpr size_t qHash(const QSize &s, size_t seed=0) noexcept