24#include "pw_assert/assert.h"
25#include "pw_polyfill/language_feature_macros.h"
26#include "pw_result/result.h"
27#include "pw_span/span.h"
28#include "pw_status/status.h"
29#include "pw_status/status_with_size.h"
30#include "pw_string/internal/length.h"
37PW_CONSTEXPR_CPP20
inline StatusWithSize CopyToSpan(std::string_view source,
40 return StatusWithSize::ResourceExhausted();
43 const size_t copied = source.copy(dest.data(), dest.size() - 1);
46 return StatusWithSize(
47 copied == source.size() ?
OkStatus() : Status::ResourceExhausted(),
59 return std::string_view(str.data(),
60 internal::ClampedLength(str.data(), str.size()));
63constexpr std::string_view ClampedCString(
const char* str,
size_t max_len) {
64 return ClampedCString(span<const char>(str, max_len));
86 PW_DASSERT(str.data() !=
nullptr);
88 const size_t length = internal::ClampedLength(str.data(), str.size());
89 if (length == str.size()) {
90 return Status::OutOfRange();
96constexpr Result<size_t> NullTerminatedLength(
const char* str,
size_t max_len) {
97 return NullTerminatedLength(span<const char>(str, max_len));
119template <
typename Span>
123 !std::is_base_of_v<InlineString<>, std::decay_t<Span>>,
124 "Do not use pw::string::Copy() with pw::InlineString<>. Instead, use "
125 "pw::InlineString<>'s assignment operator or assign() function, or "
126 "pw::string::Append().");
127 return internal::CopyToSpan(source, std::forward<Span>(dest));
130template <
typename Span>
131PW_CONSTEXPR_CPP20
inline StatusWithSize Copy(
const char* source, Span&& dest) {
132 PW_DASSERT(source !=
nullptr);
133 return Copy(ClampedCString(source, std::size(dest)),
134 std::forward<Span>(dest));
137PW_CONSTEXPR_CPP20
inline StatusWithSize Copy(
const char* source,
140 return Copy(source, span<char>(dest, num));
159 const size_t chars_copied =
160 std::min(view.size(),
static_cast<size_t>(
string.capacity()));
161 string.assign(view, 0,
static_cast<string_impl::size_type
>(chars_copied));
162 return chars_copied == view.size() ?
OkStatus() : Status::ResourceExhausted();
166 PW_DASSERT(c_string !=
nullptr);
168 return Assign(
string, ClampedCString(c_string,
string.capacity() + 1));
186 const size_t chars_copied = std::min(
187 view.size(),
static_cast<size_t>(
string.capacity() -
string.size()));
188 string.append(view, 0,
static_cast<string_impl::size_type
>(chars_copied));
189 return chars_copied == view.size() ?
OkStatus() : Status::ResourceExhausted();
193 PW_DASSERT(c_string !=
nullptr);
195 return Append(
string, ClampedCString(c_string,
string.capacity() + 1));
206 for (
size_t i = 0; i < copy_result.
size(); i++) {
207 dest[i] = std::isprint(dest[i]) ? dest[i] :
'.';
pw::InlineBasicString is a fixed-capacity version of std::basic_string. In brief:
Definition: string.h:64
Definition: status_with_size.h:49
constexpr size_t size() const
Definition: status_with_size.h:146
Provides basic helpers for reading and writing UTF-8 encoded strings.
Definition: alignment.h:27
constexpr Status OkStatus()
Definition: status.h:234
pw::InlineBasicString and pw::InlineString are safer alternatives to std::basic_string and std::strin...
Status Append(InlineString<> &string, std::string_view view)
Definition: util.h:185
StatusWithSize Copy(std::string_view source, Span &&dest)
pw::string::Copy is a safer alternative to std::strncpy as it always null-terminates whenever the des...
Definition: util.h:120
Status Assign(InlineString<> &string, std::string_view view)
Definition: util.h:158
constexpr std::string_view ClampedCString(span< const char > str)
Safe alternative to the string_view constructor that avoids the risk of an unbounded implicit or expl...
Definition: util.h:58
StatusWithSize PrintableCopy(std::string_view source, span< char > dest)
Provides a safe, printable copy of a string.
Definition: util.h:203
constexpr Result< size_t > NullTerminatedLength(span< const char > str)
pw::string::NullTerminatedLength is a safer alternative to strlen for calculating the null-terminated...
Definition: util.h:85