/* ------------------------------------------- Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. ------------------------------------------- */ #pragma once #include #include namespace Kernel { template class Stream final { public: explicit Stream(Ref ref) : fStream(ref) {} ~Stream() = default; Stream& operator=(const Stream&) = default; Stream(const Stream&) = default; template friend Stream& operator>>(Stream& Ks, Ref& Buf) { Ks.fKind = Ks.fStream->In(Buf); return *Ks; } template friend Stream& operator<<(Stream& Ks, Ref& Buf) { Ks.fKind = Buf; Ks.fStream->Out(Buf.Leak()); return *Ks; } Ref& AsStreamTrait() { return fStream; } Ref& AsType() { return fKind; } private: Ref fStream; Ref fKind; }; } // namespace Kernel