/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef MOZILLA_GFX_RECORDINGTYPES_H_ #define MOZILLA_GFX_RECORDINGTYPES_H_ #include #include #include "Logging.h" namespace mozilla { namespace gfx { template struct ElementStreamFormat { static void Write(S& aStream, const T& aElement) { aStream.write(reinterpret_cast(&aElement), sizeof(T)); } static void Read(S& aStream, T& aElement) { aStream.read(reinterpret_cast(&aElement), sizeof(T)); } }; template void WriteElement(S& aStream, const T& aElement) { ElementStreamFormat::Write(aStream, aElement); } template void WriteVector(S& aStream, const std::vector& aVector) { size_t size = aVector.size(); WriteElement(aStream, size); if (size) { aStream.write(reinterpret_cast(aVector.data()), sizeof(T) * size); } } // ReadElement is disabled for enum types. Use ReadElementConstrained instead. template ::value>::type> void ReadElement(S& aStream, T& aElement) { ElementStreamFormat::Read(aStream, aElement); } template void ReadElementConstrained(S& aStream, T& aElement, const T& aMinValue, const T& aMaxValue) { ElementStreamFormat::Read(aStream, aElement); if (aElement < aMinValue || aElement > aMaxValue) { aStream.SetIsBad(); } } template void ReadVector(S& aStream, std::vector& aVector) { size_t size; ReadElement(aStream, size); if (size && aStream.good()) { aVector.resize(size); aStream.read(reinterpret_cast(aVector.data()), sizeof(T) * size); } else { aVector.clear(); } } } // namespace gfx } // namespace mozilla #endif /* MOZILLA_GFX_RECORDINGTYPES_H_ */