diff options
| author | Dan Goodliffe <dan@randomdan.homeip.net> | 2018-08-31 00:22:18 +0100 | 
|---|---|---|
| committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2018-08-31 00:22:18 +0100 | 
| commit | b5b53699d96ed1bcbb46120611af4740fea673f7 (patch) | |
| tree | a3f61c5760a1f9fd880ec314f486deec0ee62416 | |
| parent | Add constexpr functions for identifying char ranges (diff) | |
| download | libadhocutil-b5b53699d96ed1bcbb46120611af4740fea673f7.tar.bz2 libadhocutil-b5b53699d96ed1bcbb46120611af4740fea673f7.tar.xz libadhocutil-b5b53699d96ed1bcbb46120611af4740fea673f7.zip | |
Add basic support for setting the width/precision in the format string
| -rw-r--r-- | libadhocutil/detail/compileTimeFormatters.h | 37 | ||||
| -rw-r--r-- | libadhocutil/unittests/testCompileTimeFormatter.cpp | 7 | 
2 files changed, 44 insertions, 0 deletions
| diff --git a/libadhocutil/detail/compileTimeFormatters.h b/libadhocutil/detail/compileTimeFormatters.h index 8579f92..00ee852 100644 --- a/libadhocutil/detail/compileTimeFormatters.h +++ b/libadhocutil/detail/compileTimeFormatters.h @@ -4,6 +4,7 @@  #include "../compileTimeFormatter.h"  #include <boost/assert.hpp>  #include <iomanip> +#include <type_traits>  namespace AdHoc {  #define BASICCONV(PARAMTYPE, OP, ...) \ @@ -92,6 +93,42 @@ namespace AdHoc {  			StreamWriter::next(s, pn...);  		}  	}; + +	//// +	// Width/precision embedded in format string +	// Limitted to 3 digits at the moment +	template<const auto & S, auto L, auto pos, typename stream, auto n0, auto nn, auto ... sn> +	struct StreamWriter<S, L, pos, stream, typename std::enable_if<ispositivedigit(n0) && !isdigit(nn)>::type, '%', n0, nn, sn...> { +		template<typename ... Pn> +		static inline void write(stream & s, const Pn & ... pn) +		{ +			constexpr auto p = (n0 - '0'); +			s << std::setw(p) << std::setprecision(p); +			StreamWriter<S, L, pos + 1, stream, void, '%', nn, sn...>::write(s, pn...); +		} +	}; +	template<const auto & S, auto L, auto pos, typename stream, auto n0, auto n1, auto nn, auto ... sn> +	struct StreamWriter<S, L, pos, stream, typename std::enable_if<ispositivedigit(n0) && isdigit(n1) && !isdigit(nn)>::type, '%', n0, n1, nn, sn...> { +		template<typename ... Pn> +		static inline void write(stream & s, const Pn & ... pn) +		{ +			constexpr auto p = ((n0 - '0') * 10) + (n1 - '0'); +			s << std::setw(p) << std::setprecision(p); +			StreamWriter<S, L, pos + 2, stream, void, '%', nn, sn...>::write(s, pn...); +		} +	}; +	template<const auto & S, auto L, auto pos, typename stream, auto n0, auto n1, auto n2, auto nn, auto ... sn> +	struct StreamWriter<S, L, pos, stream, typename std::enable_if<ispositivedigit(n0) && isdigit(n1) && isdigit(n2) && !isdigit(nn)>::type, '%', n0, n1, n2, nn, sn...> { +		template<typename ... Pn> +		static inline void write(stream & s, const Pn & ... pn) +		{ +			constexpr auto p = ((n0 - '0') * 100) + ((n1 - '0') * 10) + (n2 - '0'); +			s << std::setw(p) << std::setprecision(p); +			StreamWriter<S, L, pos + 3, stream, void, '%', nn, sn...>::write(s, pn...); +		} +	}; +	//// +  	StreamWriterT('.', '*') {  		template<typename ... Pn>  		static inline void write(stream & s, int l, const Pn & ... pn) diff --git a/libadhocutil/unittests/testCompileTimeFormatter.cpp b/libadhocutil/unittests/testCompileTimeFormatter.cpp index 2b9a796..138d5dc 100644 --- a/libadhocutil/unittests/testCompileTimeFormatter.cpp +++ b/libadhocutil/unittests/testCompileTimeFormatter.cpp @@ -329,11 +329,18 @@ GLIBC_FMT_TEST(s2, "in %s %s.", "string", "other");  GLIBC_FMT_TEST(s3, "in %.*s.", 3, "other");  GLIBC_FMT_TEST(s4, "in %.*s.", 5, "other");  GLIBC_FMT_TEST(s5, "in %.*s.", 7, "other"); +GLIBC_FMT_TEST(s35, "in %3s.", "other"); +GLIBC_FMT_TEST(s55, "in %5s.", "other"); +GLIBC_FMT_TEST(s115, "in %11s.", "other");  GLIBC_FMT_TEST(c1, "in %c.", 'b');  GLIBC_FMT_TEST(c2, "in %c.", 'B');  GLIBC_FMT_TEST(d1, "in %d.", 123); +GLIBC_FMT_TEST(d01, "in %0d.", 123); +GLIBC_FMT_TEST(d051, "in %05d.", 123); +GLIBC_FMT_TEST(d0511, "in % 50d.", 123); +GLIBC_FMT_TEST(d05121, "in %0510d.", 123);  GLIBC_FMT_TEST(d2, "in %d.", 123456);  GLIBC_FMT_TEST(d3, "in %hd.", (int16_t)-12345);  GLIBC_FMT_TEST(d4, "in %hhd.", (int8_t)-123); | 
