JsonVariantVisitor.hpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. // ArduinoJson - https://arduinojson.org
  2. // Copyright © 2014-2025, Benoit BLANCHON
  3. // MIT License
  4. #pragma once
  5. #include <ArduinoJson/Array/JsonArray.hpp>
  6. #include <ArduinoJson/Object/JsonObject.hpp>
  7. #include <ArduinoJson/Variant/JsonVariant.hpp>
  8. #include <ArduinoJson/Variant/VariantDataVisitor.hpp>
  9. ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
  10. template <typename TResult>
  11. struct JsonVariantVisitor {
  12. using result_type = TResult;
  13. template <typename T>
  14. TResult visit(const T&) {
  15. return TResult();
  16. }
  17. };
  18. template <typename TVisitor>
  19. class VisitorAdapter {
  20. public:
  21. using result_type = typename TVisitor::result_type;
  22. VisitorAdapter(TVisitor& visitor) : visitor_(&visitor) {}
  23. result_type visitArray(const VariantImpl& array) {
  24. return visitor_->visit(JsonArrayConst(array));
  25. }
  26. result_type visitObject(const VariantImpl& object) {
  27. return visitor_->visit(JsonObjectConst(object));
  28. }
  29. template <typename T>
  30. result_type visit(const T& value) {
  31. return visitor_->visit(value);
  32. }
  33. private:
  34. TVisitor* visitor_;
  35. };
  36. template <typename TVisitor>
  37. typename TVisitor::result_type accept(JsonVariantConst variant,
  38. TVisitor& visit) {
  39. auto data = VariantAttorney::getData(variant);
  40. auto resources = VariantAttorney::getResourceManager(variant);
  41. VisitorAdapter<TVisitor> adapter(visit);
  42. return VariantImpl(data, resources).accept(adapter);
  43. }
  44. ARDUINOJSON_END_PRIVATE_NAMESPACE