VTK  9.0.1
Data.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "../Types.h"
4 
5 #include <cstring>
6 
7 namespace RTW
8 {
9  class Data : public Object
10  {
11  public:
12  static size_t GetElementSize(RTWDataType type)
13  {
14  switch (type)
15  {
16  case RTW_OBJECT:
17  return sizeof(Object*);
18  case RTW_UCHAR:
19  return 1;
20  case RTW_UCHAR2:
21  case RTW_SHORT:
22  case RTW_USHORT:
23  return 2;
24  case RTW_UCHAR3:
25  return 3;
26  case RTW_UCHAR4:
27  case RTW_INT:
28  case RTW_FLOAT:
29  return 4;
30  case RTW_INT2:
31  case RTW_FLOAT2:
32  case RTW_DOUBLE:
33  return 8;
34  case RTW_INT3:
35  case RTW_FLOAT3:
36  return 12;
37  case RTW_INT4:
38  case RTW_FLOAT4:
39  case RTW_FLOAT3A:
40  return 16;
41 
42  default:
43  return 0;
44  }
45  }
46 
47  public:
48  Data(size_t numElements, RTWDataType type, const void *source, const uint32_t dataCreationFlags = 0)
49  {
50  this->numElements = numElements;
51  this->type = type;
52  this->elementSize = GetElementSize(type);
53  this->shared = dataCreationFlags & RTW_DATA_SHARED_BUFFER;
54 
55  if (this->shared)
56  {
57  this->data = reinterpret_cast<uint8_t*>(const_cast<void*>(source));
58  }
59  else
60  {
61  size_t size = numElements * this->elementSize;
62  this->data = new uint8_t[size];
63  memcpy(this->data, source, size);
64  }
65 
66  // Increase references
67  if (type == RTW_OBJECT)
68  {
69  for (size_t i = 0; i < this->numElements; ++i)
70  {
71  Object* obj = reinterpret_cast<Object**>(this->data)[i];
72  if (obj)
73  obj->AddRef();
74  }
75  }
76 
77  this->dirty = true;
78  }
79 
81  {
82  // Release references
83  if (type == RTW_OBJECT)
84  {
85  for (size_t i = 0; i < this->numElements; ++i)
86  {
87  Object* obj = reinterpret_cast<Object**>(this->data)[i];
88  if (obj)
89  obj->Release();
90  }
91  }
92 
93  if (!this->shared)
94  delete[] this->data;
95  }
96 
97  void Commit() override
98  {
99  // Committing data marks it as dirty (useful for shared memory)
100  this->dirty = true;
101  }
102 
103  size_t GetNumElements() const
104  {
105  return this->numElements;
106  }
107 
109  {
110  return this->type;
111  }
112 
113  size_t GetElementSize() const
114  {
115  return GetElementSize(this->type);
116  }
117 
118  void* GetData() const
119  {
120  return reinterpret_cast<void*>(this->data);
121  }
122 
123  bool IsShared() const
124  {
125  return this->shared;
126  }
127 
128  bool CheckDirty()
129  {
130  bool d = this->dirty;
131  this->dirty = false;
132  return d;
133  }
134 
135  private:
136  size_t numElements = 0;
137  RTWDataType type;
138  size_t elementSize = 0;
139  uint8_t* data = nullptr;
140  bool shared = false;
141  bool dirty = true;
142  };
143 }
RTW::Data::GetData
void * GetData() const
Definition: Data.h:118
RTW_FLOAT3A
@ RTW_FLOAT3A
Definition: Types.h:66
RTW
Definition: Backend.h:5
RTW::Data::GetElementSize
static size_t GetElementSize(RTWDataType type)
Definition: Data.h:12
RTW_SHORT
@ RTW_SHORT
Definition: Types.h:63
RTW::Data::GetDataType
RTWDataType GetDataType() const
Definition: Data.h:108
RTW_INT3
@ RTW_INT3
Definition: Types.h:65
RTW::Data::IsShared
bool IsShared() const
Definition: Data.h:123
RTW::Object
Definition: Object.h:17
RTW_DATA_SHARED_BUFFER
@ RTW_DATA_SHARED_BUFFER
Definition: Types.h:34
RTW_DOUBLE
@ RTW_DOUBLE
Definition: Types.h:67
RTW_INT
@ RTW_INT
Definition: Types.h:65
RTW_FLOAT4
@ RTW_FLOAT4
Definition: Types.h:66
RTW::Data::Data
Data(size_t numElements, RTWDataType type, const void *source, const uint32_t dataCreationFlags=0)
Definition: Data.h:48
RTW::Data
Definition: Data.h:9
RTW::Data::CheckDirty
bool CheckDirty()
Definition: Data.h:128
vtkX3D::size
@ size
Definition: vtkX3D.h:259
RTW::Object::AddRef
void AddRef()
Definition: Object.h:36
RTW_FLOAT3
@ RTW_FLOAT3
Definition: Types.h:66
RTW_UCHAR2
@ RTW_UCHAR2
Definition: Types.h:62
RTW::Data::GetElementSize
size_t GetElementSize() const
Definition: Data.h:113
RTW_UCHAR4
@ RTW_UCHAR4
Definition: Types.h:62
RTW::Data::Commit
void Commit() override
Definition: Data.h:97
RTW_FLOAT2
@ RTW_FLOAT2
Definition: Types.h:66
RTW_USHORT
@ RTW_USHORT
Definition: Types.h:64
RTW::Data::GetNumElements
size_t GetNumElements() const
Definition: Data.h:103
RTW_UCHAR3
@ RTW_UCHAR3
Definition: Types.h:62
RTW_UCHAR
@ RTW_UCHAR
Definition: Types.h:62
RTW_INT4
@ RTW_INT4
Definition: Types.h:65
RTW::Object::Release
void Release()
Definition: Object.h:41
source
boost::graph_traits< vtkGraph * >::vertex_descriptor source(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
Definition: vtkBoostGraphAdapter.h:959
RTW::Data::~Data
~Data()
Definition: Data.h:80
RTW_OBJECT
@ RTW_OBJECT
Definition: Types.h:61
RTW_FLOAT
@ RTW_FLOAT
Definition: Types.h:66
RTWDataType
RTWDataType
Definition: Types.h:59
RTW_INT2
@ RTW_INT2
Definition: Types.h:65