1c5f01b2fSopenharmony_ci//     __ _____ _____ _____
2c5f01b2fSopenharmony_ci//  __|  |   __|     |   | |  JSON for Modern C++
3c5f01b2fSopenharmony_ci// |  |  |__   |  |  | | | |  version 3.11.2
4c5f01b2fSopenharmony_ci// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
5c5f01b2fSopenharmony_ci//
6c5f01b2fSopenharmony_ci// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
7c5f01b2fSopenharmony_ci// SPDX-License-Identifier: MIT
8c5f01b2fSopenharmony_ci
9c5f01b2fSopenharmony_ci#pragma once
10c5f01b2fSopenharmony_ci
11c5f01b2fSopenharmony_ci#include <type_traits>
12c5f01b2fSopenharmony_ci
13c5f01b2fSopenharmony_ci#include <nlohmann/detail/meta/void_t.hpp>
14c5f01b2fSopenharmony_ci
15c5f01b2fSopenharmony_ciNLOHMANN_JSON_NAMESPACE_BEGIN
16c5f01b2fSopenharmony_cinamespace detail
17c5f01b2fSopenharmony_ci{
18c5f01b2fSopenharmony_ci
19c5f01b2fSopenharmony_ci// https://en.cppreference.com/w/cpp/experimental/is_detected
20c5f01b2fSopenharmony_cistruct nonesuch
21c5f01b2fSopenharmony_ci{
22c5f01b2fSopenharmony_ci    nonesuch() = delete;
23c5f01b2fSopenharmony_ci    ~nonesuch() = delete;
24c5f01b2fSopenharmony_ci    nonesuch(nonesuch const&) = delete;
25c5f01b2fSopenharmony_ci    nonesuch(nonesuch const&&) = delete;
26c5f01b2fSopenharmony_ci    void operator=(nonesuch const&) = delete;
27c5f01b2fSopenharmony_ci    void operator=(nonesuch&&) = delete;
28c5f01b2fSopenharmony_ci};
29c5f01b2fSopenharmony_ci
30c5f01b2fSopenharmony_citemplate<class Default,
31c5f01b2fSopenharmony_ci         class AlwaysVoid,
32c5f01b2fSopenharmony_ci         template<class...> class Op,
33c5f01b2fSopenharmony_ci         class... Args>
34c5f01b2fSopenharmony_cistruct detector
35c5f01b2fSopenharmony_ci{
36c5f01b2fSopenharmony_ci    using value_t = std::false_type;
37c5f01b2fSopenharmony_ci    using type = Default;
38c5f01b2fSopenharmony_ci};
39c5f01b2fSopenharmony_ci
40c5f01b2fSopenharmony_citemplate<class Default, template<class...> class Op, class... Args>
41c5f01b2fSopenharmony_cistruct detector<Default, void_t<Op<Args...>>, Op, Args...>
42c5f01b2fSopenharmony_ci{
43c5f01b2fSopenharmony_ci    using value_t = std::true_type;
44c5f01b2fSopenharmony_ci    using type = Op<Args...>;
45c5f01b2fSopenharmony_ci};
46c5f01b2fSopenharmony_ci
47c5f01b2fSopenharmony_citemplate<template<class...> class Op, class... Args>
48c5f01b2fSopenharmony_ciusing is_detected = typename detector<nonesuch, void, Op, Args...>::value_t;
49c5f01b2fSopenharmony_ci
50c5f01b2fSopenharmony_citemplate<template<class...> class Op, class... Args>
51c5f01b2fSopenharmony_cistruct is_detected_lazy : is_detected<Op, Args...> { };
52c5f01b2fSopenharmony_ci
53c5f01b2fSopenharmony_citemplate<template<class...> class Op, class... Args>
54c5f01b2fSopenharmony_ciusing detected_t = typename detector<nonesuch, void, Op, Args...>::type;
55c5f01b2fSopenharmony_ci
56c5f01b2fSopenharmony_citemplate<class Default, template<class...> class Op, class... Args>
57c5f01b2fSopenharmony_ciusing detected_or = detector<Default, void, Op, Args...>;
58c5f01b2fSopenharmony_ci
59c5f01b2fSopenharmony_citemplate<class Default, template<class...> class Op, class... Args>
60c5f01b2fSopenharmony_ciusing detected_or_t = typename detected_or<Default, Op, Args...>::type;
61c5f01b2fSopenharmony_ci
62c5f01b2fSopenharmony_citemplate<class Expected, template<class...> class Op, class... Args>
63c5f01b2fSopenharmony_ciusing is_detected_exact = std::is_same<Expected, detected_t<Op, Args...>>;
64c5f01b2fSopenharmony_ci
65c5f01b2fSopenharmony_citemplate<class To, template<class...> class Op, class... Args>
66c5f01b2fSopenharmony_ciusing is_detected_convertible =
67c5f01b2fSopenharmony_ci    std::is_convertible<detected_t<Op, Args...>, To>;
68c5f01b2fSopenharmony_ci
69c5f01b2fSopenharmony_ci}  // namespace detail
70c5f01b2fSopenharmony_ciNLOHMANN_JSON_NAMESPACE_END
71