nothrow variants for strings format

This commit is contained in:
2018-10-06 19:39:24 +07:00
parent b974ad139f
commit b2c4489592
3 changed files with 51 additions and 1 deletions

View File

@@ -51,7 +51,18 @@ namespace e2d
str_view fmt, Args&&... args); str_view fmt, Args&&... args);
template < typename... Args > template < typename... Args >
str rformat(str_view fmt, Args&&... args); bool format_nothrow(
char* dst, std::size_t dst_size, std::size_t* length,
str_view fmt, Args&&... args) noexcept;
template < typename... Args >
str rformat(
str_view fmt, Args&&... args);
template < typename... Args >
bool rformat_nothrow(
str& dst,
str_view fmt, Args&&... args) noexcept;
bool wildcard_match(str_view string, str_view pattern); bool wildcard_match(str_view string, str_view pattern);
} }

View File

@@ -385,6 +385,23 @@ namespace e2d { namespace strings
std::make_tuple(impl::wrap_arg(std::forward<Args>(args))...)); std::make_tuple(impl::wrap_arg(std::forward<Args>(args))...));
} }
template < typename... Args >
bool format_nothrow(
char* dst, std::size_t dst_size, std::size_t* length,
str_view fmt, Args&&... args) noexcept
{
try {
std::size_t result = format(
dst, dst_size, fmt, std::forward<Args>(args)...);
if ( length ) {
*length = result;
}
return true;
} catch (...) {
return false;
}
}
template < typename... Args > template < typename... Args >
str rformat(str_view fmt, Args&&... args) { str rformat(str_view fmt, Args&&... args) {
auto targs = std::make_tuple( auto targs = std::make_tuple(
@@ -397,6 +414,16 @@ namespace e2d { namespace strings
E2D_ASSERT(expected_format_size == actual_format_size); E2D_ASSERT(expected_format_size == actual_format_size);
return str(buffer.data(), buffer.data() + actual_format_size); return str(buffer.data(), buffer.data() + actual_format_size);
} }
template < typename... Args >
bool rformat_nothrow(str& dst, str_view fmt, Args&&... args) noexcept {
try {
dst = rformat(fmt, std::forward<Args>(args)...);
return true;
} catch (...) {
return false;
}
}
}} }}
#endif #endif

View File

@@ -250,6 +250,18 @@ TEST_CASE("strings") {
REQUIRE_THROWS_AS(strings::rformat("hell%y%"), strings::bad_format); REQUIRE_THROWS_AS(strings::rformat("hell%y%"), strings::bad_format);
REQUIRE_THROWS_AS(strings::rformat("%z%hell"), strings::bad_format); REQUIRE_THROWS_AS(strings::rformat("%z%hell"), strings::bad_format);
} }
{
str s;
REQUIRE(strings::rformat_nothrow(s, "%0", "hello"));
REQUIRE(s == "hello");
REQUIRE_FALSE(strings::rformat_nothrow(s, "%"));
char buf[5] = {0};
std::size_t length = 0;
REQUIRE(strings::format_nothrow(buf, E2D_COUNTOF(buf), &length, "%0", "hell"));
REQUIRE(length == 4);
REQUIRE(str(buf) == str("hell"));
REQUIRE_FALSE(strings::format_nothrow(buf, E2D_COUNTOF(buf), &length, "%0", "hello"));
}
{ {
REQUIRE(strings::rformat(str_view("%0"), 42) == "42"); REQUIRE(strings::rformat(str_view("%0"), 42) == "42");
REQUIRE(strings::rformat(str_view("%0%1",2), 42) == "42"); REQUIRE(strings::rformat(str_view("%0%1",2), 42) == "42");