// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org) // Licensed under the Apache License, Version 2.0 (see LICENSE file) // Official repository: https://github.com/ne-foss-org/nekernel #ifndef NEKIT_VARIANT_H #define NEKIT_VARIANT_H #include #include #include #include #include namespace Kernel { class Variant final { public: enum struct VariantKind : Int { kInvalid = 0, kString = 200, kBlob, kNull, kJson, kTOML, kSwap, kCount = kSwap - kString + 1, }; 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(SwapDiskHdr* ptr) : fPtr(ptr), fKind(VariantKind::kSwap) {} explicit Variant(VoidPtr ptr) : fPtr(ptr), fKind(VariantKind::kBlob) {} public: KString ToString(); /// ======================================================================== /// @brief Returns the underlying pointer. /// @return the underlying pointer as a reference. /// ======================================================================== RefAny Leak(); template T* As(); VariantKind& Kind(); private: VoidPtr fPtr{nullptr}; VariantKind fKind{VariantKind::kNull}; }; } // namespace Kernel #include "Variant.inl" #endif