1 /*=========================================================================
2 
3   Program:   Visualization Toolkit
4   Module:    vtkXMLDataHeaderPrivate.h
5 
6   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7   All rights reserved.
8   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10      This software is distributed WITHOUT ANY WARRANTY; without even
11      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12      PURPOSE.  See the above copyright notice for more information.
13 
14 =========================================================================*/
15 
16 #ifndef vtkXMLDataHeaderPrivate_DoNotInclude
17 # error "do not include unless you know what you are doing"
18 #endif
19 
20 #ifndef vtkXMLDataHeaderPrivate_h
21 #define vtkXMLDataHeaderPrivate_h
22 
23 #include "vtkType.h"
24 #include <vector>
25 
26 // Abstract interface using type vtkTypeUInt64 to access an array
27 // of either vtkTypeUInt32 or vtkTypeUInt64.  Shared by vtkXMLWriter
28 // and vtkXMLDataParser to write/read binary data headers.
29 class vtkXMLDataHeader
30 {
31 public:
32   virtual void Resize(size_t count) = 0;
33   virtual vtkTypeUInt64 Get(size_t index) const = 0;
34   virtual bool Set(size_t index, vtkTypeUInt64 value) = 0;
35   virtual size_t WordSize() const = 0;
36   virtual size_t WordCount() const = 0;
37   virtual unsigned char* Data() = 0;
DataSize()38   size_t DataSize() const { return this->WordCount()*this->WordSize(); }
~vtkXMLDataHeader()39   virtual ~vtkXMLDataHeader() {}
40   static inline vtkXMLDataHeader* New(int width, size_t count);
41 };
42 
43 template <typename T>
44 class vtkXMLDataHeaderImpl: public vtkXMLDataHeader
45 {
46   std::vector<T> Header;
47 public:
vtkXMLDataHeaderImpl(size_t n)48   vtkXMLDataHeaderImpl(size_t n): Header(n, 0) {}
Resize(size_t count)49   void Resize(size_t count) override
50     { this->Header.resize(count, 0); }
Get(size_t index)51   vtkTypeUInt64 Get(size_t index) const override
52     { return this->Header[index]; }
Set(size_t index,vtkTypeUInt64 value)53   bool Set(size_t index, vtkTypeUInt64 value) override
54   {
55     this->Header[index] = T(value);
56     return vtkTypeUInt64(this->Header[index]) == value;
57   }
WordSize()58   size_t WordSize() const override { return sizeof(T); }
WordCount()59   size_t WordCount() const override { return this->Header.size(); }
Data()60   unsigned char* Data() override
61     { return reinterpret_cast<unsigned char*>(&this->Header[0]); }
62 };
63 
New(int width,size_t count)64 vtkXMLDataHeader* vtkXMLDataHeader::New(int width, size_t count)
65 {
66   switch(width)
67   {
68     case 32: return new vtkXMLDataHeaderImpl<vtkTypeUInt32>(count);
69     case 64: return new vtkXMLDataHeaderImpl<vtkTypeUInt64>(count);
70   }
71   return nullptr;
72 }
73 
74 #endif
75 // VTK-HeaderTest-Exclude: vtkXMLDataHeaderPrivate.h
76