Files
Cpp-in-Embedded-Systems/Chapter17/cib/libs/sc/lazy_string_format.hpp
Amar Mahmutbegovic 526e6ec009 rename chapters
2025-02-09 13:11:21 +01:00

57 lines
2.0 KiB
C++

#pragma once
#include <sc/fwd.hpp>
#include <stdx/tuple_algorithms.hpp>
namespace sc {
template <typename StringConstant, typename ArgTuple>
struct lazy_string_format {
constexpr static StringConstant str{};
ArgTuple args{};
constexpr lazy_string_format() = default;
constexpr lazy_string_format(StringConstant, ArgTuple newArgs)
: args{newArgs} {}
template <typename F> constexpr auto apply(F &&f) const {
return args.apply(
[&](auto const &...as) { return std::forward<F>(f)(str, as...); });
}
};
template <class CharT, CharT... charsLhs, typename ArgsTupleLhs,
CharT... charsRhs, typename ArgsTupleRhs>
[[nodiscard]] constexpr auto operator==(
lazy_string_format<string_constant<CharT, charsLhs...>, ArgsTupleLhs> lhs,
lazy_string_format<string_constant<CharT, charsRhs...>, ArgsTupleRhs>
rhs) noexcept -> bool {
return (lhs.str == rhs.str) && (lhs.args == rhs.args);
}
template <typename StringConstantLhs, typename TupleArgsLhs,
typename StringConstantRhs, typename TupleArgsRhs>
[[nodiscard]] constexpr auto
operator+(lazy_string_format<StringConstantLhs, TupleArgsLhs> lhs,
lazy_string_format<StringConstantRhs, TupleArgsRhs> rhs) noexcept {
return lazy_string_format{lhs.str + rhs.str,
stdx::tuple_cat(lhs.args, rhs.args)};
}
template <typename StringConstantLhs, typename TupleArgsLhs, typename CharT,
CharT... chars>
[[nodiscard]] constexpr auto
operator+(lazy_string_format<StringConstantLhs, TupleArgsLhs> lhs,
string_constant<CharT, chars...> rhs) noexcept {
return lazy_string_format{lhs.str + rhs, lhs.args};
}
template <typename CharT, CharT... chars, typename StringConstantRhs,
typename TupleArgsRhs>
[[nodiscard]] constexpr auto
operator+(string_constant<CharT, chars...> lhs,
lazy_string_format<StringConstantRhs, TupleArgsRhs> rhs) noexcept {
return lazy_string_format{lhs + rhs.str, rhs.args};
}
} // namespace sc