/* ======================================== 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 #include #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 struct Vettable final { static constexpr bool kValue = false; }; template <> struct Vettable final { static constexpr bool kValue = false; }; template <> struct Vettable final { static constexpr bool kValue = true; }; /// @brief Concept version of Vettable. template concept IsVettable = requires(OnFallback fallback) { { Vettable::kValue ? true : fallback() }; }; template concept IsNotVettable = requires(OnFallback fallback) { { !Vettable::kValue ? true : fallback() }; }; } // namespace Kernel #endif // !__NE_KIT_VETTABLE_H__