Replace Hash CRTP base with a concept.

This commit is contained in:
hashlag
2026-08-31 00:05:18 +03:00
parent b769e55753
commit 2f1b5091cd
4 changed files with 13 additions and 28 deletions
+4 -25
View File
@@ -1,38 +1,17 @@
#ifndef CHAOS_HASH_HASH_HPP #ifndef CHAOS_HASH_HASH_HPP
#define CHAOS_HASH_HASH_HPP #define CHAOS_HASH_HASH_HPP
#include <concepts>
#include <string> #include <string>
namespace Chaos::Hash namespace Chaos::Hash
{ {
template<typename T> template<typename T>
class Hash concept Hash = requires(T hash)
{ {
public: hash.GetRawDigest();
auto GetRawDigest() const { hash.ToHexString() } -> std::same_as<std::string>;
{
return Impl().GetRawDigest();
}
std::string ToHexString() const
{
return Impl().ToHexString();
}
protected:
Hash() = default;
private:
const T & Impl() const
{
return static_cast<const T &>(*this);
}
T & Impl()
{
return static_cast<T &>(*this);
}
}; };
} // namespace Chaos::Hash } // namespace Chaos::Hash
+3 -1
View File
@@ -136,7 +136,7 @@ private:
namespace Chaos::Hash::Md4 namespace Chaos::Hash::Md4
{ {
struct Md4Hash : public Hash<Md4Hash> struct Md4Hash
{ {
std::array<uint8_t, 16> GetRawDigest() const std::array<uint8_t, 16> GetRawDigest() const
{ {
@@ -161,6 +161,8 @@ struct Md4Hash : public Hash<Md4Hash>
std::array<uint8_t, 16> RawDigest_; std::array<uint8_t, 16> RawDigest_;
}; };
static_assert(Hash<Md4Hash>);
class Md4Hasher : public Hasher<Md4Hasher> class Md4Hasher : public Hasher<Md4Hasher>
{ {
public: public:
+3 -1
View File
@@ -160,7 +160,7 @@ private:
namespace Chaos::Hash::Md5 namespace Chaos::Hash::Md5
{ {
struct Md5Hash : public Hash<Md5Hash> struct Md5Hash
{ {
std::array<uint8_t, 16> GetRawDigest() const std::array<uint8_t, 16> GetRawDigest() const
{ {
@@ -185,6 +185,8 @@ struct Md5Hash : public Hash<Md5Hash>
std::array<uint8_t, 16> RawDigest_; std::array<uint8_t, 16> RawDigest_;
}; };
static_assert(Hash<Md5Hash>);
class Md5Hasher : public Hasher<Md5Hasher> class Md5Hasher : public Hasher<Md5Hasher>
{ {
public: public:
+3 -1
View File
@@ -129,7 +129,7 @@ private:
namespace Chaos::Hash::Sha1 namespace Chaos::Hash::Sha1
{ {
struct Sha1Hash : public Hash<Sha1Hash> struct Sha1Hash
{ {
std::array<uint8_t, 20> GetRawDigest() const std::array<uint8_t, 20> GetRawDigest() const
{ {
@@ -155,6 +155,8 @@ struct Sha1Hash : public Hash<Sha1Hash>
std::array<uint8_t, 20> RawDigest_; std::array<uint8_t, 20> RawDigest_;
}; };
static_assert(Hash<Sha1Hash>);
class Sha1Hasher : public Hasher<Sha1Hasher> class Sha1Hasher : public Hasher<Sha1Hasher>
{ {
public: public: