Teuchos - Trilinos Tools Package Version of the Day
Loading...
Searching...
No Matches
Teuchos_SerializationTraitsHelpers.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_SERIALIZATION_TRAITS_HELPERS_HPP
11#define TEUCHOS_SERIALIZATION_TRAITS_HELPERS_HPP
12
14#include "Teuchos_ArrayView.hpp"
15#include "Teuchos_Array.hpp"
16
17namespace Teuchos {
18
37template <typename Ordinal, typename T>
54
62template <typename Ordinal, typename T, typename Serializer,
63 bool direct = Serializer::supportsDirectSerialization>
65
73template <typename Ordinal, typename T, typename Serializer,
74 bool direct = Serializer::supportsDirectSerialization>
76
85template <typename Ordinal, typename T, typename Serializer,
86 bool direct = Serializer::supportsDirectSerialization>
88
97template <typename Ordinal, typename T, typename Serializer,
98 bool direct = Serializer::supportsDirectSerialization>
100
106template <typename Ordinal, typename T, typename Serializer>
108public:
111 const Ordinal count, T buffer[],
113 );
119 char* getCharBuffer() const;
121 Ordinal getBytes() const;
123 const ArrayView<char> getCharBufferView() const;
124private:
125 Ordinal count_;
126 T *buffer_;
127 Ordinal bytes_;
128 char *charBuffer_;
129 RCP<const Serializer> serializer_;
130 // Not defined and not to be called
134};
135
141template <typename Ordinal, typename T, typename Serializer>
143public:
146 const Ordinal count, const T buffer[],
148 );
154 const char* getCharBuffer() const;
156 Ordinal getBytes() const;
158 const ArrayView<const char> getCharBufferView() const;
159private:
160 Ordinal count_;
161 const T *buffer_;
162 Ordinal bytes_;
163 const char *charBuffer_;
164 RCP<const Serializer> serializer_;
165 // Not defined and not to be called
169};
170
177template <typename Ordinal, typename T, typename Serializer>
179public:
182 const Ordinal bytes, char charBuffer[],
184 );
190 T* getBuffer() const;
192 Ordinal getCount() const;
193private:
194 Ordinal bytes_;
195 char *charBuffer_;
196 Ordinal count_;
197 T *buffer_;
198 RCP<const Serializer> serializer_;
199 // Not defined and not to be called
203};
204
211template <typename Ordinal, typename T, typename Serializer>
213public:
216 const Ordinal bytes, const char charBuffer[],
218 );
224 const T* getBuffer() const;
226 Ordinal getCount() const;
227private:
228 Ordinal bytes_;
229 const char *charBuffer_;
230 Ordinal count_;
231 const T *buffer_;
232 RCP<const Serializer> serializer_;
233 // Not defined and not to be called
237};
238
244template <typename Ordinal, typename T, typename Serializer>
246public:
249 const Ordinal count, T buffer[],
251 );
257 char* getCharBuffer() const;
259 Ordinal getBytes() const;
261 const ArrayView<char> getCharBufferView() const;
262private:
263 Ordinal count_;
264 T *buffer_;
265 Ordinal bytes_;
266 mutable Array<char> charBuffer_;
267 RCP<const Serializer> serializer_;
268 // Not defined and not to be called
272};
273
279template <typename Ordinal, typename T, typename Serializer>
281public:
284 const Ordinal count, const T buffer[],
286 );
292 const char* getCharBuffer() const;
294 Ordinal getBytes() const;
296 const ArrayView<const char> getCharBufferView() const;
297private:
298 Ordinal count_;
299 const T *buffer_;
300 Ordinal bytes_;
301 Array<char> charBuffer_;
302 RCP<const Serializer> serializer_;
303 // Not defined and not to be called
307};
308
315template <typename Ordinal, typename T, typename Serializer>
317public:
320 const Ordinal bytes, char charBuffer[],
322 );
328 T* getBuffer() const;
330 Ordinal getCount() const;
331private:
332 Ordinal bytes_;
333 char *charBuffer_;
334 Ordinal count_;
335 mutable Array<T> buffer_;
336 RCP<const Serializer> serializer_;
337 // Not defined and not to be called
341};
342
349template <typename Ordinal, typename T, typename Serializer>
351public:
354 const Ordinal bytes, const char charBuffer[],
356 );
362 const T* getBuffer() const;
364 Ordinal getCount() const;
365private:
366 Ordinal bytes_;
367 const char *charBuffer_;
368 Ordinal count_;
369 Array<T> buffer_;
370 RCP<const Serializer> serializer_;
371 // Not defined and not to be called
375};
376
377
381template <typename Ordinal, typename T,
384 public ValueTypeSerializationBufferImp<Ordinal,T,Serializer> {
385public:
389 const Ordinal count, T buffer[],
391 ) : Base(count,buffer,serializer) {}
392};
393
397template <typename Ordinal, typename T,
398 typename Serializer = typename DefaultSerializer<Ordinal,T>::DefaultSerializerType>
409
414template <typename Ordinal, typename T,
415 typename Serializer = typename DefaultSerializer<Ordinal,T>::DefaultSerializerType>
426
431template <typename Ordinal, typename T,
432 typename Serializer = typename DefaultSerializer<Ordinal,T>::DefaultSerializerType>
443
450template <typename Ordinal, typename T>
451class ValueTypeSerializationBuffer<Ordinal,T,typename DefaultSerializer<Ordinal,T>::DefaultSerializerType> :
452 public ValueTypeSerializationBufferImp<Ordinal,T,typename DefaultSerializer<Ordinal,T>::DefaultSerializerType> {
453public:
454 typedef DefaultSerializer<Ordinal,T> DS; // work around for parsing bug in gcc 4.1-4.2
455 typedef typename DS::DefaultSerializerType Serializer;
459 const Ordinal count, T buffer[],
460 const RCP<const Serializer>& serializer = DS::getDefaultSerializerRCP()
461 ) : Base(count,buffer,serializer) {}
462};
463
470template <typename Ordinal, typename T>
471class ConstValueTypeSerializationBuffer<Ordinal,T,typename DefaultSerializer<Ordinal,T>::DefaultSerializerType> :
472 public ConstValueTypeSerializationBufferImp<Ordinal,T,typename DefaultSerializer<Ordinal,T>::DefaultSerializerType> {
473public:
474 typedef DefaultSerializer<Ordinal,T> DS; // work around for parsing bug in gcc 4.1-4.2
475 typedef typename DS::DefaultSerializerType Serializer;
479 const Ordinal count, const T buffer[],
480 const RCP<const Serializer>& serializer = DS::getDefaultSerializerRCP()
481 ) : Base(count,buffer,serializer) {}
482};
483
491template <typename Ordinal, typename T>
492class ValueTypeDeserializationBuffer<Ordinal,T,typename DefaultSerializer<Ordinal,T>::DefaultSerializerType> :
493 public ValueTypeDeserializationBufferImp<Ordinal,T,typename DefaultSerializer<Ordinal,T>::DefaultSerializerType> {
494public:
495 typedef DefaultSerializer<Ordinal,T> DS; // work around for parsing bug in gcc 4.1-4.2
496 typedef typename DS::DefaultSerializerType Serializer;
500 const Ordinal bytes, char charBuffer[],
501 const RCP<const Serializer>& serializer = DS::getDefaultSerializerRCP()
503};
504
512template <typename Ordinal, typename T>
513class ConstValueTypeDeserializationBuffer<Ordinal,T,typename DefaultSerializer<Ordinal,T>::DefaultSerializerType> :
514 public ConstValueTypeDeserializationBufferImp<Ordinal,T,typename DefaultSerializer<Ordinal,T>::DefaultSerializerType> {
515public:
516 typedef DefaultSerializer<Ordinal,T> DS; // work around for parsing bug in gcc 4.1-4.2
517 typedef typename DS::DefaultSerializerType Serializer;
521 const Ordinal bytes, const char charBuffer[],
522 const RCP<const Serializer>& serializer = DS::getDefaultSerializerRCP()
524};
525
526// /////////////////////////////////////
527// Template implementations for direct serialization
528
529//
530// ValueTypeSerializationBufferImp
531//
532
533template <typename Ordinal, typename T, typename Serializer>
536 const Ordinal count, T buffer[], const RCP<const Serializer>& serializer
537 )
538 :count_(count), buffer_(buffer), serializer_(serializer)
539{
540 bytes_ = serializer_->fromCountToDirectBytes(count_);
541 charBuffer_ = serializer_->convertToCharPtr(buffer_);
542}
543
544template <typename Ordinal, typename T, typename Serializer>
547{
548 // There is nothing to do since the type uses direct serialization!
549}
550
551template <typename Ordinal, typename T, typename Serializer>
553getCharBuffer() const
554{
555 return charBuffer_;
556}
557
558template <typename Ordinal, typename T, typename Serializer>
560getBytes() const
561{
562 return bytes_;
563}
564
565
566template <typename Ordinal, typename T, typename Serializer>
567const ArrayView<char>
569getCharBufferView() const
570{
571 return arrayView(charBuffer_, bytes_);
572}
573
574
575//
576// ConstValueTypeSerializationBufferImp
577//
578
579template <typename Ordinal, typename T, typename Serializer>
582 const Ordinal count, const T buffer[], const RCP<const Serializer>& serializer
583 )
584 :count_(count), buffer_(buffer), serializer_(serializer)
585{
586 bytes_ = serializer_->fromCountToDirectBytes(count_);
587 charBuffer_ = serializer_->convertToCharPtr(buffer_);
588}
589
590template <typename Ordinal, typename T, typename Serializer>
593{
594 // There is nothing to do since the type uses direct serialization!
595}
596
597template <typename Ordinal, typename T, typename Serializer>
599getCharBuffer() const
600{
601 return charBuffer_;
602}
603
604template <typename Ordinal, typename T, typename Serializer>
610
611template <typename Ordinal, typename T, typename Serializer>
614getCharBufferView() const
615{
616 return arrayView(charBuffer_, bytes_);
617}
618
619//
620// ValueTypeDeserializationBufferImp
621//
622
623template <typename Ordinal, typename T, typename Serializer>
626 const Ordinal bytes, char charBuffer[], const RCP<const Serializer>& serializer
627 )
628 :bytes_(bytes), charBuffer_(charBuffer), serializer_(serializer)
629{
630 count_ = serializer_->fromDirectBytesToCount(bytes_);
631 buffer_ = serializer_->convertFromCharPtr(charBuffer_);
632}
633
634template <typename Ordinal, typename T, typename Serializer>
637{
638 // There is nothing to do since the type uses direct serialization!
639}
640
641template <typename Ordinal, typename T, typename Serializer>
647
648template <typename Ordinal, typename T, typename Serializer>
650getCount() const
651{
652 return count_;
653}
654
655//
656// ConstValueTypeDeserializationBufferImp
657//
658
659template <typename Ordinal, typename T, typename Serializer>
662 const Ordinal bytes, const char charBuffer[], const RCP<const Serializer>& serializer
663 )
664 :bytes_(bytes), charBuffer_(charBuffer), serializer_(serializer)
665{
666 count_ = serializer_->fromDirectBytesToCount(bytes_);
667 buffer_ = serializer_->convertFromCharPtr(charBuffer_);
668}
669
670template <typename Ordinal, typename T, typename Serializer>
673{
674 // There is nothing to do since the type uses direct serialization!
675}
676
677template <typename Ordinal, typename T, typename Serializer>
683
684template <typename Ordinal, typename T, typename Serializer>
690
691
692// /////////////////////////////////////
693// Template implementations for indirect specializations
694
695//
696// ValueTypeSerializationBufferImp
697//
698
699template <typename Ordinal, typename T, typename Serializer>
702 const Ordinal count, T buffer[], const RCP<const Serializer>& serializer
703 )
704 :count_(count), buffer_(buffer), serializer_(serializer)
705{
706 bytes_ = serializer_->fromCountToIndirectBytes(count_, buffer_);
707 charBuffer_.resize(bytes_);
708 serializer_->serialize(count_, buffer_, bytes_, &charBuffer_[0]);
709}
710
711template <typename Ordinal, typename T, typename Serializer>
714{
715 serializer_->deserialize(bytes_, &charBuffer_[0], count_, buffer_);
716}
717
718template <typename Ordinal, typename T, typename Serializer>
720getCharBuffer() const
721{
722 return &charBuffer_[0];
723}
724
725template <typename Ordinal, typename T, typename Serializer>
727getBytes() const
728{
729 return bytes_;
730}
731
732template <typename Ordinal, typename T, typename Serializer>
733const ArrayView<char>
735getCharBufferView() const
736{
737 return charBuffer_.view(0, bytes_);
738}
739
740
741//
742// ConstValueTypeSerializationBufferImp
743//
744
745template <typename Ordinal, typename T, typename Serializer>
748 const Ordinal count, const T buffer[], const RCP<const Serializer>& serializer
749 )
750 :count_(count), buffer_(buffer), serializer_(serializer)
751{
752 bytes_ = serializer_->fromCountToIndirectBytes(count_, buffer_);
753 charBuffer_.resize(bytes_);
754 serializer_->serialize(count_, buffer_, bytes_, &charBuffer_[0]);
755}
756
757template <typename Ordinal, typename T, typename Serializer>
762
763template <typename Ordinal, typename T, typename Serializer>
765getCharBuffer() const
766{
767 return &charBuffer_[0];
768}
769
770template <typename Ordinal, typename T, typename Serializer>
776
777template <typename Ordinal, typename T, typename Serializer>
780getCharBufferView() const
781{
782 return charBuffer_.view(0, bytes_);
783}
784
785//
786// ValueTypeDeserializationBufferImp
787//
788
789template <typename Ordinal, typename T, typename Serializer>
792 const Ordinal bytes, char charBuffer[], const RCP<const Serializer>& serializer
793 )
794 :bytes_(bytes), charBuffer_(charBuffer), serializer_(serializer)
795{
796 count_ = serializer_->fromIndirectBytesToCount(bytes_, charBuffer_);
797 buffer_.resize(count_);
798 serializer_->deserialize(bytes_, charBuffer_, count_, &buffer_[0]);
799}
800
801template <typename Ordinal, typename T, typename Serializer>
804{
805 serializer_->serialize(count_, &buffer_[0], bytes_, charBuffer_);
806}
807
808template <typename Ordinal, typename T, typename Serializer>
814
815template <typename Ordinal, typename T, typename Serializer>
817getCount() const
818{
819 return count_;
820}
821
822//
823// ConstValueTypeDeserializationBufferImp
824//
825
826template <typename Ordinal, typename T, typename Serializer>
829 const Ordinal bytes, const char charBuffer[], const RCP<const Serializer>& serializer
830 )
831 :bytes_(bytes), charBuffer_(charBuffer), serializer_(serializer)
832{
833 count_ = serializer_->fromIndirectBytesToCount(bytes_, charBuffer_);
834 buffer_.resize(count_);
835 serializer_->deserialize(bytes_, charBuffer_, count_, &buffer_[0]);
836}
837
838template <typename Ordinal, typename T, typename Serializer>
843
844template <typename Ordinal, typename T, typename Serializer>
846getBuffer() const
847{
848 return &buffer_[0];
849}
850
851template <typename Ordinal, typename T, typename Serializer>
857
858} // namespace Teuchos
859
860#endif // TEUCHOS_SERIALIZATION_TRAITS_HELPERS_HPP
Templated array class derived from the STL std::vector.
Teuchos::SerializationTraits and Teuchos::DirectSerializationTraits definitions.
Encapsulate how an array of non-const serialized objects with value sematics stored in a char[] array...
ConstValueTypeDeserializationBuffer(const Ordinal bytes, const char charBuffer[], const RCP< const Serializer > &serializer=DS::getDefaultSerializerRCP())
Serialize to an internally stored char[] buffer.
Encapsulate how an array of non-const serialized objects with value sematics stored in a char[] array...
ConstValueTypeDeserializationBuffer(const Ordinal bytes, const char charBuffer[], const RCP< const Serializer > &serializer)
Serialize to an internally stored char[] buffer.
Encapsulate how an array of const objects with value sematics is serialized into a const char[] array...
ConstValueTypeSerializationBuffer(const Ordinal count, const T buffer[], const RCP< const Serializer > &serializer=DS::getDefaultSerializerRCP())
Serialize to an internally stored char[] buffer.
Encapsulate how an array of const objects with value sematics is serialized into a const char[] array...
ConstValueTypeSerializationBuffer(const Ordinal count, const T buffer[], const RCP< const Serializer > &serializer)
Serialize to an internally stored char[] buffer.
A class for instantiating a default serialization object.
static DefaultSerializerType getDefaultSerializer()
Return an instance of the default serializer.
SerializationTraits< Ordinal, T > DefaultSerializerType
Typename of default serializer.
static Teuchos::RCP< DefaultSerializerType > getDefaultSerializerRCP()
Return an RCP of an instance of the default serializer.
Smart reference counting pointer class for automatic garbage collection.
Strategy interface for the indirect serializing and deserializing objects of a given type handled usi...
Encapsulate how an array of non-const serialized objects with value sematics stored in a char[] array...
ValueTypeDeserializationBuffer(const Ordinal bytes, char charBuffer[], const RCP< const Serializer > &serializer=DS::getDefaultSerializerRCP())
Serialize to an internally stored char[] buffer.
Encapsulate how an array of non-const serialized objects with value sematics stored in a char[] array...
ValueTypeDeserializationBuffer(const Ordinal bytes, char charBuffer[], const RCP< const Serializer > &serializer)
Serialize to an internally stored char[] buffer.
Encapsulate how an array of non-const objects with value sematics is serialized into a char[] array.
ValueTypeSerializationBuffer(const Ordinal count, T buffer[], const RCP< const Serializer > &serializer=DS::getDefaultSerializerRCP())
Serialize to an internally stored char[] buffer.
Encapsulate how an array of non-const objects with value sematics is serialized into a char[] array.
ValueTypeSerializationBuffer(const Ordinal count, T buffer[], const RCP< const Serializer > &serializer)
Serialize to an internally stored char[] buffer.
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Deprecated.