diff options
-rw-r--r-- | libadhocutil/compileTimeFormatter.h | 18 | ||||
-rw-r--r-- | libadhocutil/unittests/testCompileTimeFormatter.cpp | 55 |
2 files changed, 64 insertions, 9 deletions
diff --git a/libadhocutil/compileTimeFormatter.h b/libadhocutil/compileTimeFormatter.h index c3837fe..46b7ec9 100644 --- a/libadhocutil/compileTimeFormatter.h +++ b/libadhocutil/compileTimeFormatter.h @@ -277,6 +277,24 @@ namespace AdHoc { #define AdHocFormatter(name, str) \ using name = LiteralFormatter<str> + template<const support::basic_fixed_string Str, typename ... Pn> + inline auto scprintf(const Pn & ... pn) + { + return FormatterDetail<Str, Str.size()>::get(pn...); + } + + template<const support::basic_fixed_string Str, typename stream, typename ... Pn> + inline auto & scprintf(stream & strm, const Pn & ... pn) + { + return FormatterDetail<Str, Str.size()>::write(strm, pn...); + } + + template<const support::basic_fixed_string Str, typename ... Pn> + inline auto & cprintf(const Pn & ... pn) + { + return scprintf<Str>(std::cout, pn...); + } + #else // Classic pre-C++20 implementation #include "unique.h" diff --git a/libadhocutil/unittests/testCompileTimeFormatter.cpp b/libadhocutil/unittests/testCompileTimeFormatter.cpp index 369b804..2109e01 100644 --- a/libadhocutil/unittests/testCompileTimeFormatter.cpp +++ b/libadhocutil/unittests/testCompileTimeFormatter.cpp @@ -446,15 +446,52 @@ BOOST_AUTO_TEST_CASE(smartptr) smartptr_fmt::get(shrd); } -// This tests scprintf macro, which in turn requires compiler support -#ifdef scprintf -BOOST_AUTO_TEST_CASE(scprintf) -{ - auto str = std::make_unique<std::stringstream>(); - auto & strret = scprintf(*str, "Some literal format string (%d, %c).", 0, 'f'); - BOOST_CHECK_EQUAL(str.get(), &strret); // We got back our original stream - BOOST_CHECK_EQUAL(str->str(), "Some literal format string (0, f)."); - scprintf(*str, "Some literal format string, no args."); +#ifdef __cpp_nontype_template_parameter_class +BOOST_AUTO_TEST_CASE(literal_format_string) +{ + std::stringstream str; + LiteralFormatter<"literal format string %?.">::write(str, 42); + BOOST_CHECK_EQUAL("literal format string 42.", str.str()); +} + +BOOST_AUTO_TEST_CASE(cprintf_args) +{ + auto & strret = cprintf<"Some literal format string (%d, %c).">(0, 'f'); + BOOST_CHECK_EQUAL(&std::cout, &strret); +} + +BOOST_AUTO_TEST_CASE(scprintf_strm_args) +{ + std::stringstream str; + auto & strret = scprintf<"Some literal format string (%d, %c).">(str, 0, 'f'); + BOOST_CHECK_EQUAL(&str, &strret); + BOOST_CHECK_EQUAL(str.str(), "Some literal format string (0, f)."); +} + +BOOST_AUTO_TEST_CASE(scprintf_get_args) +{ + auto stng = scprintf<"Some literal format string (%d, %c).">(0, 'f'); + BOOST_CHECK_EQUAL(stng, "Some literal format string (0, f)."); +} + +BOOST_AUTO_TEST_CASE(cprintf_no_args) +{ + auto & strret = cprintf<"Some literal format string.">(); + BOOST_CHECK_EQUAL(&std::cout, &strret); +} + +BOOST_AUTO_TEST_CASE(scprintf_strm_no_args) +{ + std::stringstream str; + auto & strret = scprintf<"Some literal format string.">(str); + BOOST_CHECK_EQUAL(&str, &strret); + BOOST_CHECK_EQUAL(str.str(), "Some literal format string."); +} + +BOOST_AUTO_TEST_CASE(scprintf_get_no_args) +{ + auto stng = scprintf<"Some literal format string.">(); + BOOST_CHECK_EQUAL(stng, "Some literal format string."); } #endif |