From e30ab84ccc8ad19e181f08c38e96a15bcb5e9c98 Mon Sep 17 00:00:00 2001 From: mutouyun Date: Tue, 7 Jan 2025 17:37:58 +0800 Subject: [PATCH] Added fmt support for `byte` --- include/libipc/imp/byte.h | 15 +++++++++++++++ test/imp/test_imp_fmt.cpp | 20 ++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/include/libipc/imp/byte.h b/include/libipc/imp/byte.h index 69da411..dec5369 100644 --- a/include/libipc/imp/byte.h +++ b/include/libipc/imp/byte.h @@ -11,6 +11,7 @@ #include "libipc/imp/detect_plat.h" #include "libipc/imp/span.h" +#include "libipc/imp/fmt.h" #if defined(LIBIPC_CPP_17) && defined(__cpp_lib_byte) #define LIBIPC_CPP_LIB_BYTE_ @@ -160,4 +161,18 @@ auto as_bytes(span s) noexcept -> span { return {byte_cast(s.data()), s.size_bytes()}; } +/// \brief Custom defined fmt_to method for imp::fmt +namespace detail_tag_invoke { + +inline bool tag_invoke(decltype(ipc::fmt_to), fmt_context &ctx, ipc::byte b) { + return ipc::to_string(ctx, static_cast(b), "02x"); +} + +template , ipc::byte>::value>> +bool tag_invoke(decltype(ipc::fmt_to), fmt_context &ctx, fmt_ref arg) noexcept { + return ipc::to_string(ctx, static_cast(arg.param), arg.fstr); +} + +} // namespace detail_tag_invoke } // namespace ipc diff --git a/test/imp/test_imp_fmt.cpp b/test/imp/test_imp_fmt.cpp index 04acd6d..be9eb15 100644 --- a/test/imp/test_imp_fmt.cpp +++ b/test/imp/test_imp_fmt.cpp @@ -6,6 +6,8 @@ #include "test.h" #include "libipc/imp/fmt.h" +#include "libipc/imp/byte.h" +#include "libipc/imp/span.h" TEST(fmt, spec) { EXPECT_STREQ(ipc::spec("hello")(123).fstr.data(), "hello"); @@ -123,3 +125,21 @@ bool tag_invoke(decltype(ipc::fmt_to), ipc::fmt_context &, foo arg) noexcept(fal TEST(fmt, throw) { EXPECT_THROW(std::ignore = ipc::fmt(foo{}), foo); } + +TEST(fmt, byte) { + { + ipc::byte b1{}, b2(31); + EXPECT_EQ(ipc::fmt(b1), "00"); + EXPECT_EQ(ipc::fmt(b2), "1f"); + EXPECT_EQ(ipc::fmt(ipc::spec("03X")(b2)), "01F"); + } + { + ipc::byte bs[] {31, 32, 33, 34, 35, 36, 37, 38}; + EXPECT_EQ(ipc::fmt(ipc::make_span(bs)), "1f 20 21 22 23 24 25 26"); + } +} + +TEST(fmt, span) { + EXPECT_EQ(ipc::fmt(ipc::span{}), ""); + EXPECT_EQ(ipc::fmt(ipc::make_span({1, 3, 2, 4, 5, 6, 7})), "1 3 2 4 5 6 7"); +}