#pragma once #include "schema.hpp" #include "encode.hpp" namespace kel { namespace lbm { template class data final {}; template class data,Encode> final { public: using Schema = sch::Primitive; using Encode = Encode; private: native_data_type::type value_; public: data(): value_{} {} data(native_data_type::type value__): value_{value__} {} constexpr auto get() const { return value_; } void set(native_data_type value__){ value_ = value__; } constexpr bool operator==(const data& rhs) const { return value_ == rhs.value_; } constexpr bool operator!=(const data& rhs) const { return value_ != rhs.value_; } constexpr bool operator>(const data& rhs) const { return value_ > rhs.value_; } constexpr bool operator<(const data& rhs) const { return value_ < rhs.value_; } constexpr bool operator>=(const data& rhs) const { return value_ >= rhs.value_; } constexpr bool operator<=(const data& rhs) const { return value_ >= rhs.value_; } constexpr bool equals(const data& rhs) const { return (*this) == rhs; } data operator+(const data& rhs) const { return {value_ + rhs.value_}; } data operator-(const data& rhs) const { return {value_ - rhs.value_}; } data operator*(const data& rhs) const { return {value_ * rhs.value_}; } data operator/(const data& rhs) const { return {value_ / rhs.value_}; } data& operator+=(const data& rhs) { value_ += rhs.value_; return *this } data& operator-=(const data& rhs) { value_ -= rhs.value_; return *this } data& operator*=(const data& rhs) { value_ *= rhs.value_; return *this } data& operator/=(const data& rhs) { value_ /= rhs.value_; return *this } template data cast_to() const { data val{static_cast::type>(value_)}; return val; } }; } }