namespace saw { namespace impl { /** * This class provides basic info on sizes of the encode::Forst */ template struct forst_codec_info { static_assert(always_false, "Not supported."); }; template struct forst_codec_info> { public: static constexpr uint64_t layers = 0u; static constexpr uint64_t static_size = N; template static uint64_t dynamic_size(const data, Encoding>&) noexcept { return 0u; } }; template<> struct forst_codec_info { public: static constexpr uint64_t layers = 1u; static constexpr uint64_t static_size = forst_codec_info::MetaSchema>::static_size; template static uint64_t dynamic_size (const data& dat) noexcept { return dat.size() * 1u; } }; template struct forst_codec_info> { public: static constexpr uint64_t layers = 1u + forst_codec_info::layers; /// Dimension and the relative pointer static constexpr uint64_t static_size = 8u * N + 8u; template static uint64_t dynamic_size (const data& dat) { return dat.size() * forst_codec_info::static_size; } }; template struct forst_codec_info > { public: template static constexpr uint64_t max_layers() noexcept { if constexpr ( i < sizeof...(Members) ) { using MT = typename parameter_pack_type::type; constexpr uint64_t layer_i = forst_codec_info::layers; constexpr uint64_t layer_next = max_layers(); constexpr uint64_t layer_val = layer_i > layer_next ? layer_i : layer_next; return layer_val; } return 0u; } public: static constexpr uint64_t layers = max_layers<0u>(); public: template static constexpr uint64_t static_size_calc(){ if constexpr ( i < sizeof...(Members) ) { using MT = typename parameter_pack_type::type; constexpr uint64_t layer_i = forst_codec_info::static_size + static_size_calc(); return layer_i; } return 0u; } public: static constexpr uint64_t static_size = static_size_calc<0>(); template static uint64_t dynamic_size_calc(const data, Encoding>& dat) noexcept { if constexpr ( i < sizeof...(Members) ){ using MT = typename parameter_pack_type::type; constexpr uint64_t layer_i = forst_codec_info::dynamic_size(dat) + dynamic_size_calc(dat); return layer_i; } return 0u; } public: template static uint64_t dynamic_size(const data, Encoding>& dat) noexcept { return dynamic_size_calc<0u>(dat); } }; template struct forst_codec_info> { public: template static constexpr uint64_t max_layers() noexcept { if constexpr ( i < sizeof...(T) ) { using MT = typename parameter_pack_type::type; constexpr uint64_t layer_i = forst_codec_info::layers; constexpr uint64_t layer_next = max_layers(); constexpr uint64_t layer_val = layer_i > layer_next ? layer_i : layer_next; return layer_val; } return 0u; } public: static constexpr uint64_t layers = max_layers<0u>(); public: template static constexpr uint64_t static_size_calc(){ if constexpr ( i < sizeof...(T) ) { using MT = typename parameter_pack_type::type; constexpr uint64_t layer_i = forst_codec_info::static_size + layer_size_calc(); } return 0u; } public: static constexpr uint64_t static_size = static_size_calc<0>(); template static uint64_t dynamic_size_calc(const data, Encoding>& dat) noexcept { if constexpr ( i < sizeof...(T) ){ using MT = typename parameter_pack_type::type; constexpr uint64_t layer_i = forst_codec_info::dynamic_size(dat) + dynamic_size_calc(dat); return layer_i; } return 0u; } public: template static uint64_t dynamic_size(const data, Encoding>& dat) noexcept { return dynamic_size_calc<0u>(dat); } }; } }