summaryrefslogtreecommitdiffhomepage
path: root/src/kernel/NeKit/Vettable.h
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-12-11 08:34:36 +0100
committerAmlal El Mahrouss <amlal@nekernel.org>2025-12-11 08:34:36 +0100
commitfe58b444de6c00089010d308a39f78890b1782b6 (patch)
tree84849ef1576aca5410210503c58268d3a9592c14 /src/kernel/NeKit/Vettable.h
parent076c8378e96a9fac9864c9d02bb63fa7dd423e4a (diff)
feat: kernel: `Vettable.h` interface and concepts.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'src/kernel/NeKit/Vettable.h')
-rw-r--r--src/kernel/NeKit/Vettable.h59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/kernel/NeKit/Vettable.h b/src/kernel/NeKit/Vettable.h
new file mode 100644
index 00000000..d2479bf0
--- /dev/null
+++ b/src/kernel/NeKit/Vettable.h
@@ -0,0 +1,59 @@
+
+/* ========================================
+
+ Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license.
+
+======================================== */
+
+#ifndef __NE_KIT_VETTABLE_H__
+#define __NE_KIT_VETTABLE_H__
+
+#include <CompilerKit/CompilerKit.h>
+#include <NeKit/Config.h>
+
+#define NE_VETTABLE : public ::Kernel::IVettable
+
+namespace Kernel {
+/// @brief Vet interface for objects.
+struct IVettable {
+ explicit IVettable() = default;
+ virtual ~IVettable() = default;
+
+ NE_COPY_DEFAULT(IVettable)
+};
+
+struct INotVettable {
+ explicit INotVettable() = default;
+ virtual ~INotVettable() = default;
+
+ NE_COPY_DEFAULT(INotVettable)
+};
+
+template <typename T>
+struct Vettable final {
+ static constexpr bool kValue = false;
+};
+
+template <>
+struct Vettable<INotVettable> final {
+ static constexpr bool kValue = false;
+};
+
+template <>
+struct Vettable<IVettable> final {
+ static constexpr bool kValue = true;
+};
+
+/// @brief Concept version of Vettable.
+template <typename T, typename OnFallback>
+concept IsVettable = requires(OnFallback fallback) {
+ { Vettable<T>::kValue ? true : fallback() };
+};
+
+template <typename T, typename OnFallback>
+concept IsNotVettable = requires(OnFallback fallback) {
+ { !Vettable<T>::kValue ? true : fallback() };
+};
+} // namespace Kernel
+
+#endif // !__NE_KIT_VETTABLE_H__ \ No newline at end of file