From 2d9d4e7a5c19059fc6cfb55a97e46582f4ae9633 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 16 Jun 2018 20:31:40 +0100 Subject: Add template string utils --- libadhocutil/compileTimeFormatter.h | 27 ++++++++++++++++ .../unittests/testCompileTimeFormatter.cpp | 37 ++++++++++++++++++++++ libadhocutil/uriParse.cpp | 2 +- 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/libadhocutil/compileTimeFormatter.h b/libadhocutil/compileTimeFormatter.h index 6e85f8e..d55012e 100644 --- a/libadhocutil/compileTimeFormatter.h +++ b/libadhocutil/compileTimeFormatter.h @@ -7,6 +7,33 @@ #include "unique.h" namespace AdHoc { + // Template string utils + template + static constexpr auto strlen() + { + auto off = 0; + while (S[off]) { ++off; } + return off; + } + + template()> + static constexpr int strchr() + { + static_assert(start <= L); + decltype(start) off = start; + while (off < L && S[off] != n) { ++off; } + if (off == L) return -1; + return off; + } + + template()> + static constexpr decltype(L) strchrnul() + { + decltype(start) off = start; + while (off < L && S[off] != n) { ++off; } + return off; + } + /// @cond inline constexpr int WRAP_AT = 120; diff --git a/libadhocutil/unittests/testCompileTimeFormatter.cpp b/libadhocutil/unittests/testCompileTimeFormatter.cpp index cb49bd2..59d63d0 100644 --- a/libadhocutil/unittests/testCompileTimeFormatter.cpp +++ b/libadhocutil/unittests/testCompileTimeFormatter.cpp @@ -73,6 +73,43 @@ namespace AdHoc { }; } +// Compile string util assertions +static_assert(strlen() == 0); +static_assert(strlen() == 1); +static_assert(strlen() == 2); +static_assert(strlen() == 7); +static_assert(strlen() == 246); + +static_assert(strchr() == -1); +static_assert(strchr() == -1); +static_assert(strchr() == 0); +static_assert(strchr() == 0); +static_assert(strchr() == 1); +static_assert(strchr() == 3); +static_assert(strchr() == -1); +static_assert(strchr() == 3); +static_assert(strchr() == -1); +static_assert(strchr() == -1); + +static_assert(strchrnul() == 0); +static_assert(strchrnul() == 1); +static_assert(strchrnul() == 0); +static_assert(strchrnul() == 0); +static_assert(strchrnul() == 1); +static_assert(strchrnul() == 3); +static_assert(strchrnul() == 7); +static_assert(strchrnul() == 3); +static_assert(strchrnul() == 7); +static_assert(strchrnul() == 7); + +static_assert(strchrnul() == 0); +static_assert(strchrnul() == 1); +static_assert(strchrnul() == 0); +static_assert(strchrnul() == 0); +static_assert(strchrnul() == 1); +static_assert(strchrnul() == 3); +static_assert(strchrnul() == 7); + BOOST_FIXTURE_TEST_SUITE( TestStreamWrite, std::stringstream ) BOOST_AUTO_TEST_CASE ( empty ) diff --git a/libadhocutil/uriParse.cpp b/libadhocutil/uriParse.cpp index 4d41937..c42f133 100644 --- a/libadhocutil/uriParse.cpp +++ b/libadhocutil/uriParse.cpp @@ -19,7 +19,7 @@ namespace AdHoc { curstr = uri.c_str(); - const char * tmpstr = strchr(curstr, ':'); + const char * tmpstr = ::strchr(curstr, ':'); if (!tmpstr) { throw InvalidUri("Schema marker not found", uri); } -- cgit v1.2.3