summaryrefslogtreecommitdiff
path: root/modules/codec/c++/schema_hash.h
diff options
context:
space:
mode:
authorClaudius "keldu" Holeksa <mail@keldu.de>2024-01-16 15:26:46 +0100
committerClaudius "keldu" Holeksa <mail@keldu.de>2024-01-16 15:26:46 +0100
commit634f55ceed45197e743c2d1c3df0c97c6f8888ae (patch)
treed1e9663c53fd719ae53745a18b0628ac43314300 /modules/codec/c++/schema_hash.h
parentb155dff8b068dc87d22eefd07150a681790247b8 (diff)
codec: Adding schema hashes and testing
Diffstat (limited to 'modules/codec/c++/schema_hash.h')
-rw-r--r--modules/codec/c++/schema_hash.h60
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);
+ }
+};
+
}