diff options
author | crupest <crupest@outlook.com> | 2023-10-15 00:07:24 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2023-10-15 00:07:24 +0800 |
commit | c34035b9491c201eca226a2e065fd9753d706433 (patch) | |
tree | 5a4e422990621cafbb1dca72f03db32ace24c677 /include/cru/common | |
parent | 856df14d749014f11a583ade2fee988b076754cc (diff) | |
download | cru-c34035b9491c201eca226a2e065fd9753d706433.tar.gz cru-c34035b9491c201eca226a2e065fd9753d706433.tar.bz2 cru-c34035b9491c201eca226a2e065fd9753d706433.zip |
Improve bitmask.
Bool conversion -> explicit
std::hash support
Diffstat (limited to 'include/cru/common')
-rw-r--r-- | include/cru/common/Bitmask.h | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/include/cru/common/Bitmask.h b/include/cru/common/Bitmask.h index bd6a8309..b1e8495e 100644 --- a/include/cru/common/Bitmask.h +++ b/include/cru/common/Bitmask.h @@ -1,6 +1,8 @@ #pragma once #include "Base.h" +#include <functional> + namespace cru { template <typename Tag, typename TUnderlying = unsigned> struct Bitmask final { @@ -35,8 +37,19 @@ struct Bitmask final { bool operator!=(Bitmask rhs) const { return this->value != rhs.value; } explicit operator TUnderlying() const { return value; } - operator bool() const { return value != 0; } + explicit operator bool() const { return value != 0; } TUnderlying value; }; } // namespace cru + +namespace std { +template <typename Tag, typename TUnderlying> +struct hash<cru::Bitmask<Tag, TUnderlying>> { + using Bitmask = cru::Bitmask<Tag, TUnderlying>; + + std::size_t operator()(Bitmask bitmask) const { + return std::hash<TUnderlying>{}(bitmask.value); + } +}; +} // namespace std |