/*========================================================================= Program: Visualization Toolkit Module: vtkXMLDataHeaderPrivate.h Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkXMLDataHeaderPrivate_DoNotInclude #error "do not include unless you know what you are doing" #endif #ifndef vtkXMLDataHeaderPrivate_h #define vtkXMLDataHeaderPrivate_h #include "vtkType.h" #include // Abstract interface using type vtkTypeUInt64 to access an array // of either vtkTypeUInt32 or vtkTypeUInt64. Shared by vtkXMLWriter // and vtkXMLDataParser to write/read binary data headers. class vtkXMLDataHeader { public: virtual void Resize(size_t count) = 0; virtual vtkTypeUInt64 Get(size_t index) const = 0; virtual bool Set(size_t index, vtkTypeUInt64 value) = 0; virtual size_t WordSize() const = 0; virtual size_t WordCount() const = 0; virtual unsigned char* Data() = 0; size_t DataSize() const { return this->WordCount() * this->WordSize(); } virtual ~vtkXMLDataHeader() = default; static inline vtkXMLDataHeader* New(int width, size_t count); }; template class vtkXMLDataHeaderImpl : public vtkXMLDataHeader { std::vector Header; public: vtkXMLDataHeaderImpl(size_t n) : Header(n, 0) { } void Resize(size_t count) override { this->Header.resize(count, 0); } vtkTypeUInt64 Get(size_t index) const override { return this->Header[index]; } bool Set(size_t index, vtkTypeUInt64 value) override { this->Header[index] = T(value); return vtkTypeUInt64(this->Header[index]) == value; } size_t WordSize() const override { return sizeof(T); } size_t WordCount() const override { return this->Header.size(); } unsigned char* Data() override { return reinterpret_cast(&this->Header[0]); } }; vtkXMLDataHeader* vtkXMLDataHeader::New(int width, size_t count) { switch (width) { case 32: return new vtkXMLDataHeaderImpl(count); case 64: return new vtkXMLDataHeaderImpl(count); } return nullptr; } #endif // VTK-HeaderTest-Exclude: vtkXMLDataHeaderPrivate.h