JsonArray.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/JsonArraySerializer.h>
  8. #include <AK/JsonValue.h>
  9. #include <AK/Vector.h>
  10. namespace AK {
  11. class JsonArray {
  12. public:
  13. JsonArray() = default;
  14. ~JsonArray() = default;
  15. JsonArray(JsonArray const& other)
  16. : m_values(other.m_values)
  17. {
  18. }
  19. JsonArray(JsonArray&& other)
  20. : m_values(move(other.m_values))
  21. {
  22. }
  23. template<typename T>
  24. JsonArray(Vector<T> const& vector)
  25. {
  26. for (auto& value : vector)
  27. m_values.append(move(value));
  28. }
  29. JsonArray& operator=(JsonArray const& other)
  30. {
  31. if (this != &other)
  32. m_values = other.m_values;
  33. return *this;
  34. }
  35. JsonArray& operator=(JsonArray&& other)
  36. {
  37. if (this != &other)
  38. m_values = move(other.m_values);
  39. return *this;
  40. }
  41. [[nodiscard]] size_t size() const { return m_values.size(); }
  42. [[nodiscard]] bool is_empty() const { return m_values.is_empty(); }
  43. [[nodiscard]] JsonValue const& at(size_t index) const { return m_values.at(index); }
  44. [[nodiscard]] JsonValue const& operator[](size_t index) const { return at(index); }
  45. void clear() { m_values.clear(); }
  46. void append(JsonValue value) { m_values.append(move(value)); }
  47. void set(size_t index, JsonValue value) { m_values[index] = move(value); }
  48. template<typename Builder>
  49. typename Builder::OutputType serialized() const;
  50. template<typename Builder>
  51. void serialize(Builder&) const;
  52. [[nodiscard]] String to_string() const { return serialized<StringBuilder>(); }
  53. template<typename Callback>
  54. void for_each(Callback callback) const
  55. {
  56. for (auto const& value : m_values)
  57. callback(value);
  58. }
  59. [[nodiscard]] Vector<JsonValue> const& values() const { return m_values; }
  60. void ensure_capacity(size_t capacity) { m_values.ensure_capacity(capacity); }
  61. private:
  62. Vector<JsonValue> m_values;
  63. };
  64. template<typename Builder>
  65. inline void JsonArray::serialize(Builder& builder) const
  66. {
  67. JsonArraySerializer serializer { builder };
  68. for_each([&](auto& value) { serializer.add(value); });
  69. }
  70. template<typename Builder>
  71. inline typename Builder::OutputType JsonArray::serialized() const
  72. {
  73. Builder builder;
  74. serialize(builder);
  75. return builder.build();
  76. }
  77. }
  78. using AK::JsonArray;