diff options
| author | Dan Goodliffe <dan@randomdan.homeip.net> | 2018-08-20 21:47:45 +0100 | 
|---|---|---|
| committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2018-08-20 21:51:32 +0100 | 
| commit | bc77811cca8fb7634f45e1432d7eff571964c47f (patch) | |
| tree | 9dd008c399cedc91ff68654774a727476f4b6d53 | |
| parent | Only GCC supports -flto=N (diff) | |
| download | libadhocutil-bc77811cca8fb7634f45e1432d7eff571964c47f.tar.bz2 libadhocutil-bc77811cca8fb7634f45e1432d7eff571964c47f.tar.xz libadhocutil-bc77811cca8fb7634f45e1432d7eff571964c47f.zip  | |
Add the scprintf macro
Clang/LLVM only macro which allows a more pure use of CTF with everything
inline. e.g. scprintf(str, "Number = %d", n)
| -rw-r--r-- | libadhocutil/compileTimeFormatter.h | 10 | ||||
| -rw-r--r-- | libadhocutil/unittests/testCompileTimeFormatter.cpp | 11 | 
2 files changed, 21 insertions, 0 deletions
diff --git a/libadhocutil/compileTimeFormatter.h b/libadhocutil/compileTimeFormatter.h index 0551f62..4fcb1cb 100644 --- a/libadhocutil/compileTimeFormatter.h +++ b/libadhocutil/compileTimeFormatter.h @@ -176,5 +176,15 @@ namespace AdHoc {  #define AdHocFormatter(name, str) \  	AdHocFormatterTypedef(name, str, MAKE_UNIQUE(name)) +// As far as I know, only clang/llvm version 5+ can compile this +// so long as std=c++17 +#if __clang_major__ >= 5 && __cplusplus >= 201703 +#define scprintf(strm, fmt, ...) \ +	([&strm]() -> decltype(strm) & { \ +		static constexpr const char * const __FMT = fmt; \ +		return ::AdHoc::Formatter<__FMT>::write(strm, __VA_ARGS__); \ +	}()) +#endif +  #endif diff --git a/libadhocutil/unittests/testCompileTimeFormatter.cpp b/libadhocutil/unittests/testCompileTimeFormatter.cpp index 2870993..2b9a796 100644 --- a/libadhocutil/unittests/testCompileTimeFormatter.cpp +++ b/libadhocutil/unittests/testCompileTimeFormatter.cpp @@ -413,3 +413,14 @@ 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) +{ +	std::stringstream str; +	auto & strret = scprintf(str, "Some literal format string (%d, %c).", 0, 'f'); +	BOOST_CHECK_EQUAL(&str, &strret); // We got back our original stream +	BOOST_CHECK_EQUAL(str.str(), "Some literal format string (0, f)."); +} +#endif +  | 
