based

Opinionated 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

Diffstat:
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);
}