#pragma once #include "data.hpp" #include "schema_math.hpp" #include "iterator.hpp" #include namespace saw { /* template class data,encode::Native> { public: using Schema = schema::Quaternion; private: data,encode::Native> vals_; using NativeType = typename native_data_type::type; public: data() = default; data(data i__, data j__, data k__, data w__): vals_{i__,j__,k__,w__} {} constexpr void normalize() { data norm{}; for(data i = 0u; i < vals_.size(); ++i){ norm += vals_.at(i) * vals_.at(i); } norm.set(std::sqrt(norm.get())); for(data i = 0u; i < vals_.size(); ++i){ vals_.at(i) = vals_.at(i) / norm; } } constexpr data& at(data i){ return vals_.at(i); } constexpr const data& at(data i) const { return vals_.at(i); } constexpr data operator*(const data& rhs) const { data mult; data i_i{0u}; data j_i{1u}; data k_i{2u}; data w_i{3u}; mult.at(i_i) = at(w_i) * rhs.at(i_i) + at(i_i) * rhs.at(w_i) + at(j_i) * rhs.at(k_i) - at(k_i) * rhs.at(j_i); mult.at(j_i) = at(w_i) * rhs.at(j_i) + at(j_i) * rhs.at(w_i) - at(i_i) * rhs.at(k_i) + at(k_i) * rhs.at(i_i); mult.at(k_i) = at(w_i) * rhs.at(k_i) + at(k_i) * rhs.at(w_i) + at(i_i) * rhs.at(j_i) - at(j_i) * rhs.at(i_i); mult.at(w_i) = at(w_i) * rhs.at(w_i) - at(i_i) * rhs.at(i_i) - at(j_i) * rhs.at(j_i) - at(k_i) * rhs.at(k_i); return mult; } }; */ template class data, encode::Native> { public: using Schema = schema::Tensor; private: data, encode::Native> values_; public: data(): values_{data>{{data{Dims}...}}} {} data& at(const data, encode::Native>& index){ return values_.at(index); } const data& at(const data, encode::Native>& index) const { return values_.at(index); } data& operator()(const data, encode::Native>& index){ return values_.at(index); } const data& operator()(const data, encode::Native>& index) const { return values_.at(index); } data, encode::Native> operator+(const data, encode::Native>& rhs) { data, encode::Native> c; rank_iterator::in_fixed_bounds([&](const data, encode::Native>& index) -> error_or{ c.at(index) = at(index) + rhs.at(index); return make_void(); }); return c; } }; }