Commit cd31e875 authored by Dan Shiovitz's avatar Dan Shiovitz Committed by Facebook Github Bot

Add support for comparing/hashing IOBuf pointers

Summary: Seems reasonable to overload IOBufHash/Compare to support pointers, since they already take unique_ptrs.

Reviewed By: yfeldblum

Differential Revision: D12963089

fbshipit-source-id: 85124939cef7a18bfd02aeff392732fb93691903
parent b1d8ae68
...@@ -1510,6 +1510,9 @@ class IOBuf { ...@@ -1510,6 +1510,9 @@ class IOBuf {
struct IOBufHash { struct IOBufHash {
size_t operator()(const IOBuf& buf) const noexcept; size_t operator()(const IOBuf& buf) const noexcept;
size_t operator()(const std::unique_ptr<IOBuf>& buf) const noexcept { size_t operator()(const std::unique_ptr<IOBuf>& buf) const noexcept {
return operator()(buf.get());
}
size_t operator()(const IOBuf* buf) const noexcept {
return buf ? (*this)(*buf) : 0; return buf ? (*this)(*buf) : 0;
} }
}; };
...@@ -1524,6 +1527,9 @@ struct IOBufCompare { ...@@ -1524,6 +1527,9 @@ struct IOBufCompare {
ordering operator()( ordering operator()(
const std::unique_ptr<IOBuf>& a, const std::unique_ptr<IOBuf>& a,
const std::unique_ptr<IOBuf>& b) const { const std::unique_ptr<IOBuf>& b) const {
return operator()(a.get(), b.get());
}
ordering operator()(const IOBuf* a, const IOBuf* b) const {
// clang-format off // clang-format off
return return
!a && !b ? ordering::eq : !a && !b ? ordering::eq :
......
...@@ -1120,40 +1120,54 @@ TEST(IOBuf, HashAndEqual) { ...@@ -1120,40 +1120,54 @@ TEST(IOBuf, HashAndEqual) {
EXPECT_TRUE(eq(*empty, *empty)); EXPECT_TRUE(eq(*empty, *empty));
EXPECT_TRUE(eq(empty, empty)); EXPECT_TRUE(eq(empty, empty));
EXPECT_TRUE(eq(empty.get(), empty.get()));
EXPECT_FALSE(eq(nullptr, empty)); EXPECT_FALSE(eq(nullptr, empty));
EXPECT_FALSE(eq(empty, nullptr)); EXPECT_FALSE(eq(empty, nullptr));
EXPECT_FALSE(eq(empty.get(), nullptr));
EXPECT_EQ(hash(*empty), hash(empty)); EXPECT_EQ(hash(*empty), hash(empty));
EXPECT_EQ(hash(*empty), hash(empty.get()));
EXPECT_NE(0, hash(empty)); EXPECT_NE(0, hash(empty));
EXPECT_NE(0, hash(empty.get()));
auto a = fromStr("hello"); auto a = fromStr("hello");
EXPECT_TRUE(eq(*a, *a)); EXPECT_TRUE(eq(*a, *a));
EXPECT_TRUE(eq(a, a)); EXPECT_TRUE(eq(a, a));
EXPECT_TRUE(eq(a.get(), a.get()));
EXPECT_FALSE(eq(nullptr, a)); EXPECT_FALSE(eq(nullptr, a));
EXPECT_FALSE(eq(a, nullptr)); EXPECT_FALSE(eq(a, nullptr));
EXPECT_FALSE(eq(a.get(), nullptr));
EXPECT_EQ(hash(*a), hash(a)); EXPECT_EQ(hash(*a), hash(a));
EXPECT_EQ(hash(*a), hash(a.get()));
EXPECT_NE(0, hash(a)); EXPECT_NE(0, hash(a));
EXPECT_NE(0, hash(a.get()));
auto b = fromStr("hello"); auto b = fromStr("hello");
EXPECT_TRUE(eq(*a, *b)); EXPECT_TRUE(eq(*a, *b));
EXPECT_TRUE(eq(a, b)); EXPECT_TRUE(eq(a, b));
EXPECT_TRUE(eq(a.get(), b.get()));
EXPECT_EQ(hash(a), hash(b)); EXPECT_EQ(hash(a), hash(b));
EXPECT_EQ(hash(a.get()), hash(b.get()));
auto c = fromStr("hellow"); auto c = fromStr("hellow");
EXPECT_FALSE(eq(a, c)); EXPECT_FALSE(eq(a, c));
EXPECT_FALSE(eq(a.get(), c.get()));
EXPECT_NE(hash(a), hash(c)); EXPECT_NE(hash(a), hash(c));
EXPECT_NE(hash(a.get()), hash(c.get()));
auto d = fromStr("world"); auto d = fromStr("world");
EXPECT_FALSE(eq(a, d)); EXPECT_FALSE(eq(a, d));
EXPECT_FALSE(eq(a.get(), d.get()));
EXPECT_NE(hash(a), hash(d)); EXPECT_NE(hash(a), hash(d));
EXPECT_NE(hash(a.get()), hash(d.get()));
auto e = fromStr("helloworld"); auto e = fromStr("helloworld");
auto f = fromStr("hello"); auto f = fromStr("hello");
...@@ -1161,7 +1175,9 @@ TEST(IOBuf, HashAndEqual) { ...@@ -1161,7 +1175,9 @@ TEST(IOBuf, HashAndEqual) {
f->prependChain(fromStr("rld")); f->prependChain(fromStr("rld"));
EXPECT_TRUE(eq(e, f)); EXPECT_TRUE(eq(e, f));
EXPECT_TRUE(eq(e.get(), f.get()));
EXPECT_EQ(hash(e), hash(f)); EXPECT_EQ(hash(e), hash(f));
EXPECT_EQ(hash(e.get()), hash(f.get()));
} }
TEST(IOBuf, IOBufCompare) { TEST(IOBuf, IOBufCompare) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment