summaryrefslogtreecommitdiff
path: root/modules/codec/c++/schema_hash.h
diff options
context:
space:
mode:
Diffstat (limited to 'modules/codec/c++/schema_hash.h')
-rw-r--r--modules/codec/c++/schema_hash.h207
1 files changed, 0 insertions, 207 deletions
diff --git a/modules/codec/c++/schema_hash.h b/modules/codec/c++/schema_hash.h
deleted file mode 100644
index 29afa5e..0000000
--- a/modules/codec/c++/schema_hash.h
+++ /dev/null
@@ -1,207 +0,0 @@
-#pragma once
-
-#include <forstio/string_literal.h>
-#include "schema.h"
-#include "crc32.h"
-
-namespace saw {
-template<string_literal lit>
-struct hash_literal {
- static constexpr uint32_t apply(uint32_t seed){
- constexpr std::string_view view = lit.view();
- return hash<algs::crc32>::update(seed, view);
- }
-};
-
-template<typename Schema>
-struct schema_hash_seed {
- static_assert(always_false<Schema>, "Not schema_hashable");
-};
-
-template<>
-struct schema_hash_seed<schema::SignedInteger> {
- using Schema = schema::SignedInteger;
-
- static constexpr uint32_t apply(uint32_t seed){
- return hash_literal<Schema::name>::apply(seed);
- }
-};
-
-template<>
-struct schema_hash_seed<schema::UnsignedInteger> {
- using Schema = schema::UnsignedInteger;
-
- static constexpr uint32_t apply(uint32_t seed){
- return hash_literal<Schema::name>::apply(seed);
- }
-};
-
-template<>
-struct schema_hash_seed<schema::FloatingPoint> {
- using Schema = schema::FloatingPoint;
-
- static constexpr uint32_t apply(uint32_t seed){
- return hash_literal<Schema::name>::apply(seed);
- }
-};
-
-template<>
-struct schema_hash_seed<schema::String> {
- using Schema = schema::String;
-
- static constexpr uint32_t apply(uint32_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 uint32_t apply(uint32_t seed){
- seed = hash_literal<Schema::name>::apply(seed);
- seed = schema_hash_seed<P>::apply(seed);
- uint64_t val = N;
- std::array<uint8_t,sizeof(uint64_t)> dat{
- static_cast<uint8_t>(val >> 0),
- static_cast<uint8_t>(val >> 8),
- static_cast<uint8_t>(val >> 16),
- static_cast<uint8_t>(val >> 24),
- static_cast<uint8_t>(val >> 32),
- static_cast<uint8_t>(val >> 40),
- static_cast<uint8_t>(val >> 48),
- static_cast<uint8_t>(val >> 56)
- };
- seed = hash<algs::crc32>::update(seed, &dat[0], dat.size());
- return seed;
- }
-};
-
-template<typename T, uint64_t N>
-struct schema_hash_seed<schema::Array<T,N>> {
- using Schema = schema::Array<T,N>;
-
- static constexpr uint32_t apply(uint32_t seed){
- seed = hash_literal<Schema::name>::apply(seed);
- seed = schema_hash_seed<T>::apply(seed);
- uint64_t val = N;
- std::array<uint8_t,sizeof(uint64_t)> dat{
- static_cast<uint8_t>(val >> 0),
- static_cast<uint8_t>(val >> 8),
- static_cast<uint8_t>(val >> 16),
- static_cast<uint8_t>(val >> 24),
- static_cast<uint8_t>(val >> 32),
- static_cast<uint8_t>(val >> 40),
- static_cast<uint8_t>(val >> 48),
- static_cast<uint8_t>(val >> 56)
- };
- seed = hash<algs::crc32>::update(seed, &dat[0], dat.size());
- return seed;
- }
-};
-
-template<typename... T>
-struct schema_hash_seed<schema::Tuple<T...>> {
- using Schema = schema::Tuple<T...>;
-
- template<uint64_t i>
- static constexpr uint32_t apply_ele(uint32_t seed){
- using Type = typename parameter_pack_type<i,T...>::type;
-
- seed = schema_hash_seed<Type>::apply(seed);
- if constexpr ( (i+1) < sizeof...(T) ){
- return apply_ele<i+1>(seed);
- }
- return seed;
- }
-
-
- static constexpr uint32_t apply(uint32_t seed){
- seed = hash_literal<Schema::name>::apply(seed);
- if constexpr (sizeof...(T) > 0){
- seed = apply_ele<0>(seed);
- }
- return seed;
- }
-};
-
-template<typename... V, string_literal... K>
-struct schema_hash_seed<schema::Struct<schema::Member<V,K>...>> {
- using Schema = schema::Struct<schema::Member<V,K>...>;
-
- template<uint64_t i>
- static constexpr uint32_t apply_ele(uint32_t seed){
- using Type = typename parameter_pack_type<i,V...>::type;
- constexpr string_literal Lit = parameter_key_pack_type<i,K...>::literal;
- using MemberT = typename parameter_pack_type<i,schema::Member<V,K>...>::type;
-
- seed = hash_literal<MemberT::name>::apply(seed);
- seed = schema_hash_seed<Type>::apply(seed);
- seed = hash_literal<Lit>::apply(seed);
-
- if constexpr ( (i+1) < sizeof...(V) ){
- return apply_ele<i+1>(seed);
- }
- return seed;
- }
-
- static constexpr uint32_t apply(uint32_t seed){
- seed = hash_literal<Schema::name>::apply(seed);
- if constexpr (sizeof...(V) > 0){
- seed = apply_ele<0>(seed);
- }
- return seed;
- }
-};
-
-template<typename Req, typename Resp>
-struct schema_hash_seed<schema::Function<Req, Resp>> {
- using Schema = schema::Function<Req,Resp>;
-
- static constexpr uint32_t apply(uint32_t seed){
- seed = hash_literal<Schema::name>::apply(seed);
- seed = schema_hash_seed<Req>::apply(seed);
- seed = schema_hash_seed<Resp>::apply(seed);
- return seed;
- }
-};
-
-template<typename... T, string_literal... Names>
-struct schema_hash_seed<schema::Interface<schema::Member<T, Names>...>> {
- using Schema = schema::Interface<schema::Member<T,Names>...>;
-
- template<uint64_t i>
- static constexpr uint32_t apply_ele(uint32_t seed){
- using Type = typename parameter_pack_type<i,T...>::type;
- constexpr string_literal Lit = parameter_key_pack_type<i,Names...>::literal;
- using MemberT = schema::Member<Type,Lit>;
-
- seed = hash_literal<MemberT::name>::apply(seed);
- seed = schema_hash_seed<Type>::apply(seed);
- seed = hash_literal<Lit>::apply(seed);
-
- if constexpr ( (i+1) < sizeof...(T) ){
- return apply_ele<i+1>(seed);
- }
-
- return seed;
- }
-
- static constexpr uint32_t apply(uint32_t seed){
- seed = hash_literal<Schema::name>::apply(seed);
- if constexpr ( sizeof...(T) > 0){
- seed = apply_ele<0>(seed);
- }
- return seed;
- }
-};
-
-template<typename Schema>
-struct schema_hash {
- static constexpr uint32_t apply() {
- constexpr uint32_t seed = 0;
- return schema_hash_seed<Schema>::apply(seed);
- }
-};
-
-}