/***************************************************************************** * Copyright (c) 2014-2020 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 * * OpenRCT2 is licensed under the GNU General Public License version 3. *****************************************************************************/ #pragma once #include "DataSerialiserTraits.h" #include "MemoryStream.h" #include class DataSerialiser { private: OpenRCT2::MemoryStream _stream; OpenRCT2::IStream& _activeStream; bool _isSaving = false; bool _isLogging = false; public: DataSerialiser(bool isSaving) : _activeStream(_stream) , _isSaving(isSaving) , _isLogging(false) { } DataSerialiser(bool isSaving, OpenRCT2::IStream& stream, bool isLogging = false) : _activeStream(stream) , _isSaving(isSaving) , _isLogging(isLogging) { } bool IsSaving() const { return _isSaving; } bool IsLoading() const { return !_isSaving; } bool IsLogging() const { return _isLogging; } OpenRCT2::IStream& GetStream() { return _activeStream; } template DataSerialiser& operator<<(const T& data) { if (!_isLogging) { if (_isSaving) DataSerializerTraits::encode(&_activeStream, data); else DataSerializerTraits::decode(&_activeStream, const_cast(data)); } else { DataSerializerTraits::log(&_activeStream, data); } return *this; } template DataSerialiser& operator<<(DataSerialiserTag data) { if (!_isLogging) { if (_isSaving) DataSerializerTraits>::encode(&_activeStream, data); else DataSerializerTraits>::decode(&_activeStream, data); } else { DataSerializerTraits>::log(&_activeStream, data); } return *this; } };