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