Skip to content

Commit

Permalink
AK+Userland: Introduce ByteString::create_and_overwrite
Browse files Browse the repository at this point in the history
And replace two users of raw StringImpl with it.
  • Loading branch information
DanShaders authored and ADKaster committed Feb 24, 2024
1 parent f7c952f commit 061f902
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 12 deletions.
17 changes: 17 additions & 0 deletions AK/ByteString.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,23 @@ class ByteString {
static ByteString must_from_utf8(StringView string) { return MUST(from_utf8(string)); }
static ByteString from_utf8_without_validation(StringView string) { return ByteString { string }; }

template<
typename F,
typename PossiblyErrorOr = decltype(declval<F>()(declval<Bytes>())),
bool is_error_or = IsSpecializationOf<PossiblyErrorOr, ErrorOr>,
typename ReturnType = Conditional<is_error_or, ErrorOr<ByteString>, ByteString>>
static ReturnType create_and_overwrite(size_t length, F&& fill_function)
{
char* buffer;
auto impl = StringImpl::create_uninitialized(length, buffer);

if constexpr (is_error_or)
TRY(fill_function(Bytes { buffer, length }));
else
fill_function(Bytes { buffer, length });
return impl;
}

[[nodiscard]] static ByteString repeated(char, size_t count);
[[nodiscard]] static ByteString repeated(StringView, size_t count);

Expand Down
12 changes: 7 additions & 5 deletions Userland/Libraries/LibC/netdb.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -394,19 +394,21 @@ hostent* gethostbyaddr(void const* addr, socklen_t addr_size, int type)
return nullptr;
}

char* buffer;
auto string_impl = StringImpl::create_uninitialized(response_header.name_length, buffer);
ssize_t nreceived;

if (auto nreceived = read(fd, buffer, response_header.name_length); nreceived < 0) {
gethostbyaddr_name_buffer = ByteString::create_and_overwrite(response_header.name_length, [&](Bytes bytes) {
nreceived = read(fd, bytes.data(), bytes.size());
});

if (nreceived < 0) {
h_errno = TRY_AGAIN;
return nullptr;
} else if (static_cast<u32>(nreceived) != response_header.name_length) {
h_errno = NO_RECOVERY;
return nullptr;
}

gethostbyaddr_name_buffer = move(string_impl);
__gethostbyaddr_buffer.h_name = buffer;
__gethostbyaddr_buffer.h_name = const_cast<char*>(gethostbyaddr_name_buffer.characters());
__gethostbyaddr_alias_list_buffer[0] = nullptr;
__gethostbyaddr_buffer.h_aliases = __gethostbyaddr_alias_list_buffer;
__gethostbyaddr_buffer.h_addrtype = AF_INET;
Expand Down
11 changes: 4 additions & 7 deletions Userland/Libraries/LibIPC/Decoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,10 @@ ErrorOr<ByteString> decode(Decoder& decoder)
if (length == 0)
return ByteString::empty();

char* text_buffer = nullptr;
auto text_impl = StringImpl::create_uninitialized(length, text_buffer);

Bytes bytes { text_buffer, length };
TRY(decoder.decode_into(bytes));

return ByteString { *text_impl };
return ByteString::create_and_overwrite(length, [&](Bytes bytes) -> ErrorOr<void> {
TRY(decoder.decode_into(bytes));
return {};
});
}

template<>
Expand Down

0 comments on commit 061f902

Please sign in to comment.