diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2016-12-09 18:49:24 +0000 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2016-12-09 18:49:24 +0000 |
commit | 4a7e3121e15dede49c8ae7704c579bc979464da7 (patch) | |
tree | 4447a5d04bf4ea9e47837fcc24b6505aab7b480f | |
parent | Macro helper for easily adding new formatters (diff) | |
download | libadhocutil-4a7e3121e15dede49c8ae7704c579bc979464da7.tar.bz2 libadhocutil-4a7e3121e15dede49c8ae7704c579bc979464da7.tar.xz libadhocutil-4a7e3121e15dede49c8ae7704c579bc979464da7.zip |
Macro helper for easily adding new formatters that take a single character parameter from the format string
-rw-r--r-- | libadhocutil/compileTimeFormatter.h | 5 | ||||
-rw-r--r-- | libadhocutil/unittests/testCompileTimeFormatter.cpp | 31 |
2 files changed, 34 insertions, 2 deletions
diff --git a/libadhocutil/compileTimeFormatter.h b/libadhocutil/compileTimeFormatter.h index 501e0a7..034a65d 100644 --- a/libadhocutil/compileTimeFormatter.h +++ b/libadhocutil/compileTimeFormatter.h @@ -84,6 +84,11 @@ namespace AdHoc { struct StreamWriter<S, start, stream, '%', C, sn...> : \ public StreamWriterBase<S, start, BOOST_PP_VARIADIC_SIZE(C) + 1, stream, sn...> +#define StreamWriterTP(P, C...) \ + template<const char * const & S, int start, typename stream, char P, char ... sn> \ + struct StreamWriter<S, start, stream, '%', C, sn...> : \ + public StreamWriterBase<S, start, BOOST_PP_VARIADIC_SIZE(C) + 1, stream, sn...> + // Default stream writer formatter StreamWriterT('?') { template<typename P, typename ... Pn> diff --git a/libadhocutil/unittests/testCompileTimeFormatter.cpp b/libadhocutil/unittests/testCompileTimeFormatter.cpp index 7ecd50e..9b678ec 100644 --- a/libadhocutil/unittests/testCompileTimeFormatter.cpp +++ b/libadhocutil/unittests/testCompileTimeFormatter.cpp @@ -12,11 +12,12 @@ extern constexpr const char * formatEdgeCaseSingle = "1"; extern constexpr const char * formatEdgeCaseFormatStart = "%? after"; extern constexpr const char * formatEdgeCaseFormatEnd = "before %?"; extern constexpr const char * formatEdgeCaseFormatLonely = "%?"; - extern constexpr const char * formatStringLiteral = "literal"; extern constexpr const char * formatStringSingle = "single %?."; extern constexpr const char * formatStringMulti = "First %?, then %?."; extern constexpr const char * formatStringCustom = "custom %()"; +extern constexpr const char * formatStringCustomParam1 = "custom %(\x3)"; +extern constexpr const char * formatStringCustomParam2 = "custom %(\x9)"; extern constexpr const char * formatStringCustomLong = "custom %(longname)"; extern constexpr const char * formatStringLong = " "; extern constexpr const char * formatStringMultiArg = "value%ra"; @@ -26,7 +27,8 @@ extern constexpr const char * formatStringEscape3 = "literal %%%? percentage."; extern constexpr const char * formatStringEscape4 = "literal %%%?%% percentage."; namespace AdHoc { - // Custom stream writer formatter, formats as (bracketed expression) + // Custom stream writer formatter, formats as + // -( bracketed expression )- StreamWriterT('(', ')') { template<typename P, typename ... Pn> static void write(stream & s, const P & p, const Pn & ... pn) @@ -35,6 +37,8 @@ namespace AdHoc { StreamWriter::next(s, pn...); } }; + // Custom stream writer formatter with a long identifier, formats as + // ---( bracketed expression )--- StreamWriterT('(', 'l', 'o', 'n', 'g', 'n', 'a', 'm', 'e', ')') { template<typename P, typename ... Pn> static void write(stream & s, const P & p, const Pn & ... pn) @@ -43,6 +47,17 @@ namespace AdHoc { StreamWriter::next(s, pn...); } }; + // Custom stream writer formatter that has parameter in the format string, formats as + // dashes*-( bracketed expression )dashes*- + StreamWriterTP(dashes, '(', dashes, ')') { + template<typename P, typename ... Pn> + static void write(stream & s, const P & p, const Pn & ... pn) + { + std::string d(dashes, '-'); + s << d << "( " << p << " )" << d; + StreamWriter::next(s, pn...); + } + }; // Custom stream writer formatter, formats // right-aligned by given width StreamWriterT('r', 'a') { @@ -157,6 +172,18 @@ BOOST_AUTO_TEST_CASE ( customLongName ) BOOST_REQUIRE_EQUAL(this->str(), "custom ---( some text here )---"); } +BOOST_AUTO_TEST_CASE ( customParam1 ) +{ + Formatter<formatStringCustomParam1>::write(*this, "some text here"); + BOOST_REQUIRE_EQUAL(this->str(), "custom ---( some text here )---"); +} + +BOOST_AUTO_TEST_CASE ( customParam2 ) +{ + Formatter<formatStringCustomParam2>::write(*this, "some text here"); + BOOST_REQUIRE_EQUAL(this->str(), "custom ---------( some text here )---------"); +} + typedef Formatter<formatStringCustom> TestFormat; BOOST_AUTO_TEST_CASE ( typedefFormat ) { |