diff options
| -rw-r--r-- | modules/codec/c++/data.hpp | 52 | ||||
| -rw-r--r-- | modules/codec/tests/data.cpp | 21 |
2 files changed, 68 insertions, 5 deletions
diff --git a/modules/codec/c++/data.hpp b/modules/codec/c++/data.hpp index a8b7836..6413bb7 100644 --- a/modules/codec/c++/data.hpp +++ b/modules/codec/c++/data.hpp @@ -101,26 +101,68 @@ public: }; template<> -class data<schema::Bool, encode::Native> { +class data<schema::Bool, encode::Native> final { public: using Schema = schema::Bool; using MetaSchema = schema::Void; private: bool value_; public: - data():value_{false}{} - data(data<MetaSchema, encode::Native>):value_{false}{} + constexpr data():value_{false}{} + constexpr data(data<MetaSchema, encode::Native>):value_{false}{} SAW_DEFAULT_COPY(data); SAW_DEFAULT_MOVE(data); - void set(bool val){ + constexpr data(bool value__): + value_{value__} + {} + + constexpr void set(bool val){ value_ = val; } - bool get() const { + constexpr bool get() const { return value_; } + + template<typename Enc = encode::Native> + constexpr bool equals(const data<Schema, Enc>& rhs) const { + return get() == rhs.get(); + } + + template<typename Enc> + constexpr bool operator==(const data<Schema, Enc>& rhs) const { + return equals(rhs); + } + + template<typename Enc> + constexpr bool operator!=(const data<Schema, Enc>& rhs) const { + return get() != rhs.get(); + } + + constexpr data<Schema, encode::Native> operator!() const { + return {!get()}; + } + + template<typename Enc> + constexpr data<Schema, encode::Native> operator&&(const data<Schema, Enc>& rhs) const { + return {get() && rhs.get()}; + } + + template<typename Enc> + constexpr data<Schema, encode::Native> operator||(const data<Schema, Enc>& rhs) const { + return {get() || rhs.get()}; + } + + /** + * Casts + */ + template<typename Target> + constexpr data<Target, encode::Native> cast_to() const { + auto raw_to = static_cast<typename saw::native_data_type<Target>::type>(value_); + return {raw_to}; + } }; template<typename T, size_t N> diff --git a/modules/codec/tests/data.cpp b/modules/codec/tests/data.cpp index a686b6d..57c56d3 100644 --- a/modules/codec/tests/data.cpp +++ b/modules/codec/tests/data.cpp @@ -10,6 +10,27 @@ using Int32Array = Array< >; } +SAW_TEST("Data Native/Bool"){ + using namespace saw; + + data<sch::Bool> t{true}; + data<sch::Bool> f; + + SAW_EXPECT(t.get(), "Should hold true"); + SAW_EXPECT(!f.get(), "Should default to false"); + + SAW_EXPECT((t != f), "Should not be equal"); + SAW_EXPECT(((t && f).get() == false), "Wrong conjunction"); + SAW_EXPECT(((t || f).get() == true), "Wrong disjunction"); + SAW_EXPECT(((!f).get() == true), "Wrong negation"); + + f.set(true); + SAW_EXPECT((t == f), "Should be equal"); + + constexpr data<sch::Bool> ct{true}; + static_assert(ct.get(), "Should be usable at compile time"); +} + SAW_TEST("Data Native/Array Access with Data Native"){ using namespace saw; |
