summaryrefslogtreecommitdiffhomepage
path: root/include/ocl/logic/equiv.hpp
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-11-23 20:16:02 -0500
committerGitHub <noreply@github.com>2025-11-23 20:16:02 -0500
commit85f89ee4bb137100cbeffcbc10168eb8ea52e6cc (patch)
treef6e2063319ceaaa02f523fb5c289e4f37411a2df /include/ocl/logic/equiv.hpp
parent9a70f32ddaec0eef99efbf7ff5597c2adf08f45a (diff)
parent65a8349aa5526d071b18cd4d42586c46faaa3823 (diff)
Merge pull request #18 from amlel-el-mahrouss/developv1.0.48
OCL v1.0.48
Diffstat (limited to 'include/ocl/logic/equiv.hpp')
-rw-r--r--include/ocl/logic/equiv.hpp104
1 files changed, 104 insertions, 0 deletions
diff --git a/include/ocl/logic/equiv.hpp b/include/ocl/logic/equiv.hpp
new file mode 100644
index 0000000..1bdb6d9
--- /dev/null
+++ b/include/ocl/logic/equiv.hpp
@@ -0,0 +1,104 @@
+/*
+ * File: equiv.hpp
+ * Purpose: Equivalence header.
+ * Author: Amlal El Mahrouss (amlal@nekernel.org)
+ * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License.
+ */
+
+#pragma once
+
+/// @brief OCL equivalence namespace.
+namespace ocl::equiv
+{
+ template <typename T>
+ struct basic_hash_trait
+ {
+ /// @brief hash from T's result_type.
+ static typename T::result_type hash()
+ {
+ static T val;
+ return val.hash();
+ }
+ };
+
+ template <typename T, typename U>
+ struct is_same
+ {
+ static constexpr bool value = false;
+
+ /// @brief check if hash matches what we expect.
+ constexpr bool operator()() noexcept
+ {
+ return T::hash() == U::hash();
+ }
+ };
+
+ template <typename T>
+ struct is_same<T, T>
+ {
+ static constexpr bool value = true;
+ };
+
+ template <typename T, typename U>
+ struct is_not_same
+ {
+ static constexpr bool value = true;
+
+ constexpr bool operator()() noexcept
+ {
+ return T::hash() != U::hash();
+ }
+ };
+
+ template <typename T>
+ struct is_not_same<T, T>
+ {
+ static constexpr bool value = false;
+ };
+
+ template <typename T>
+ struct equiv_is_int8
+ {
+ private:
+ T left_ = 127, right_ = 127;
+
+ public:
+ using result_type = T;
+
+ constexpr result_type hash()
+ {
+ return (left_ + right_) < 1;
+ }
+ };
+
+ template <typename T>
+ struct equiv_not_int8
+ {
+ private:
+ // these shall overflow if not int8.
+ T left_ = 127, right_ = 127;
+
+ public:
+ using result_type = T;
+
+ constexpr result_type hash()
+ {
+ return (left_ + right_) > 0;
+ }
+ };
+
+ template <typename T>
+ struct equiv_is_real
+ {
+ private:
+ T left_ = 5, right_ = 3;
+
+ public:
+ using result_type = T;
+
+ constexpr result_type hash()
+ {
+ return left_ / right_ == 1;
+ }
+ };
+} // namespace ocl::equiv