#ifndef QTJSONSERIALIZER_SERIALIZERBASE_P_H #define QTJSONSERIALIZER_SERIALIZERBASE_P_H #include "qtjsonserializer_global.h" #include "serializerbase.h" #include #include #include #include namespace QtJsonSerializer { class Q_JSONSERIALIZER_EXPORT SerializerBasePrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(SerializerBase) public: using ValidationFlag = SerializerBase::ValidationFlag; using ValidationFlags = SerializerBase::ValidationFlags; using Polymorphing = SerializerBase::Polymorphing; using MultiMapMode = SerializerBase::MultiMapMode; template class ThreadSafeStore { public: ThreadSafeStore() = default; ThreadSafeStore(std::initializer_list>> initData); QSharedPointer get(int metaTypeId) const; void add(int metaTypeId, const QSharedPointer &converter); void clear(); private: mutable QReadWriteLock _lock {}; QHash> _store; }; template struct ConverterStore { mutable QReadWriteLock lock {}; QList> store; QAtomicInt factoryOffset = 0; ConverterStore() = default; ConverterStore(std::initializer_list> initData); void insertSorted(const QSharedPointer &converter); void insertSorted(const QSharedPointer &converter, QWriteLocker &locker); }; static ThreadSafeStore extractors; static QReadWriteLock typeConverterFactoryLock; static QList typeConverterFactories; bool allowNull = false; bool keepObjectName = false; bool enumAsString = false; bool versionAsString = false; bool dateAsTimeStamp = false; bool useBcp47Locale = true; ValidationFlags validationFlags = ValidationFlag::StandardValidation; Polymorphing polymorphing = Polymorphing::Enabled; MultiMapMode multiMapMode = MultiMapMode::Map; bool ignoreStoredAttribute = false; mutable ConverterStore typeConverters; mutable ThreadSafeStore serCache; mutable ThreadSafeStore deserCache; template void insertSorted(const QSharedPointer &converter, QList> &list) const; QSharedPointer findSerConverter(int propertyType) const; QSharedPointer findDeserConverter(int &propertyType, QCborTag tag, QCborValue::Type type) const; void updateConverterStore() const; int getEnumId(QMetaEnum metaEnum, bool ser) const; virtual QCborValue serializeValue(int propertyType, const QVariant &value) const; virtual QVariant deserializeCborValue(int propertyType, const QCborValue &value) const; virtual QVariant deserializeJsonValue(int propertyType, const QCborValue &value) const; }; Q_DECLARE_LOGGING_CATEGORY(logSerializer) Q_DECLARE_LOGGING_CATEGORY(logSerializerExtractor) template SerializerBasePrivate::ThreadSafeStore::ThreadSafeStore(std::initializer_list>> initData) : _store{std::move(initData)} {} template QSharedPointer SerializerBasePrivate::ThreadSafeStore::get(int metaTypeId) const { QReadLocker _{&_lock}; return _store.value(metaTypeId, nullptr); } template void SerializerBasePrivate::ThreadSafeStore::add(int metaTypeId, const QSharedPointer &converter) { QWriteLocker _{&_lock}; _store.insert(metaTypeId, converter); } template void SerializerBasePrivate::ThreadSafeStore::clear() { QWriteLocker _{&_lock}; _store.clear(); } template SerializerBasePrivate::ConverterStore::ConverterStore(std::initializer_list> initData) : store{std::move(initData)} { #ifndef QT_NO_DEBUG for (auto i = 1; i < store.size(); ++i) Q_ASSERT(store[i]->priority() <= store[i - 1]->priority()); #endif } template void SerializerBasePrivate::ConverterStore::insertSorted(const QSharedPointer &converter) { QWriteLocker _{&lock}; insertSorted(converter, _); } template void SerializerBasePrivate::ConverterStore::insertSorted(const QSharedPointer &converter, QWriteLocker &locker) { Q_UNUSED(locker) for (auto it = store.begin(); it != store.end(); ++it) { if ((*it)->priority() < converter->priority()) { store.insert(it, converter); return; } } // not inserted -> add to end store.append(converter); } } #endif // QTJSONSERIALIZER_SERIALIZERBASE_P_H