Teuchos - Trilinos Tools Package
Version of the Day
Toggle main menu visibility
Loading...
Searching...
No Matches
comm
src
Teuchos_SerializerHelpers.hpp
1
// @HEADER
2
// *****************************************************************************
3
// Teuchos: Common Tools Package
4
//
5
// Copyright 2004 NTESS and the Teuchos contributors.
6
// SPDX-License-Identifier: BSD-3-Clause
7
// *****************************************************************************
8
// @HEADER
9
10
#ifndef TEUCHOS_SERIALIZER_HELPERS_HPP
11
#define TEUCHOS_SERIALIZER_HELPERS_HPP
12
13
#include "Teuchos_Serializer.hpp"
14
#include "
Teuchos_Array.hpp
"
15
16
namespace
Teuchos
{
17
21
template
<
typename
Ordinal,
typename
T>
22
class
ReferenceTypeSerializationBuffer
{
23
public
:
25
ReferenceTypeSerializationBuffer
(
26
const
Serializer<Ordinal,T>
&serializer
27
,
const
Ordinal count, T*
const
buffer[]
28
);
32
~ReferenceTypeSerializationBuffer
();
34
char
*
getCharBuffer
()
const
;
36
Ordinal
getBytes
()
const
;
37
private
:
38
const
Serializer<Ordinal,T>
&serializer_;
39
Ordinal count_;
40
T*
const
*buffer_;
41
Array<char>
charBuffer_;
42
// Not defined and not to be called
43
ReferenceTypeSerializationBuffer
();
44
ReferenceTypeSerializationBuffer
(
const
ReferenceTypeSerializationBuffer
&);
45
ReferenceTypeSerializationBuffer
& operator=(
const
ReferenceTypeSerializationBuffer
&);
46
};
47
51
template
<
typename
Ordinal,
typename
T>
52
class
ConstReferenceTypeSerializationBuffer
{
53
public
:
55
ConstReferenceTypeSerializationBuffer
(
56
const
Serializer<Ordinal,T>
&serializer
57
,
const
Ordinal count,
const
T*
const
buffer[]
58
);
62
~ConstReferenceTypeSerializationBuffer
();
64
const
char
*
getCharBuffer
()
const
;
66
Ordinal
getBytes
()
const
;
67
private
:
68
const
Serializer<Ordinal,T>
&serializer_;
69
Ordinal count_;
70
const
T*
const
*buffer_;
71
Ordinal bytes_;
72
Array<char>
charBuffer_;
73
// Not defined and not to be called
74
ConstReferenceTypeSerializationBuffer
();
75
ConstReferenceTypeSerializationBuffer
(
const
ConstReferenceTypeSerializationBuffer
&);
76
ConstReferenceTypeSerializationBuffer
& operator=(
const
ConstReferenceTypeSerializationBuffer
&);
77
};
78
83
template
<
typename
Ordinal,
typename
T>
84
class
ReferenceTypeDeserializationBuffer
{
85
public
:
87
ReferenceTypeDeserializationBuffer
(
88
const
Serializer<Ordinal,T>
&serializer
89
,
const
Ordinal bytes,
char
charBuffer[]
90
);
94
~ReferenceTypeDeserializationBuffer
();
96
T*
const
*
getBuffer
()
const
;
98
Ordinal
getCount
()
const
;
99
private
:
100
typedef
Array<RCP<T>
> buffer_ptr_t;
101
typedef
Array<T*>
buffer_t;
102
const
Serializer<Ordinal,T>
&serializer_;
103
Ordinal bytes_;
104
char
*charBuffer_;
105
buffer_ptr_t buffer_ptr_;
106
buffer_t buffer_;
107
// Not defined and not to be called
108
ReferenceTypeDeserializationBuffer
();
109
ReferenceTypeDeserializationBuffer
(
const
ReferenceTypeDeserializationBuffer
&);
110
ReferenceTypeDeserializationBuffer
& operator=(
const
ReferenceTypeDeserializationBuffer
&);
111
};
112
117
template
<
typename
Ordinal,
typename
T>
118
class
ConstReferenceTypeDeserializationBuffer
{
119
public
:
121
ConstReferenceTypeDeserializationBuffer
(
122
const
Serializer<Ordinal,T>
&serializer
123
,
const
Ordinal bytes,
const
char
charBuffer[]
124
);
128
~ConstReferenceTypeDeserializationBuffer
();
130
const
T*
const
*
getBuffer
()
const
;
132
Ordinal
getCount
()
const
;
133
private
:
134
typedef
Array<RCP<T>
> buffer_ptr_t;
135
typedef
Array<T*>
buffer_t;
136
const
Serializer<Ordinal,T>
&serializer_;
137
Ordinal bytes_;
138
const
char
*charBuffer_;
139
buffer_ptr_t buffer_ptr_;
140
buffer_t buffer_;
141
// Not defined and not to be called
142
ConstReferenceTypeDeserializationBuffer
();
143
ConstReferenceTypeDeserializationBuffer
(
const
ConstReferenceTypeDeserializationBuffer
&);
144
ConstReferenceTypeDeserializationBuffer
& operator=(
const
ConstReferenceTypeDeserializationBuffer
&);
145
};
146
147
// /////////////////////////////////////
148
// Template implementations
149
150
//
151
// ReferenceTypeSerializationBuffer
152
//
153
154
template
<
typename
Ordinal,
typename
T>
155
ReferenceTypeSerializationBuffer<Ordinal,T>::ReferenceTypeSerializationBuffer
(
156
const
Serializer<Ordinal,T>
&serializer
157
,
const
Ordinal count, T*
const
buffer[]
158
)
159
:serializer_(serializer), count_(count), buffer_(buffer)
160
{
161
const
Ordinal bytes = serializer_.getBufferSize(count_);
162
charBuffer_.resize(bytes);
163
serializer_.serialize(count_,buffer_,bytes,&charBuffer_[0]);
164
}
165
166
template
<
typename
Ordinal,
typename
T>
167
ReferenceTypeSerializationBuffer<Ordinal,T>::~ReferenceTypeSerializationBuffer
()
168
{
169
serializer_.deserialize(charBuffer_.size(),&charBuffer_[0],count_,buffer_);
170
}
171
172
template
<
typename
Ordinal,
typename
T>
173
char
*
ReferenceTypeSerializationBuffer<Ordinal,T>::getCharBuffer
()
const
174
{
175
typedef
ReferenceTypeSerializationBuffer<Ordinal,T>
* this_ptr_t;
176
return
&(
const_cast<
this_ptr_t
>
(
this
)->charBuffer_)[0];
177
// The above const_cast is a better alternative to declaring charBuffer_ to
178
// be mutable, in my opinion.
179
}
180
181
template
<
typename
Ordinal,
typename
T>
182
Ordinal
ReferenceTypeSerializationBuffer<Ordinal,T>::getBytes
()
const
183
{
184
return
charBuffer_.size();
185
}
186
187
//
188
// ConstReferenceTypeSerializationBuffer
189
//
190
191
template
<
typename
Ordinal,
typename
T>
192
ConstReferenceTypeSerializationBuffer<Ordinal,T>::ConstReferenceTypeSerializationBuffer
(
193
const
Serializer<Ordinal,T>
&serializer
194
,
const
Ordinal count,
const
T*
const
buffer[]
195
):
196
serializer_(serializer),
197
count_(count),
198
buffer_(buffer),
199
bytes_(0)
200
{
201
const
Ordinal bytes = serializer_.getBufferSize(count_);
202
charBuffer_.resize(bytes);
203
serializer_.serialize(count_,buffer_,bytes,&charBuffer_[0]);
204
}
205
206
template
<
typename
Ordinal,
typename
T>
207
ConstReferenceTypeSerializationBuffer<Ordinal,T>::~ConstReferenceTypeSerializationBuffer
()
208
{
209
// No need to copy back from the char[] buffer!
210
}
211
212
template
<
typename
Ordinal,
typename
T>
213
const
char
*
ConstReferenceTypeSerializationBuffer<Ordinal,T>::getCharBuffer
()
const
214
{
215
return
&charBuffer_[0];
216
}
217
218
template
<
typename
Ordinal,
typename
T>
219
Ordinal
ConstReferenceTypeSerializationBuffer<Ordinal,T>::getBytes
()
const
220
{
221
return
charBuffer_.size();
222
}
223
224
//
225
// ReferenceTypeDeserializationBuffer
226
//
227
228
template
<
typename
Ordinal,
typename
T>
229
ReferenceTypeDeserializationBuffer<Ordinal,T>::ReferenceTypeDeserializationBuffer
(
230
const
Serializer<Ordinal,T>
&serializer
231
,
const
Ordinal bytes,
char
charBuffer[]
232
)
233
:serializer_(serializer),bytes_(bytes),charBuffer_(charBuffer)
234
{
235
const
Ordinal extent = serializer_.getBufferSize(1);
236
const
Ordinal count = bytes_ / extent;
237
#ifdef TEUCHOS_DEBUG
238
TEUCHOS_TEST_FOR_EXCEPT
( !( bytes_ % extent == 0 ) );
239
#endif
240
buffer_ptr_.resize(count);
241
buffer_.resize(count);
242
for
(
int
i = 0; i < count; ++i ) {
243
buffer_ptr_[i] = serializer_.createObj();
244
buffer_[i] = &*buffer_ptr_[i];
245
}
246
serializer_.deserialize(
247
bytes_,charBuffer_,count,&buffer_[0]
248
);
249
}
250
251
template
<
typename
Ordinal,
typename
T>
252
ReferenceTypeDeserializationBuffer<Ordinal,T>::~ReferenceTypeDeserializationBuffer
()
253
{
254
serializer_.serialize(
255
buffer_.size(),&buffer_[0],bytes_,charBuffer_
256
);
257
}
258
259
template
<
typename
Ordinal,
typename
T>
260
T*
const
*
ReferenceTypeDeserializationBuffer<Ordinal,T>::getBuffer
()
const
261
{
262
typedef
ReferenceTypeDeserializationBuffer<Ordinal,T>
* this_ptr_t;
263
return
&(
const_cast<
this_ptr_t
>
(
this
)->buffer_)[0];
264
// The above const_cast is a better alternative to declaring buffer_ to be
265
// mutable, in my opinion.
266
}
267
268
template
<
typename
Ordinal,
typename
T>
269
Ordinal
ReferenceTypeDeserializationBuffer<Ordinal,T>::getCount
()
const
270
{
271
return
buffer_.size();
272
}
273
274
//
275
// ConstReferenceTypeDeserializationBuffer
276
//
277
278
template
<
typename
Ordinal,
typename
T>
279
ConstReferenceTypeDeserializationBuffer<Ordinal,T>::ConstReferenceTypeDeserializationBuffer
(
280
const
Serializer<Ordinal,T>
&serializer
281
,
const
Ordinal bytes,
const
char
charBuffer[]
282
)
283
:serializer_(serializer),bytes_(bytes),charBuffer_(charBuffer)
284
{
285
const
Ordinal extent = serializer_.getBufferSize(1);
286
const
Ordinal count = bytes_ / extent;
287
#ifdef TEUCHOS_DEBUG
288
TEUCHOS_TEST_FOR_EXCEPT
( !( bytes_ % extent == 0 ) );
289
#endif
290
buffer_ptr_.resize(count);
291
buffer_.resize(count);
292
for
(
int
i = 0; i < count; ++i ) {
293
buffer_ptr_[i] = serializer_.createObj();
294
buffer_[i] = &*buffer_ptr_[i];
295
}
296
serializer_.deserialize(
297
bytes_,charBuffer_,count,&buffer_[0]
298
);
299
}
300
301
template
<
typename
Ordinal,
typename
T>
302
ConstReferenceTypeDeserializationBuffer<Ordinal,T>::~ConstReferenceTypeDeserializationBuffer
()
303
{
304
// We don't need to serialized back into charBuffer_[] since it is constant!
305
}
306
307
template
<
typename
Ordinal,
typename
T>
308
const
T*
const
*
ConstReferenceTypeDeserializationBuffer<Ordinal,T>::getBuffer
()
const
309
{
310
return
&buffer_[0];
311
}
312
313
template
<
typename
Ordinal,
typename
T>
314
Ordinal
ConstReferenceTypeDeserializationBuffer<Ordinal,T>::getCount
()
const
315
{
316
return
buffer_.size();
317
}
318
319
}
// namespace Teuchos
320
321
#endif
// TEUCHOS_SERIALIZER_HELPERS_HPP
Teuchos_Array.hpp
Templated array class derived from the STL std::vector.
Teuchos::Array
Replacement for std::vector that is compatible with the Teuchos Memory Management classes.
Definition
Teuchos_Array.hpp:163
Teuchos::ConstReferenceTypeDeserializationBuffer::getBuffer
const T *const * getBuffer() const
Definition
Teuchos_SerializerHelpers.hpp:308
Teuchos::ConstReferenceTypeDeserializationBuffer::~ConstReferenceTypeDeserializationBuffer
~ConstReferenceTypeDeserializationBuffer()
Reserialize back to the char[] buffer from the internal T*[] buffer.
Definition
Teuchos_SerializerHelpers.hpp:302
Teuchos::ConstReferenceTypeDeserializationBuffer::getCount
Ordinal getCount() const
Definition
Teuchos_SerializerHelpers.hpp:314
Teuchos::ConstReferenceTypeDeserializationBuffer::ConstReferenceTypeDeserializationBuffer
ConstReferenceTypeDeserializationBuffer(const Serializer< Ordinal, T > &serializer, const Ordinal bytes, const char charBuffer[])
Serialize to an internally stored T*[] buffer.
Definition
Teuchos_SerializerHelpers.hpp:279
Teuchos::ConstReferenceTypeSerializationBuffer::getBytes
Ordinal getBytes() const
Definition
Teuchos_SerializerHelpers.hpp:219
Teuchos::ConstReferenceTypeSerializationBuffer::ConstReferenceTypeSerializationBuffer
ConstReferenceTypeSerializationBuffer(const Serializer< Ordinal, T > &serializer, const Ordinal count, const T *const buffer[])
Serialize to an internally stored char[] buffer.
Definition
Teuchos_SerializerHelpers.hpp:192
Teuchos::ConstReferenceTypeSerializationBuffer::getCharBuffer
const char * getCharBuffer() const
Definition
Teuchos_SerializerHelpers.hpp:213
Teuchos::ConstReferenceTypeSerializationBuffer::~ConstReferenceTypeSerializationBuffer
~ConstReferenceTypeSerializationBuffer()
Free the internal char[] buffer (no data to be written back).
Definition
Teuchos_SerializerHelpers.hpp:207
Teuchos::ReferenceTypeDeserializationBuffer::getBuffer
T *const * getBuffer() const
Definition
Teuchos_SerializerHelpers.hpp:260
Teuchos::ReferenceTypeDeserializationBuffer::~ReferenceTypeDeserializationBuffer
~ReferenceTypeDeserializationBuffer()
Reserialize back to the char[] buffer from the internal T*[] buffer.
Definition
Teuchos_SerializerHelpers.hpp:252
Teuchos::ReferenceTypeDeserializationBuffer::ReferenceTypeDeserializationBuffer
ReferenceTypeDeserializationBuffer(const Serializer< Ordinal, T > &serializer, const Ordinal bytes, char charBuffer[])
Serialize to an internally stored T*[] buffer.
Definition
Teuchos_SerializerHelpers.hpp:229
Teuchos::ReferenceTypeDeserializationBuffer::getCount
Ordinal getCount() const
Definition
Teuchos_SerializerHelpers.hpp:269
Teuchos::ReferenceTypeSerializationBuffer::ReferenceTypeSerializationBuffer
ReferenceTypeSerializationBuffer(const Serializer< Ordinal, T > &serializer, const Ordinal count, T *const buffer[])
Serialize to an internally stored char[] buffer.
Definition
Teuchos_SerializerHelpers.hpp:155
Teuchos::ReferenceTypeSerializationBuffer::getBytes
Ordinal getBytes() const
Definition
Teuchos_SerializerHelpers.hpp:182
Teuchos::ReferenceTypeSerializationBuffer::~ReferenceTypeSerializationBuffer
~ReferenceTypeSerializationBuffer()
Deserialize from the interal char[] buffer back to the original T*[] buffer.
Definition
Teuchos_SerializerHelpers.hpp:167
Teuchos::ReferenceTypeSerializationBuffer::getCharBuffer
char * getCharBuffer() const
Definition
Teuchos_SerializerHelpers.hpp:173
Teuchos::Serializer
Strategy interface for the indirect serializing and deserializing objects of a given type handled usi...
Definition
Teuchos_Serializer.hpp:25
TEUCHOS_TEST_FOR_EXCEPT
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
This macro is designed to be a short version of TEUCHOS_TEST_FOR_EXCEPTION() that is easier to call.
Definition
Teuchos_TestForException.hpp:285
Teuchos
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...
Generated by
1.17.0