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