Horizon
json_ref.hpp
1 #pragma once
2 
3 #include <initializer_list>
4 #include <utility>
5 
6 #include <nlohmann/detail/meta/type_traits.hpp>
7 
8 namespace nlohmann
9 {
10 namespace detail
11 {
12 template<typename BasicJsonType>
13 class json_ref
14 {
15  public:
16  using value_type = BasicJsonType;
17 
18  json_ref(value_type&& value)
19  : owned_value(std::move(value)), value_ref(&owned_value), is_rvalue(true)
20  {}
21 
22  json_ref(const value_type& value)
23  : value_ref(const_cast<value_type*>(&value)), is_rvalue(false)
24  {}
25 
26  json_ref(std::initializer_list<json_ref> init)
27  : owned_value(init), value_ref(&owned_value), is_rvalue(true)
28  {}
29 
30  template <
31  class... Args,
32  enable_if_t<std::is_constructible<value_type, Args...>::value, int> = 0 >
33  json_ref(Args && ... args)
34  : owned_value(std::forward<Args>(args)...), value_ref(&owned_value),
35  is_rvalue(true) {}
36 
37  // class should be movable only
38  json_ref(json_ref&&) = default;
39  json_ref(const json_ref&) = delete;
40  json_ref& operator=(const json_ref&) = delete;
41  json_ref& operator=(json_ref&&) = delete;
42  ~json_ref() = default;
43 
44  value_type moved_or_copied() const
45  {
46  if (is_rvalue)
47  {
48  return std::move(*value_ref);
49  }
50  return *value_ref;
51  }
52 
53  value_type const& operator*() const
54  {
55  return *static_cast<value_type const*>(value_ref);
56  }
57 
58  value_type const* operator->() const
59  {
60  return static_cast<value_type const*>(value_ref);
61  }
62 
63  private:
64  mutable value_type owned_value = nullptr;
65  value_type* value_ref = nullptr;
66  const bool is_rvalue;
67 };
68 } // namespace detail
69 } // namespace nlohmann
nlohmann
namespace for Niels Lohmann
Definition: adl_serializer.hpp:9
nlohmann::detail::json_ref
Definition: json_ref.hpp:14