/* ======================================== Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license. ======================================== */ #pragma once #include #include #include #include #include namespace Kernel { class Variant final { public: enum class VariantKind { kInvalid = 0, kString = 200, kBlob, kNull, kJson, kTOML, kSwap, }; public: explicit Variant() = delete; public: NE_COPY_DEFAULT(Variant) ~Variant() = default; public: template explicit Variant(KBasicString* stringView) : fPtr((VoidPtr) stringView), fKind(VariantKind::kString) {} explicit Variant(JsonObject<>* json) : fPtr((VoidPtr) json), fKind(VariantKind::kJson) {} explicit Variant(TOMLObject* toml) : fPtr((VoidPtr) toml), fKind(VariantKind::kTOML) {} explicit Variant(nullPtr ptr) : fPtr(ptr), fKind(VariantKind::kNull) {} explicit Variant(SWAP_DISK_HEADER* ptr) : fPtr(ptr), fKind(VariantKind::kSwap) {} explicit Variant(VoidPtr ptr) : fPtr(ptr), fKind(VariantKind::kBlob) {} public: const Char* ToString(); /// ======================================================================== /// @brief Returns the underlying pointer. /// @return the underlying pointer. /// ======================================================================== VoidPtr Leak(); template T* As() noexcept { return reinterpret_cast(fPtr); } VariantKind& Kind(); private: VoidPtr fPtr{nullptr}; VariantKind fKind{VariantKind::kNull}; }; } // namespace Kernel