mirror of https://github.com/status-im/evmc.git
cpp: Add is_zero() and explicit bool() for basic types
This commit is contained in:
parent
635aebeb66
commit
18e6dabe73
|
@ -24,6 +24,9 @@ struct address : evmc_address
|
||||||
///
|
///
|
||||||
/// Initializes bytes to zeros if not other @p init value provided.
|
/// Initializes bytes to zeros if not other @p init value provided.
|
||||||
constexpr address(evmc_address init = {}) noexcept : evmc_address{init} {}
|
constexpr address(evmc_address init = {}) noexcept : evmc_address{init} {}
|
||||||
|
|
||||||
|
/// Explicit operator converting to bool.
|
||||||
|
constexpr inline explicit operator bool() const noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// The fixed size array of 32 bytes for storing 256-bit EVM values.
|
/// The fixed size array of 32 bytes for storing 256-bit EVM values.
|
||||||
|
@ -35,6 +38,9 @@ struct bytes32 : evmc_bytes32
|
||||||
///
|
///
|
||||||
/// Initializes bytes to zeros if not other @p init value provided.
|
/// Initializes bytes to zeros if not other @p init value provided.
|
||||||
constexpr bytes32(evmc_bytes32 init = {}) noexcept : evmc_bytes32{init} {}
|
constexpr bytes32(evmc_bytes32 init = {}) noexcept : evmc_bytes32{init} {}
|
||||||
|
|
||||||
|
/// Explicit operator converting to bool.
|
||||||
|
constexpr inline explicit operator bool() const noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Loads 64 bits / 8 bytes of data from the given @p bytes array in big-endian order.
|
/// Loads 64 bits / 8 bytes of data from the given @p bytes array in big-endian order.
|
||||||
|
@ -118,6 +124,28 @@ constexpr bool operator<(const bytes32& a, const bytes32& b) noexcept
|
||||||
load64be(&a.bytes[24]) < load64be(&b.bytes[24]));
|
load64be(&a.bytes[24]) < load64be(&b.bytes[24]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Checks if the given address is the zero address.
|
||||||
|
constexpr inline bool is_zero(const address& a) noexcept
|
||||||
|
{
|
||||||
|
return a == address{};
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr address::operator bool() const noexcept
|
||||||
|
{
|
||||||
|
return !is_zero(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Checks if the given bytes32 object has all zero bytes.
|
||||||
|
constexpr inline bool is_zero(const bytes32& a) noexcept
|
||||||
|
{
|
||||||
|
return a == bytes32{};
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr bytes32::operator bool() const noexcept
|
||||||
|
{
|
||||||
|
return !is_zero(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// @copydoc evmc_result
|
/// @copydoc evmc_result
|
||||||
///
|
///
|
||||||
|
|
|
@ -21,6 +21,9 @@ TEST(cpp, address)
|
||||||
{
|
{
|
||||||
evmc::address a;
|
evmc::address a;
|
||||||
EXPECT_EQ(std::count(std::begin(a.bytes), std::end(a.bytes), 0), sizeof(a));
|
EXPECT_EQ(std::count(std::begin(a.bytes), std::end(a.bytes), 0), sizeof(a));
|
||||||
|
EXPECT_TRUE(is_zero(a));
|
||||||
|
EXPECT_FALSE(a);
|
||||||
|
EXPECT_TRUE(!a);
|
||||||
|
|
||||||
auto other = evmc_address{};
|
auto other = evmc_address{};
|
||||||
other.bytes[19] = 0xfe;
|
other.bytes[19] = 0xfe;
|
||||||
|
@ -30,12 +33,18 @@ TEST(cpp, address)
|
||||||
a.bytes[0] = 1;
|
a.bytes[0] = 1;
|
||||||
other = a;
|
other = a;
|
||||||
EXPECT_TRUE(std::equal(std::begin(a.bytes), std::end(a.bytes), std::begin(other.bytes)));
|
EXPECT_TRUE(std::equal(std::begin(a.bytes), std::end(a.bytes), std::begin(other.bytes)));
|
||||||
|
EXPECT_FALSE(is_zero(a));
|
||||||
|
EXPECT_TRUE(a);
|
||||||
|
EXPECT_FALSE(!a);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(cpp, bytes32)
|
TEST(cpp, bytes32)
|
||||||
{
|
{
|
||||||
evmc::bytes32 b;
|
evmc::bytes32 b;
|
||||||
EXPECT_EQ(std::count(std::begin(b.bytes), std::end(b.bytes), 0), sizeof(b));
|
EXPECT_EQ(std::count(std::begin(b.bytes), std::end(b.bytes), 0), sizeof(b));
|
||||||
|
EXPECT_TRUE(is_zero(b));
|
||||||
|
EXPECT_FALSE(b);
|
||||||
|
EXPECT_TRUE(!b);
|
||||||
|
|
||||||
auto other = evmc_bytes32{};
|
auto other = evmc_bytes32{};
|
||||||
other.bytes[31] = 0xfe;
|
other.bytes[31] = 0xfe;
|
||||||
|
@ -45,6 +54,9 @@ TEST(cpp, bytes32)
|
||||||
b.bytes[0] = 1;
|
b.bytes[0] = 1;
|
||||||
other = b;
|
other = b;
|
||||||
EXPECT_TRUE(std::equal(std::begin(b.bytes), std::end(b.bytes), std::begin(other.bytes)));
|
EXPECT_TRUE(std::equal(std::begin(b.bytes), std::end(b.bytes), std::begin(other.bytes)));
|
||||||
|
EXPECT_FALSE(is_zero(b));
|
||||||
|
EXPECT_TRUE(b);
|
||||||
|
EXPECT_FALSE(!b);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(cpp, std_hash)
|
TEST(cpp, std_hash)
|
||||||
|
|
Loading…
Reference in New Issue