serializerbase_p.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #ifndef QTJSONSERIALIZER_SERIALIZERBASE_P_H
  2. #define QTJSONSERIALIZER_SERIALIZERBASE_P_H
  3. #include "qtjsonserializer_global.h"
  4. #include "serializerbase.h"
  5. #include <QtCore/QReadWriteLock>
  6. #include <QtCore/QHash>
  7. #include <QtCore/QLoggingCategory>
  8. #include <QtCore/private/qobject_p.h>
  9. namespace QtJsonSerializer {
  10. class Q_JSONSERIALIZER_EXPORT SerializerBasePrivate : public QObjectPrivate
  11. {
  12. Q_DECLARE_PUBLIC(SerializerBase)
  13. public:
  14. using ValidationFlag = SerializerBase::ValidationFlag;
  15. using ValidationFlags = SerializerBase::ValidationFlags;
  16. using Polymorphing = SerializerBase::Polymorphing;
  17. using MultiMapMode = SerializerBase::MultiMapMode;
  18. template <typename TConverter>
  19. class ThreadSafeStore {
  20. public:
  21. ThreadSafeStore() = default;
  22. ThreadSafeStore(std::initializer_list<std::pair<int, QSharedPointer<TConverter>>> initData);
  23. QSharedPointer<TConverter> get(int metaTypeId) const;
  24. void add(int metaTypeId, const QSharedPointer<TConverter> &converter);
  25. void clear();
  26. private:
  27. mutable QReadWriteLock _lock {};
  28. QHash<int, QSharedPointer<TConverter>> _store;
  29. };
  30. template <typename TConverter>
  31. struct ConverterStore {
  32. mutable QReadWriteLock lock {};
  33. QList<QSharedPointer<TConverter>> store;
  34. QAtomicInt factoryOffset = 0;
  35. ConverterStore() = default;
  36. ConverterStore(std::initializer_list<QSharedPointer<TConverter>> initData);
  37. void insertSorted(const QSharedPointer<TConverter> &converter);
  38. void insertSorted(const QSharedPointer<TConverter> &converter, QWriteLocker &locker);
  39. };
  40. static ThreadSafeStore<TypeExtractor> extractors;
  41. static QReadWriteLock typeConverterFactoryLock;
  42. static QList<TypeConverterFactory*> typeConverterFactories;
  43. bool allowNull = false;
  44. bool keepObjectName = false;
  45. bool enumAsString = false;
  46. bool versionAsString = false;
  47. bool dateAsTimeStamp = false;
  48. bool useBcp47Locale = true;
  49. ValidationFlags validationFlags = ValidationFlag::StandardValidation;
  50. Polymorphing polymorphing = Polymorphing::Enabled;
  51. MultiMapMode multiMapMode = MultiMapMode::Map;
  52. bool ignoreStoredAttribute = false;
  53. mutable ConverterStore<TypeConverter> typeConverters;
  54. mutable ThreadSafeStore<TypeConverter> serCache;
  55. mutable ThreadSafeStore<TypeConverter> deserCache;
  56. template <typename TConverter>
  57. void insertSorted(const QSharedPointer<TConverter> &converter, QList<QSharedPointer<TConverter>> &list) const;
  58. QSharedPointer<TypeConverter> findSerConverter(int propertyType) const;
  59. QSharedPointer<TypeConverter> findDeserConverter(int &propertyType, QCborTag tag, QCborValue::Type type) const;
  60. void updateConverterStore() const;
  61. int getEnumId(QMetaEnum metaEnum, bool ser) const;
  62. virtual QCborValue serializeValue(int propertyType, const QVariant &value) const;
  63. virtual QVariant deserializeCborValue(int propertyType, const QCborValue &value) const;
  64. virtual QVariant deserializeJsonValue(int propertyType, const QCborValue &value) const;
  65. };
  66. Q_DECLARE_LOGGING_CATEGORY(logSerializer)
  67. Q_DECLARE_LOGGING_CATEGORY(logSerializerExtractor)
  68. template<typename TConverter>
  69. SerializerBasePrivate::ThreadSafeStore<TConverter>::ThreadSafeStore(std::initializer_list<std::pair<int, QSharedPointer<TConverter>>> initData)
  70. : _store{std::move(initData)}
  71. {}
  72. template<typename TConverter>
  73. QSharedPointer<TConverter> SerializerBasePrivate::ThreadSafeStore<TConverter>::get(int metaTypeId) const
  74. {
  75. QReadLocker _{&_lock};
  76. return _store.value(metaTypeId, nullptr);
  77. }
  78. template<typename TConverter>
  79. void SerializerBasePrivate::ThreadSafeStore<TConverter>::add(int metaTypeId, const QSharedPointer<TConverter> &converter)
  80. {
  81. QWriteLocker _{&_lock};
  82. _store.insert(metaTypeId, converter);
  83. }
  84. template<typename TConverter>
  85. void SerializerBasePrivate::ThreadSafeStore<TConverter>::clear()
  86. {
  87. QWriteLocker _{&_lock};
  88. _store.clear();
  89. }
  90. template<typename TConverter>
  91. SerializerBasePrivate::ConverterStore<TConverter>::ConverterStore(std::initializer_list<QSharedPointer<TConverter>> initData)
  92. : store{std::move(initData)}
  93. {
  94. #ifndef QT_NO_DEBUG
  95. for (auto i = 1; i < store.size(); ++i)
  96. Q_ASSERT(store[i]->priority() <= store[i - 1]->priority());
  97. #endif
  98. }
  99. template<typename TConverter>
  100. void SerializerBasePrivate::ConverterStore<TConverter>::insertSorted(const QSharedPointer<TConverter> &converter)
  101. {
  102. QWriteLocker _{&lock};
  103. insertSorted(converter, _);
  104. }
  105. template<typename TConverter>
  106. void SerializerBasePrivate::ConverterStore<TConverter>::insertSorted(const QSharedPointer<TConverter> &converter, QWriteLocker &locker)
  107. {
  108. Q_UNUSED(locker)
  109. for (auto it = store.begin(); it != store.end(); ++it) {
  110. if ((*it)->priority() < converter->priority()) {
  111. store.insert(it, converter);
  112. return;
  113. }
  114. }
  115. // not inserted -> add to end
  116. store.append(converter);
  117. }
  118. }
  119. #endif // QTJSONSERIALIZER_SERIALIZERBASE_P_H