MCPcopy Create free account
hub / github.com/andreasfertig/programming-with-cpp20 / string

Class string

12.19-constevalParmCheck1/main.cpp:12–89  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

10
11#if not(__cpp_lib_constexpr_string > 201911)
12class string {
13public:
14 constexpr string() = default;
15 constexpr string(const char& c) { append(&c, 1); }
16 constexpr string(const string& s) { append(s.data(), s.size()); }
17 constexpr string& operator=(const string& s)
18 {
19 reset();
20 append(s.data(), s.size());
21 return *this;
22 }
23
24 constexpr string(string&& s) noexcept
25 : _data{std::exchange(s._data, nullptr)}
26 , _length{s._length}
27 {}
28
29 constexpr string& operator=(string&& s) noexcept
30 {
31 std::exchange(_data, s._data);
32 _length = s._length;
33 return *this;
34 }
35
36 // a regular std::string is convertible to a string_view or better
37 // there is a string_view ctor for a std::string. Make that work
38 constexpr operator std::string_view() const noexcept
39 {
40 return {_data, _length};
41 }
42
43 constexpr string(std::string_view d) { append(d.data(), d.size()); }
44 constexpr ~string() noexcept { reset(); }
45
46 constexpr string& append(std::string_view d)
47 {
48 return append(d.data(), d.size());
49 }
50 constexpr string& append(const string& s)
51 {
52 return append(s.data(), s.size());
53 }
54 constexpr string& append(const char* d, std::size_t len)
55 {
56 const std::size_t needNt{(len && (d[len - 1] != '\0')) ? 1u : 0u};
57
58 char* tmp = new char[_length + len + needNt]{};
59 std::copy_n(_data, _length, tmp);
60 std::copy_n(d, len, tmp + _length);
61 _length += len;
62
63 delete[] _data;
64
65 _data = tmp;
66
67 return *this;
68 }
69

Callers

nothing calls this directly

Calls 2

dataMethod · 0.80
sizeMethod · 0.80

Tested by

no test coverage detected