basedOpinionated utility library |
git clone git://git.dimitrijedobrota.com/based.git |
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING |
commit | b2a856714ad1dec4785d944da60114131f4c7169 |
parent | 3b951dc1601fa334635f36eb093cdf1ec072de41 |
author | Dimitrije Dobrota < mail@dimitrijedobrota.com > |
date | Tue, 22 Apr 2025 21:06:18 +0200 |
string_literal with test
A | include/based/string.hpp | | | ++++++++++++++++++++++++ |
M | test/CMakeLists.txt | | | +++ |
A | test/source/string_literal_test.cpp | | | +++++++++++++++++++++++++++++++ |
3 files changed, 58 insertions(+), 0 deletions(-)
diff --git a/ include/based/string.hpp b/ include/based/string.hpp
@@ -0,0 +1,24 @@
#pragma once
#include <array>
#include <cstddef>
namespace based
{
template<std::size_t N>
struct string_literal
{
// NOLINTNEXTLINE *-explicit-constructor *-avoid-c-arrays
constexpr string_literal(const char (&str)[N])
: m_value(std::to_array(str))
{
}
constexpr std::size_t size() const { return N; }
constexpr const char* data() const { return m_value.data(); }
std::array<char, N> m_value;
};
} // namespace based
diff --git a/ test/CMakeLists.txt b/ test/CMakeLists.txt
@@ -58,6 +58,9 @@
add_test(find_if_unguarded_test)
# ---- List ----
add_test(list_test)
# ---- String ----
add_test(string_literal_test)
# ---- End-of-file commands ----
add_folders(Test)
diff --git a/ test/source/string_literal_test.cpp b/ test/source/string_literal_test.cpp
@@ -0,0 +1,31 @@
#include "based/string.hpp"
#include <catch2/catch_test_macros.hpp>
TEST_CASE("empty", "[string/string_literal]")
{
const based::string_literal sltr = "";
REQUIRE(sltr.size() == 1);
REQUIRE(std::memcmp(sltr.data(), "", sltr.size()) == 0);
}
TEST_CASE("nonempty", "[string/string_literal]")
{
const based::string_literal sltr = "nonempty";
REQUIRE(sltr.size() == 9);
REQUIRE(std::memcmp(sltr.data(), "nonempty", sltr.size()) == 0);
}
TEST_CASE("template", "[string/string_literal]")
{
const auto data = []<based::string_literal L>() { return L.data(); };
const auto size = []<based::string_literal L>() { return L.size(); };
REQUIRE(size.operator()<"">() == 1);
REQUIRE(size.operator()<"nonempty">() == 9);
REQUIRE(std::memcmp(data.operator()<"">(), "", 1) == 0);
REQUIRE(std::memcmp(data.operator()<"nonempty">(), "nonempty", 9) == 0);
}