55 using is_visitor_tag = std::integral_constant<bool, true>;
66 static auto marshall(
const T& t)
73 bool empty()
const noexcept {
return this->buffer.GetLength() == 0; }
75 void read(
const QString&)
const noexcept =
delete;
76 void read(
const float&)
const noexcept =
delete;
77 void read(
const char&)
const noexcept =
delete;
78 void read(
const int&)
const noexcept =
delete;
79 void read(
const bool&)
const noexcept =
delete;
80 void read(
const std::string&)
const noexcept =
delete;
81 void read(
const unsigned int&)
const noexcept =
delete;
82 void read(
const unsigned char&)
const noexcept =
delete;
92 void readFrom(
const QString& obj)
noexcept { readFrom(obj.toUtf8()); }
93 void readFrom(
const QByteArray& t)
noexcept { stream.String(t.data(), t.size()); }
94 void readFrom(
const std::string& t)
noexcept { stream.String(t.data(), t.size()); }
95 void readFrom(int64_t t)
noexcept { stream.Int64(t); }
96 void readFrom(int32_t t)
noexcept { stream.Int(t); }
97 void readFrom(uint64_t t)
noexcept { stream.Uint64(t); }
98 void readFrom(uint32_t t)
noexcept { stream.Uint(t); }
99 void readFrom(
float t)
noexcept { stream.Double(t); }
100 void readFrom(
double t)
noexcept { stream.Double(t); }
101 void readFrom(
bool t)
noexcept { stream.Bool(t); }
102 void readFrom(
char t)
noexcept { stream.String(&t, 1); }
103 void readFrom(
const void*)
noexcept =
delete;
105 template <
typename T>
112 readFrom((
const typename T::score_base_type&)obj);
114 else if constexpr(std::is_enum_v<T>)
118 stream.Int(
static_cast<int32_t
>(obj));
124 || is_custom_serialized<T>::value)
130 && !is_custom_serialized<T>::value)
132 stream.StartObject();
135 if constexpr(is_custom_serialized<T>::value || is_template<T>::value)
145 stream.StartObject();
148 if constexpr(is_custom_serialized<T>::value || is_template<T>::value)
157 stream.StartObject();
158 readFromAbstract(obj, [](
JSONReader& sub,
const T& obj) {
166 && !is_custom_serialized<T>::value)
168 stream.StartObject();
169 readFromAbstract(obj, [](
JSONReader& sub,
const T& obj) {
172 if constexpr(is_custom_serialized<T>::value || is_template<T>::value)
182 stream.StartObject();
183 readFromAbstract(obj, [](
JSONReader& sub,
const T& obj) {
186 if constexpr(is_custom_serialized<T>::value || is_template<T>::value)
202 rapidjson::StringBuffer buffer;
203 JsonWriter stream{buffer};
208 assigner operator[](std::string_view str)
const noexcept;
209 template <std::
size_t N>
210 assigner operator[](
const char (&str)[N])
const noexcept;
211 assigner operator[](
const QString& str)
const noexcept;
217 QByteArray toByteArray()
const
219 SCORE_ASSERT(stream.IsComplete());
220 return QByteArray{buffer.GetString(), (int)buffer.GetLength()};
222 std::string toStdString()
const
224 SCORE_ASSERT(stream.IsComplete());
225 return std::string{buffer.GetString(), buffer.GetLength()};
227 QString toString()
const
229 SCORE_ASSERT(stream.IsComplete());
230 return QString::fromUtf8(buffer.GetString(), buffer.GetLength());
235 template <
typename T>
239 template <
typename T,
typename Fun>
240 void readFromAbstract(
const T& in, Fun f);
247 void operator=(int64_t t)
const noexcept { self.stream.Int64(t); }
248 void operator=(int32_t t)
const noexcept { self.stream.Int(t); }
249 void operator=(uint64_t t)
const noexcept { self.stream.Uint64(t); }
250 void operator=(uint32_t t)
const noexcept { self.stream.Uint(t); }
251 void operator=(
float t)
const noexcept { self.stream.Double(t); }
252 void operator=(
double t)
const noexcept { self.stream.Double(t); }
253 void operator=(
bool t)
const noexcept { self.stream.Bool(t); }
254 void operator=(
char t)
const noexcept { self.stream.String(&t, 1); }
255 void operator=(QPoint t)
const noexcept
257 self.stream.StartArray();
258 self.stream.Int(t.x());
259 self.stream.Int(t.y());
260 self.stream.EndArray();
262 void operator=(QPointF t)
const noexcept
264 self.stream.StartArray();
265 self.stream.Double(t.x());
266 self.stream.Double(t.y());
267 self.stream.EndArray();
269 void operator=(QSize t)
const noexcept
271 self.stream.StartArray();
272 self.stream.Int(t.width());
273 self.stream.Int(t.height());
274 self.stream.EndArray();
276 void operator=(QSizeF t)
const noexcept
278 self.stream.StartArray();
279 self.stream.Double(t.width());
280 self.stream.Double(t.height());
281 self.stream.EndArray();
283 void operator=(QRect t)
const noexcept
285 self.stream.StartArray();
286 self.stream.Int(t.x());
287 self.stream.Int(t.y());
288 self.stream.Int(t.width());
289 self.stream.Int(t.height());
290 self.stream.EndArray();
292 void operator=(QRectF t)
const noexcept
294 self.stream.StartArray();
295 self.stream.Double(t.x());
296 self.stream.Double(t.y());
297 self.stream.Double(t.width());
298 self.stream.Double(t.height());
299 self.stream.EndArray();
301 void operator=(
const QString& t)
const noexcept { *
this = t.toUtf8(); }
302 void operator=(
const QStringList& t)
const noexcept
304 self.stream.StartArray();
305 for(
const auto& str : t)
306 *
this = str.toUtf8();
307 self.stream.EndArray();
309 void operator=(
const QLatin1String& t)
const noexcept
311 self.stream.String(t.data(), t.size());
313 void operator=(
const std::string& t)
const noexcept
315 self.stream.String(t.data(), t.length());
317 void operator=(
const std::string_view& t)
const noexcept
319 self.stream.String(t.data(), t.length());
321 void operator=(
const QByteArray& t)
const noexcept
323 self.stream.String(t.data(), t.length());
325 void operator=(
const QVariantMap& t)
const noexcept { SCORE_ABORT; }
327 template <
typename T>
328 void operator=(
const T& t)
const noexcept
330 if constexpr(std::is_enum_v<T>)
334 self.stream.Int(
static_cast<int32_t
>(t));
595 template <
typename T>
598 s.stream.StartArray();
599 for(
const auto& elt : vec)
604 template <
typename T>
607 const auto& array = s.base.GetArray();
610 vec.reserve(array.Size());
611 for(
const auto& elt : array)
613 typename T::value_type v;
616 vec.push_back(std::move(v));
620 template <
template <
typename,
typename...>
typename T,
typename Arg,
typename... Args>
623 using arg_type = std::remove_cvref_t<Arg>;
624 s.stream.StartArray();
625 for(
const auto& elt : vec)
627 if constexpr(std::is_floating_point_v<arg_type>)
628 s.stream.Double(elt);
629 else if constexpr(std::is_same_v<arg_type, char>)
630 s.stream.String(&elt, 1);
631 else if constexpr(std::is_integral_v<arg_type>)
633 if constexpr(
sizeof(arg_type) > 4)
638 else if constexpr(std::is_same_v<arg_type, std::string>)
639 s.stream.String(elt.data(), elt.size());
640 else if constexpr(std::is_same_v<arg_type, QString>)
642 const QByteArray& b = elt.toUtf8();
643 s.stream.String(b.data(), b.size());
652 template <
typename, std::size_t,
typename...>
typename T,
typename Arg,
653 std::size_t N,
typename... Args>
656 using type = T<Arg, N, Args...>;
657 using arg_type = std::remove_cvref_t<Arg>;
658 const auto& array = s.base.GetArray();
659 if constexpr(std::is_aggregate_v<type>)
661 SCORE_ASSERT(N >= array.Size());
666 vec.resize(array.Size());
669 auto it = vec.begin();
670 for(
const auto& elt : array)
672 if constexpr(std::is_floating_point_v<arg_type>)
673 *it = elt.GetDouble();
674 else if constexpr(std::is_same_v<arg_type, char>)
676 SCORE_ASSERT(elt.IsString());
677 if(elt.GetStringLength() == 1)
678 *it = elt.GetString()[0];
682 else if constexpr(std::is_integral_v<arg_type>)
684 if constexpr(
sizeof(arg_type) > 4)
687 *it = elt.GetInt64();
694 else if constexpr(std::is_same_v<arg_type, std::string>)
695 *it = std::string{elt.GetString(), elt.GetStringLength()};
696 else if constexpr(std::is_same_v<arg_type, QString>)
698 *it = QString::fromUtf8(elt.GetString(), elt.GetStringLength());
710 template <
typename,
typename,
typename...>
typename T,
typename Arg,
typename Arg2,
714 using type = T<Arg, Arg2, Args...>;
715 using arg_type = std::remove_cvref_t<Arg>;
716 const auto& array = s.base.GetArray();
719 vec.resize(array.Size());
721 auto it = vec.begin();
722 for(
const auto& elt : array)
724 if constexpr(std::is_floating_point_v<arg_type>)
725 *it = elt.GetDouble();
726 else if constexpr(std::is_same_v<arg_type, char>)
728 SCORE_ASSERT(elt.IsString());
729 if(elt.GetStringLength() == 1)
730 *it = elt.GetString()[0];
734 else if constexpr(std::is_integral_v<arg_type>)
736 if constexpr(
sizeof(arg_type) > 4)
737 *it = elt.GetInt64();
741 else if constexpr(std::is_same_v<arg_type, std::string>)
742 *it = std::string{elt.GetString(), elt.GetStringLength()};
743 else if constexpr(std::is_same_v<arg_type, QString>)
745 *it = QString::fromUtf8(elt.GetString(), elt.GetStringLength());
756 template <
typename T>
759 s.stream.StartArray();
760 for(
const auto& elt : vec)
765 template <
typename T>
770 const auto& array = s.base.GetArray();
771 for(
const auto& elt : array)
776 vec.push_back(std::move(v));
781 template <
typename T>
784 s.stream.StartArray();
785 for(
const auto& elt : vec)
790 template <
typename T>
793 const auto& array = s.base.GetArray();
795 vec.reserve(array.Size());
797 for(
const auto& elt : array)
802 vec.push_back(std::move(v));