mirror of https://github.com/PurpleI2P/i2pd.git
I2P: End-to-End encrypted and anonymous Internet
https://i2pd.website/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
1.4 KiB
68 lines
1.4 KiB
#pragma once |
|
|
|
#include <initializer_list> |
|
#include <utility> |
|
|
|
#include <nlohmann/detail/meta/type_traits.hpp> |
|
|
|
namespace nlohmann |
|
{ |
|
namespace detail |
|
{ |
|
template<typename BasicJsonType> |
|
class json_ref |
|
{ |
|
public: |
|
using value_type = BasicJsonType; |
|
|
|
json_ref(value_type&& value) |
|
: owned_value(std::move(value)) |
|
{} |
|
|
|
json_ref(const value_type& value) |
|
: value_ref(&value) |
|
{} |
|
|
|
json_ref(std::initializer_list<json_ref> init) |
|
: owned_value(init) |
|
{} |
|
|
|
template < |
|
class... Args, |
|
enable_if_t<std::is_constructible<value_type, Args...>::value, int> = 0 > |
|
json_ref(Args && ... args) |
|
: owned_value(std::forward<Args>(args)...) |
|
{} |
|
|
|
// class should be movable only |
|
json_ref(json_ref&&) noexcept = default; |
|
json_ref(const json_ref&) = delete; |
|
json_ref& operator=(const json_ref&) = delete; |
|
json_ref& operator=(json_ref&&) = delete; |
|
~json_ref() = default; |
|
|
|
value_type moved_or_copied() const |
|
{ |
|
if (value_ref == nullptr) |
|
{ |
|
return std::move(owned_value); |
|
} |
|
return *value_ref; |
|
} |
|
|
|
value_type const& operator*() const |
|
{ |
|
return value_ref ? *value_ref : owned_value; |
|
} |
|
|
|
value_type const* operator->() const |
|
{ |
|
return &** this; |
|
} |
|
|
|
private: |
|
mutable value_type owned_value = nullptr; |
|
value_type const* value_ref = nullptr; |
|
}; |
|
} // namespace detail |
|
} // namespace nlohmann
|
|
|