147 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			147 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | //     __ _____ _____ _____
 | ||
|  | //  __|  |   __|     |   | |  JSON for Modern C++
 | ||
|  | // |  |  |__   |  |  | | | |  version 3.11.3
 | ||
|  | // |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 | ||
|  | //
 | ||
|  | // SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 | ||
|  | // SPDX-License-Identifier: MIT
 | ||
|  | 
 | ||
|  | #pragma once
 | ||
|  | 
 | ||
|  | #include <cstring> // strlen
 | ||
|  | #include <string> // string
 | ||
|  | #include <utility> // forward
 | ||
|  | 
 | ||
|  | #include <nlohmann/detail/meta/cpp_future.hpp>
 | ||
|  | #include <nlohmann/detail/meta/detected.hpp>
 | ||
|  | 
 | ||
|  | NLOHMANN_JSON_NAMESPACE_BEGIN | ||
|  | namespace detail | ||
|  | { | ||
|  | 
 | ||
|  | inline std::size_t concat_length() | ||
|  | { | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | template<typename... Args> | ||
|  | inline std::size_t concat_length(const char* cstr, const Args& ... rest); | ||
|  | 
 | ||
|  | template<typename StringType, typename... Args> | ||
|  | inline std::size_t concat_length(const StringType& str, const Args& ... rest); | ||
|  | 
 | ||
|  | template<typename... Args> | ||
|  | inline std::size_t concat_length(const char /*c*/, const Args& ... rest) | ||
|  | { | ||
|  |     return 1 + concat_length(rest...); | ||
|  | } | ||
|  | 
 | ||
|  | template<typename... Args> | ||
|  | inline std::size_t concat_length(const char* cstr, const Args& ... rest) | ||
|  | { | ||
|  |     // cppcheck-suppress ignoredReturnValue
 | ||
|  |     return ::strlen(cstr) + concat_length(rest...); | ||
|  | } | ||
|  | 
 | ||
|  | template<typename StringType, typename... Args> | ||
|  | inline std::size_t concat_length(const StringType& str, const Args& ... rest) | ||
|  | { | ||
|  |     return str.size() + concat_length(rest...); | ||
|  | } | ||
|  | 
 | ||
|  | template<typename OutStringType> | ||
|  | inline void concat_into(OutStringType& /*out*/) | ||
|  | {} | ||
|  | 
 | ||
|  | template<typename StringType, typename Arg> | ||
|  | using string_can_append = decltype(std::declval<StringType&>().append(std::declval < Arg && > ())); | ||
|  | 
 | ||
|  | template<typename StringType, typename Arg> | ||
|  | using detect_string_can_append = is_detected<string_can_append, StringType, Arg>; | ||
|  | 
 | ||
|  | template<typename StringType, typename Arg> | ||
|  | using string_can_append_op = decltype(std::declval<StringType&>() += std::declval < Arg && > ()); | ||
|  | 
 | ||
|  | template<typename StringType, typename Arg> | ||
|  | using detect_string_can_append_op = is_detected<string_can_append_op, StringType, Arg>; | ||
|  | 
 | ||
|  | template<typename StringType, typename Arg> | ||
|  | using string_can_append_iter = decltype(std::declval<StringType&>().append(std::declval<const Arg&>().begin(), std::declval<const Arg&>().end())); | ||
|  | 
 | ||
|  | template<typename StringType, typename Arg> | ||
|  | using detect_string_can_append_iter = is_detected<string_can_append_iter, StringType, Arg>; | ||
|  | 
 | ||
|  | template<typename StringType, typename Arg> | ||
|  | using string_can_append_data = decltype(std::declval<StringType&>().append(std::declval<const Arg&>().data(), std::declval<const Arg&>().size())); | ||
|  | 
 | ||
|  | template<typename StringType, typename Arg> | ||
|  | using detect_string_can_append_data = is_detected<string_can_append_data, StringType, Arg>; | ||
|  | 
 | ||
|  | template < typename OutStringType, typename Arg, typename... Args, | ||
|  |            enable_if_t < !detect_string_can_append<OutStringType, Arg>::value | ||
|  |                          && detect_string_can_append_op<OutStringType, Arg>::value, int > = 0 > | ||
|  | inline void concat_into(OutStringType& out, Arg && arg, Args && ... rest); | ||
|  | 
 | ||
|  | template < typename OutStringType, typename Arg, typename... Args, | ||
|  |            enable_if_t < !detect_string_can_append<OutStringType, Arg>::value | ||
|  |                          && !detect_string_can_append_op<OutStringType, Arg>::value | ||
|  |                          && detect_string_can_append_iter<OutStringType, Arg>::value, int > = 0 > | ||
|  | inline void concat_into(OutStringType& out, const Arg& arg, Args && ... rest); | ||
|  | 
 | ||
|  | template < typename OutStringType, typename Arg, typename... Args, | ||
|  |            enable_if_t < !detect_string_can_append<OutStringType, Arg>::value | ||
|  |                          && !detect_string_can_append_op<OutStringType, Arg>::value | ||
|  |                          && !detect_string_can_append_iter<OutStringType, Arg>::value | ||
|  |                          && detect_string_can_append_data<OutStringType, Arg>::value, int > = 0 > | ||
|  | inline void concat_into(OutStringType& out, const Arg& arg, Args && ... rest); | ||
|  | 
 | ||
|  | template<typename OutStringType, typename Arg, typename... Args, | ||
|  |          enable_if_t<detect_string_can_append<OutStringType, Arg>::value, int> = 0> | ||
|  | inline void concat_into(OutStringType& out, Arg && arg, Args && ... rest) | ||
|  | { | ||
|  |     out.append(std::forward<Arg>(arg)); | ||
|  |     concat_into(out, std::forward<Args>(rest)...); | ||
|  | } | ||
|  | 
 | ||
|  | template < typename OutStringType, typename Arg, typename... Args, | ||
|  |            enable_if_t < !detect_string_can_append<OutStringType, Arg>::value | ||
|  |                          && detect_string_can_append_op<OutStringType, Arg>::value, int > > | ||
|  | inline void concat_into(OutStringType& out, Arg&& arg, Args&& ... rest) | ||
|  | { | ||
|  |     out += std::forward<Arg>(arg); | ||
|  |     concat_into(out, std::forward<Args>(rest)...); | ||
|  | } | ||
|  | 
 | ||
|  | template < typename OutStringType, typename Arg, typename... Args, | ||
|  |            enable_if_t < !detect_string_can_append<OutStringType, Arg>::value | ||
|  |                          && !detect_string_can_append_op<OutStringType, Arg>::value | ||
|  |                          && detect_string_can_append_iter<OutStringType, Arg>::value, int > > | ||
|  | inline void concat_into(OutStringType& out, const Arg& arg, Args&& ... rest) | ||
|  | { | ||
|  |     out.append(arg.begin(), arg.end()); | ||
|  |     concat_into(out, std::forward<Args>(rest)...); | ||
|  | } | ||
|  | 
 | ||
|  | template < typename OutStringType, typename Arg, typename... Args, | ||
|  |            enable_if_t < !detect_string_can_append<OutStringType, Arg>::value | ||
|  |                          && !detect_string_can_append_op<OutStringType, Arg>::value | ||
|  |                          && !detect_string_can_append_iter<OutStringType, Arg>::value | ||
|  |                          && detect_string_can_append_data<OutStringType, Arg>::value, int > > | ||
|  | inline void concat_into(OutStringType& out, const Arg& arg, Args&& ... rest) | ||
|  | { | ||
|  |     out.append(arg.data(), arg.size()); | ||
|  |     concat_into(out, std::forward<Args>(rest)...); | ||
|  | } | ||
|  | 
 | ||
|  | template<typename OutStringType = std::string, typename... Args> | ||
|  | inline OutStringType concat(Args && ... args) | ||
|  | { | ||
|  |     OutStringType str; | ||
|  |     str.reserve(concat_length(args...)); | ||
|  |     concat_into(str, std::forward<Args>(args)...); | ||
|  |     return str; | ||
|  | } | ||
|  | 
 | ||
|  | }  // namespace detail
 | ||
|  | NLOHMANN_JSON_NAMESPACE_END |