diff options
author | Claudius "keldu" Holeksa <mail@keldu.de> | 2024-01-16 15:26:46 +0100 |
---|---|---|
committer | Claudius "keldu" Holeksa <mail@keldu.de> | 2024-01-16 15:26:46 +0100 |
commit | 634f55ceed45197e743c2d1c3df0c97c6f8888ae (patch) | |
tree | d1e9663c53fd719ae53745a18b0628ac43314300 /modules/codec/c++/schema_hash.h | |
parent | b155dff8b068dc87d22eefd07150a681790247b8 (diff) |
codec: Adding schema hashes and testing
Diffstat (limited to 'modules/codec/c++/schema_hash.h')
-rw-r--r-- | modules/codec/c++/schema_hash.h | 60 |
1 files changed, 51 insertions, 9 deletions
diff --git a/modules/codec/c++/schema_hash.h b/modules/codec/c++/schema_hash.h index a7f482f..8f66fbf 100644 --- a/modules/codec/c++/schema_hash.h +++ b/modules/codec/c++/schema_hash.h @@ -2,7 +2,6 @@ #include <forstio/string_literal.h> #include "schema.h" -#include "data.h" namespace saw { struct schema_hash_combine { @@ -12,7 +11,7 @@ struct schema_hash_combine { }; template<string_literal lit> -struct schema_hash_literal { +struct hash_literal { static constexpr uint64_t apply(uint64_t seed){ constexpr std::string_view view = lit.view(); for(uint64_t i = 0; i < view.size(); ++i){ @@ -23,21 +22,64 @@ struct schema_hash_literal { }; template<typename Schema> -struct schema_hash { +struct schema_hash_seed { static_assert(always_false<Schema>, "Not schema_hashable"); }; template<> -struct schema_hash<schema::String> { +struct schema_hash_seed<schema::SignedInteger> { + using Schema = schema::SignedInteger; + + static constexpr uint64_t apply(uint64_t seed){ + return hash_literal<Schema::name>::apply(seed); + } +}; + +template<> +struct schema_hash_seed<schema::UnsignedInteger> { + using Schema = schema::UnsignedInteger; + + static constexpr uint64_t apply(uint64_t seed){ + return hash_literal<Schema::name>::apply(seed); + } +}; + +template<> +struct schema_hash_seed<schema::FloatingPoint> { + using Schema = schema::FloatingPoint; + + static constexpr uint64_t apply(uint64_t seed){ + return hash_literal<Schema::name>::apply(seed); + } +}; + +template<> +struct schema_hash_seed<schema::String> { using Schema = schema::String; - static constexpr uint64_t apply(uint64_t seed, const data<Schema>& val){ - seed = schema_hash_literal<Schema::name>::apply(seed); - for(size_t i = 0; i < val.size(); ++i){ - seed = schema_hash_combine::apply(seed, static_cast<uint64_t>(val.at(i))); - } + static constexpr uint64_t apply(uint64_t seed){ + return hash_literal<Schema::name>::apply(seed); + } +}; + +template<typename P, uint64_t N> +struct schema_hash_seed<schema::Primitive<P,N>> { + using Schema = schema::Primitive<P,N>; + + static constexpr uint64_t apply(uint64_t seed){ + seed = hash_literal<Schema::name>::apply(seed); + seed = schema_hash_seed<P>::apply(seed); + seed = schema_hash_combine::apply(seed, N); return seed; } }; +template<typename Schema> +struct schema_hash { + static constexpr uint64_t apply() { + constexpr uint64_t seed = 0; + return schema_hash_seed<Schema>::apply(seed); + } +}; + } |