visit.hpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. //
  2. // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. //
  7. // Official repository: https://github.com/boostorg/json
  8. //
  9. #ifndef BOOST_JSON_IMPL_VISIT_HPP
  10. #define BOOST_JSON_IMPL_VISIT_HPP
  11. namespace boost {
  12. namespace json {
  13. template<class Visitor>
  14. auto
  15. visit(
  16. Visitor&& v,
  17. value& jv) -> decltype(
  18. std::declval<Visitor>()(nullptr))
  19. {
  20. switch(jv.kind())
  21. {
  22. default: // unreachable()?
  23. case kind::null: return std::forward<Visitor>(v)(nullptr);
  24. case kind::bool_: return std::forward<Visitor>(v)(jv.get_bool());
  25. case kind::int64: return std::forward<Visitor>(v)(jv.get_int64());
  26. case kind::uint64: return std::forward<Visitor>(v)(jv.get_uint64());
  27. case kind::double_: return std::forward<Visitor>(v)(jv.get_double());
  28. case kind::string: return std::forward<Visitor>(v)(jv.get_string());
  29. case kind::array: return std::forward<Visitor>(v)(jv.get_array());
  30. case kind::object: return std::forward<Visitor>(v)(jv.get_object());
  31. }
  32. }
  33. template<class Visitor>
  34. auto
  35. visit(
  36. Visitor&& v,
  37. value const& jv) -> decltype(
  38. std::declval<Visitor>()(nullptr))
  39. {
  40. switch (jv.kind())
  41. {
  42. default: // unreachable()?
  43. case kind::null: return std::forward<Visitor>(v)(nullptr);
  44. case kind::bool_: return std::forward<Visitor>(v)(jv.get_bool());
  45. case kind::int64: return std::forward<Visitor>(v)(jv.get_int64());
  46. case kind::uint64: return std::forward<Visitor>(v)(jv.get_uint64());
  47. case kind::double_: return std::forward<Visitor>(v)(jv.get_double());
  48. case kind::string: return std::forward<Visitor>(v)(jv.get_string());
  49. case kind::array: return std::forward<Visitor>(v)(jv.get_array());
  50. case kind::object: return std::forward<Visitor>(v)(jv.get_object());
  51. }
  52. }
  53. } // namespace json
  54. } // namespace boost
  55. #endif