/***************************************************************************** * Copyright (c) 2014-2018 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 class DataSerialiser { private: MemoryStream _stream; IStream* _activeStream = nullptr; bool _isSaving = false; bool _isLogging = false; public: DataSerialiser(bool isSaving) : _isSaving(isSaving) , _isLogging(false) { _activeStream = &_stream; } DataSerialiser(bool isSaving, IStream& stream, bool isLogging = false) : _isSaving(isSaving) , _isLogging(isLogging) { _activeStream = &stream; } bool IsSaving() const { return _isSaving; } bool IsLoading() const { return !_isSaving; } MemoryStream& GetStream() { return _stream; } 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; } };