From 2d59006262d6e45f41ee325af78433475884dca4 Mon Sep 17 00:00:00 2001 From: Emma Miler Date: Fri, 2 Dec 2022 23:00:33 +0100 Subject: Move include directory (#337) * Move include directory to shared folder This commit moves the `include` directory from the NorthstarDLL project folder to the solution folder. This allows both the DLL and Launcher project to target it properly. * Fix filters * Update memalloc.h * Fix filters * Update NorthstarLauncher.vcxproj * Remove stuff from other PR * Update NorthstarLauncher.vcxproj * Update NorthstarLauncher.vcxproj * Update NorthstarDLL.vcxproj --- include/spdlog/fmt/bundled/ranges.h | 396 ++++++++++++++++++++++++++++++++++++ 1 file changed, 396 insertions(+) create mode 100644 include/spdlog/fmt/bundled/ranges.h (limited to 'include/spdlog/fmt/bundled/ranges.h') diff --git a/include/spdlog/fmt/bundled/ranges.h b/include/spdlog/fmt/bundled/ranges.h new file mode 100644 index 00000000..632f0494 --- /dev/null +++ b/include/spdlog/fmt/bundled/ranges.h @@ -0,0 +1,396 @@ +// Formatting library for C++ - experimental range support +// +// Copyright (c) 2012 - present, Victor Zverovich +// All rights reserved. +// +// For the license information refer to format.h. +// +// Copyright (c) 2018 - present, Remotion (Igor Schulz) +// All Rights Reserved +// {fmt} support for ranges, containers and types tuple interface. + +#ifndef FMT_RANGES_H_ +#define FMT_RANGES_H_ + +#include +#include + +#include "format.h" + +// output only up to N items from the range. +#ifndef FMT_RANGE_OUTPUT_LENGTH_LIMIT +# define FMT_RANGE_OUTPUT_LENGTH_LIMIT 256 +#endif + +FMT_BEGIN_NAMESPACE + +template struct formatting_base { + template + FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) { + return ctx.begin(); + } +}; + +template +struct formatting_range : formatting_base { + static FMT_CONSTEXPR_DECL const size_t range_length_limit = + FMT_RANGE_OUTPUT_LENGTH_LIMIT; // output only up to N items from the + // range. + Char prefix; + Char delimiter; + Char postfix; + formatting_range() : prefix('{'), delimiter(','), postfix('}') {} + static FMT_CONSTEXPR_DECL const bool add_delimiter_spaces = true; + static FMT_CONSTEXPR_DECL const bool add_prepostfix_space = false; +}; + +template +struct formatting_tuple : formatting_base { + Char prefix; + Char delimiter; + Char postfix; + formatting_tuple() : prefix('('), delimiter(','), postfix(')') {} + static FMT_CONSTEXPR_DECL const bool add_delimiter_spaces = true; + static FMT_CONSTEXPR_DECL const bool add_prepostfix_space = false; +}; + +namespace detail { + +template +OutputIterator copy(const RangeT& range, OutputIterator out) { + for (auto it = range.begin(), end = range.end(); it != end; ++it) + *out++ = *it; + return out; +} + +template +OutputIterator copy(const char* str, OutputIterator out) { + while (*str) *out++ = *str++; + return out; +} + +template +OutputIterator copy(char ch, OutputIterator out) { + *out++ = ch; + return out; +} + +/// Return true value if T has std::string interface, like std::string_view. +template class is_like_std_string { + template + static auto check(U* p) + -> decltype((void)p->find('a'), p->length(), (void)p->data(), int()); + template static void check(...); + + public: + static FMT_CONSTEXPR_DECL const bool value = + is_string::value || !std::is_void(nullptr))>::value; +}; + +template +struct is_like_std_string> : std::true_type {}; + +template struct conditional_helper {}; + +template struct is_range_ : std::false_type {}; + +#if !FMT_MSC_VER || FMT_MSC_VER > 1800 +template +struct is_range_< + T, conditional_t().begin()), + decltype(std::declval().end())>, + void>> : std::true_type {}; +#endif + +/// tuple_size and tuple_element check. +template class is_tuple_like_ { + template + static auto check(U* p) -> decltype(std::tuple_size::value, int()); + template static void check(...); + + public: + static FMT_CONSTEXPR_DECL const bool value = + !std::is_void(nullptr))>::value; +}; + +// Check for integer_sequence +#if defined(__cpp_lib_integer_sequence) || FMT_MSC_VER >= 1900 +template +using integer_sequence = std::integer_sequence; +template using index_sequence = std::index_sequence; +template using make_index_sequence = std::make_index_sequence; +#else +template struct integer_sequence { + using value_type = T; + + static FMT_CONSTEXPR size_t size() { return sizeof...(N); } +}; + +template using index_sequence = integer_sequence; + +template +struct make_integer_sequence : make_integer_sequence {}; +template +struct make_integer_sequence : integer_sequence {}; + +template +using make_index_sequence = make_integer_sequence; +#endif + +template +void for_each(index_sequence, Tuple&& tup, F&& f) FMT_NOEXCEPT { + using std::get; + // using free function get(T) now. + const int _[] = {0, ((void)f(get(tup)), 0)...}; + (void)_; // blocks warnings +} + +template +FMT_CONSTEXPR make_index_sequence::value> get_indexes( + T const&) { + return {}; +} + +template void for_each(Tuple&& tup, F&& f) { + const auto indexes = get_indexes(tup); + for_each(indexes, std::forward(tup), std::forward(f)); +} + +template +using value_type = remove_cvref_t().begin())>; + +template ::type>::value)> +FMT_CONSTEXPR const char* format_str_quoted(bool add_space, const Arg&) { + return add_space ? " {}" : "{}"; +} + +template ::type>::value)> +FMT_CONSTEXPR const char* format_str_quoted(bool add_space, const Arg&) { + return add_space ? " \"{}\"" : "\"{}\""; +} + +FMT_CONSTEXPR const char* format_str_quoted(bool add_space, const char*) { + return add_space ? " \"{}\"" : "\"{}\""; +} +FMT_CONSTEXPR const wchar_t* format_str_quoted(bool add_space, const wchar_t*) { + return add_space ? L" \"{}\"" : L"\"{}\""; +} + +FMT_CONSTEXPR const char* format_str_quoted(bool add_space, const char) { + return add_space ? " '{}'" : "'{}'"; +} +FMT_CONSTEXPR const wchar_t* format_str_quoted(bool add_space, const wchar_t) { + return add_space ? L" '{}'" : L"'{}'"; +} +} // namespace detail + +template struct is_tuple_like { + static FMT_CONSTEXPR_DECL const bool value = + detail::is_tuple_like_::value && !detail::is_range_::value; +}; + +template +struct formatter::value>> { + private: + // C++11 generic lambda for format() + template struct format_each { + template void operator()(const T& v) { + if (i > 0) { + if (formatting.add_prepostfix_space) { + *out++ = ' '; + } + out = detail::copy(formatting.delimiter, out); + } + out = format_to(out, + detail::format_str_quoted( + (formatting.add_delimiter_spaces && i > 0), v), + v); + ++i; + } + + formatting_tuple& formatting; + size_t& i; + typename std::add_lvalue_reference().out())>::type out; + }; + + public: + formatting_tuple formatting; + + template + FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) { + return formatting.parse(ctx); + } + + template + auto format(const TupleT& values, FormatContext& ctx) -> decltype(ctx.out()) { + auto out = ctx.out(); + size_t i = 0; + detail::copy(formatting.prefix, out); + + detail::for_each(values, format_each{formatting, i, out}); + if (formatting.add_prepostfix_space) { + *out++ = ' '; + } + detail::copy(formatting.postfix, out); + + return ctx.out(); + } +}; + +template struct is_range { + static FMT_CONSTEXPR_DECL const bool value = + detail::is_range_::value && !detail::is_like_std_string::value && + !std::is_convertible>::value && + !std::is_constructible, T>::value; +}; + +template +struct formatter< + T, Char, + enable_if_t::value +// Workaround a bug in MSVC 2017 and earlier. +#if !FMT_MSC_VER || FMT_MSC_VER >= 1927 + && + (has_formatter, format_context>::value || + detail::has_fallback_formatter, + format_context>::value) +#endif + >> { + formatting_range formatting; + + template + FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) { + return formatting.parse(ctx); + } + + template + typename FormatContext::iterator format(const T& values, FormatContext& ctx) { + auto out = detail::copy(formatting.prefix, ctx.out()); + size_t i = 0; + auto it = values.begin(); + auto end = values.end(); + for (; it != end; ++it) { + if (i > 0) { + if (formatting.add_prepostfix_space) *out++ = ' '; + out = detail::copy(formatting.delimiter, out); + } + out = format_to(out, + detail::format_str_quoted( + (formatting.add_delimiter_spaces && i > 0), *it), + *it); + if (++i > formatting.range_length_limit) { + out = format_to(out, " ... "); + break; + } + } + if (formatting.add_prepostfix_space) *out++ = ' '; + return detail::copy(formatting.postfix, out); + } +}; + +template struct tuple_arg_join : detail::view { + const std::tuple& tuple; + basic_string_view sep; + + tuple_arg_join(const std::tuple& t, basic_string_view s) + : tuple{t}, sep{s} {} +}; + +template +struct formatter, Char> { + template + FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) { + return ctx.begin(); + } + + template + typename FormatContext::iterator format( + const tuple_arg_join& value, FormatContext& ctx) { + return format(value, ctx, detail::make_index_sequence{}); + } + + private: + template + typename FormatContext::iterator format( + const tuple_arg_join& value, FormatContext& ctx, + detail::index_sequence) { + return format_args(value, ctx, std::get(value.tuple)...); + } + + template + typename FormatContext::iterator format_args( + const tuple_arg_join&, FormatContext& ctx) { + // NOTE: for compilers that support C++17, this empty function instantiation + // can be replaced with a constexpr branch in the variadic overload. + return ctx.out(); + } + + template + typename FormatContext::iterator format_args( + const tuple_arg_join& value, FormatContext& ctx, + const Arg& arg, const Args&... args) { + using base = formatter::type, Char>; + auto out = ctx.out(); + out = base{}.format(arg, ctx); + if (sizeof...(Args) > 0) { + out = std::copy(value.sep.begin(), value.sep.end(), out); + ctx.advance_to(out); + return format_args(value, ctx, args...); + } + return out; + } +}; + +/** + \rst + Returns an object that formats `tuple` with elements separated by `sep`. + + **Example**:: + + std::tuple t = {1, 'a'}; + fmt::print("{}", fmt::join(t, ", ")); + // Output: "1, a" + \endrst + */ +template +FMT_CONSTEXPR tuple_arg_join join(const std::tuple& tuple, + string_view sep) { + return {tuple, sep}; +} + +template +FMT_CONSTEXPR tuple_arg_join join(const std::tuple& tuple, + wstring_view sep) { + return {tuple, sep}; +} + +/** + \rst + Returns an object that formats `initializer_list` with elements separated by + `sep`. + + **Example**:: + + fmt::print("{}", fmt::join({1, 2, 3}, ", ")); + // Output: "1, 2, 3" + \endrst + */ +template +arg_join join(std::initializer_list list, + string_view sep) { + return join(std::begin(list), std::end(list), sep); +} + +template +arg_join join(std::initializer_list list, + wstring_view sep) { + return join(std::begin(list), std::end(list), sep); +} + +FMT_END_NAMESPACE + +#endif // FMT_RANGES_H_ -- cgit v1.2.3