str/cexpr: Add a function to make a constexpr generated string
This allows the user to generate an arbitrary length string at compile
time and convert it automatically to an std::array that is embedded in
the program for zero overhead runtime strings.
Change-Id: Ib6c2dd20cac53bb55e7a32e2fca194bdf0e06211
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/test/str/cexpr.cpp b/test/str/cexpr.cpp
new file mode 100644
index 0000000..557591c
--- /dev/null
+++ b/test/str/cexpr.cpp
@@ -0,0 +1,44 @@
+#include <stdplus/str/cexpr.hpp>
+#include <stdplus/zstring_view.hpp>
+
+#include <string>
+#include <string_view>
+
+#include <gtest/gtest.h>
+
+using namespace std::string_view_literals;
+using namespace std::string_literals;
+
+namespace stdplus
+{
+
+TEST(Constexpr, SvFromSv)
+{
+ EXPECT_EQ((std::array{'a', 'b', 'c', '\0'}),
+ (cexprStrArr<[]() { return "abc"sv; }, true>));
+ EXPECT_EQ((std::array{'a', 'b', 'c'}),
+ (cexprStrArr<[]() { return "abc"sv; }, false>));
+ EXPECT_EQ("abc"sv, cexprZsv<[]() { return "abc"sv; }>);
+ EXPECT_EQ("abc"sv, cexprSv<[]() { return "abc"sv; }>);
+}
+
+TEST(Constexpr, SvFromSmallStr)
+{
+ EXPECT_EQ((std::array{'a', 'b', 'c', '\0'}),
+ (cexprStrArr<[]() { return "abc"s; }, true>));
+ EXPECT_EQ((std::array{'a', 'b', 'c'}),
+ (cexprStrArr<[]() { return "abc"s; }, false>));
+ EXPECT_EQ("abc"sv, cexprSv<[]() { return "abc"s; }>);
+ EXPECT_EQ("abc"sv, cexprZsv<[]() { return "abc"s; }>);
+}
+
+TEST(Constexpr, SvFromAllocStr)
+{
+ constexpr auto cb = []() {
+ return "abcdefg"s.append("hijklmnopqrstuvwxyz"sv);
+ };
+ EXPECT_EQ("abcdefghijklmnopqrstuvwxyz"sv, cexprSv<cb>);
+ EXPECT_EQ("abcdefghijklmnopqrstuvwxyz"sv, cexprZsv<cb>);
+}
+
+} // namespace stdplus