#pragma once #include "Zone/Stream/IZoneStream.h" #include #include #include class IZoneOutputStream : public IZoneStream { public: inline static void* const PTR_FOLLOWING = reinterpret_cast(-1); inline static void* const PTR_INSERT = reinterpret_cast(-2); virtual void Align(int alignTo) = 0; virtual void* WriteDataRaw(const void* dst, size_t size) = 0; virtual void* WriteDataInBlock(const void* dst, size_t size) = 0; virtual void IncBlockPos(size_t size) = 0; virtual void WriteNullTerminated(const void* dst) = 0; virtual bool ReusableShouldWrite(void** pPtr, size_t size, std::type_index type) = 0; virtual void ReusableAddOffset(void* ptr, size_t size, size_t count, std::type_index type) = 0; virtual void MarkFollowing(void** pPtr) = 0; template bool ReusableShouldWrite(T** pPtr) { return ReusableShouldWrite(reinterpret_cast(reinterpret_cast(pPtr)), sizeof(T), std::type_index(typeid(T))); } template void ReusableAddOffset(T* ptr) { ReusableAddOffset(const_cast(reinterpret_cast(ptr)), sizeof(T), 1, std::type_index(typeid(T))); } template void ReusableAddOffset(T* ptr, const size_t count) { ReusableAddOffset(const_cast(reinterpret_cast(ptr)), sizeof(T), count, std::type_index(typeid(T))); } template T* Write(T* dst) { return static_cast(WriteDataInBlock(reinterpret_cast(dst), sizeof(T))); } template T* Write(T* dst, const size_t count) { return static_cast(WriteDataInBlock(reinterpret_cast(dst), count * sizeof(T))); } template T* WritePartial(T* dst, const size_t size) { return static_cast(WriteDataInBlock(reinterpret_cast(dst), size)); } template void MarkFollowing(T*& ptr) { MarkFollowing(reinterpret_cast(reinterpret_cast(&ptr))); } };