DNA Calib 1.1
Project brief
Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Private Types | Private Attributes | List of all members
terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder > Class Template Reference

#include <OutputArchive.h>

Inheritance diagram for terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >:
Inheritance graph
Collaboration diagram for terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >:
Collaboration graph

Public Types

using SizeType = TSize
 
using OffsetType = TOffset
 

Public Member Functions

 ExtendableBinaryOutputArchive (TExtender *extender, TStream *stream_)
 
bool isOk ()
 
void sync ()
 
void label (const char *)
 
- Public Member Functions inherited from terse::Archive< TExtender >
 Archive (TExtender *impl_)
 
bool isOk ()
 
void sync ()
 
void label (const char *value)
 
void operator() (Args &&... args)
 
TExtender & operator<< (TSerializable &source)
 
TExtender & operator>> (TSerializable &dest)
 
void * getUserData () const
 
void setUserData (void *data)
 

Static Public Member Functions

static constexpr Endianness endianness ()
 

Protected Member Functions

template<typename T >
void process (Transparent< T > &&source)
 
void process (Anchor< OffsetType > &source)
 
void process (ArchiveOffset< OffsetType > &source)
 
void process (typename ArchiveOffset< OffsetType >::Proxy &source)
 
void process (typename ArchiveOffset< OffsetType >::Proxy &&source)
 
void process (ArchiveSize< SizeType, OffsetType > &source)
 
void process (typename ArchiveSize< SizeType, OffsetType >::Proxy &source)
 
void process (typename ArchiveSize< SizeType, OffsetType >::Proxy &&source)
 
template<typename T , typename ... Args>
void process (const Blob< T, Args... > &source)
 
template<typename T >
std::enable_if< traits::has_save_member< T >::value, void >::type process (const T &source)
 
template<typename T >
std::enable_if< traits::has_serialize_member< T >::value, void >::type process (const T &source)
 
template<typename T >
std::enable_if< traits::has_save_function< T >::value, void >::type process (const T &source)
 
template<typename T >
std::enable_if< traits::has_serialize_function< T >::value, void >::type process (const T &source)
 
template<typename T >
std::enable_if<!traits::has_save_member< T >::value &&!traits::has_serialize_member< T >::value &&!traits::has_save_function< T >::value &&!traits::has_serialize_function< T >::value, void >::type process (const T &source)
 
template<typename T , std::size_t N>
void process (const std::array< T, N > &source)
 
template<typename T , typename ... Args>
void process (const std::vector< T, Args... > &source)
 
template<typename T , typename ... Args>
void process (const DynArray< T, Args... > &source)
 
template<typename T , typename ... Args>
void process (const std::basic_string< T, Args... > &source)
 
template<typename K , typename V >
void process (const std::pair< K, V > &source)
 
template<typename K , typename V >
void process (const std::tuple< K, V > &source)
 
void processSize (std::size_t size)
 
template<class TContainer >
std::enable_if<!traits::is_batchable< TContainer >::value >::type processElements (const TContainer &source)
 
template<class TContainer >
std::enable_if< traits::is_batchable< TContainer >::value &&traits::has_wide_elements< TContainer >::value >::type processElements (const TContainer &source)
 
template<class TContainer >
std::enable_if< traits::is_batchable< TContainer >::value &&!traits::has_wide_elements< TContainer >::value >::type processElements (const TContainer &source)
 
- Protected Member Functions inherited from terse::Archive< TExtender >
void dispatch (Head &&head)
 
void dispatch (Head &&head, Tail &&... tail)
 

Private Types

using BaseArchive = Archive< TExtender >
 

Private Attributes

TStream * stream
 

Member Typedef Documentation

◆ BaseArchive

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
using terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::BaseArchive = Archive<TExtender>
private

◆ OffsetType

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
using terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::OffsetType = TOffset

◆ SizeType

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
using terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::SizeType = TSize

Constructor & Destructor Documentation

◆ ExtendableBinaryOutputArchive()

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::ExtendableBinaryOutputArchive ( TExtender *  extender,
TStream *  stream_ 
)
inline
52 : BaseArchive{extender}, stream{stream_} {
53 }
TStream * stream
Definition: binary/OutputArchive.h:258
Archive< TExtender > BaseArchive
Definition: binary/OutputArchive.h:40

Member Function Documentation

◆ endianness()

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
static constexpr Endianness terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::endianness ( )
inlinestaticconstexpr
47 {
48 return EByteOrder;
49 }

◆ isOk()

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
bool terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::isOk ( )
inline
55 {
56 return true;
57 }

◆ label()

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
void terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::label ( const char *  )
inline
62 {
63 }

◆ process() [1/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
void terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( Anchor< OffsetType > &  source)
inlineprotected
71 {
72 source.value = static_cast<OffsetType>(stream->tell());
73 }
TOffset OffsetType
Definition: binary/OutputArchive.h:45

References terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::stream, and terse::Anchor< TOffset >::value.

◆ process() [2/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
void terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( ArchiveOffset< OffsetType > &  source)
inlineprotected
75 {
76 // Record the position where the offset is going to be written so it can be seeked to later when
77 // its proxy is found
78 #if !defined(__clang__) && defined(__GNUC__)
79 #pragma GCC diagnostic push
80 #pragma GCC diagnostic ignored "-Wuseless-cast"
81 #endif
82 source.position = static_cast<decltype(source.position)>(stream->tell());
83 #if !defined(__clang__) && defined(__GNUC__)
84 #pragma GCC diagnostic pop
85 #endif
86 // Since the actual offset value is not yet known at the time when its declaration is encountered,
87 // fill its place with zeros as a placeholder, and it will be later populated when its associated
88 // proxy is found
90 }
void process(Transparent< T > &&source)
Definition: binary/OutputArchive.h:67
TOffset ValueType
Definition: ArchiveOffset.h:29

References terse::ArchiveOffset< TOffset >::position, terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process(), and terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::stream.

◆ process() [3/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
void terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( ArchiveSize< SizeType, OffsetType > &  source)
inlineprotected
109 {
110 // Record the position where the size is going to be written so it can be seeked to later when
111 // its proxy is found
112 #if !defined(__clang__) && defined(__GNUC__)
113 #pragma GCC diagnostic push
114 #pragma GCC diagnostic ignored "-Wuseless-cast"
115 #endif
116 source.position = static_cast<decltype(source.position)>(stream->tell());
117 #if !defined(__clang__) && defined(__GNUC__)
118 #pragma GCC diagnostic pop
119 #endif
120 // Since the actual size value is not yet known at the time when it's declaration is encountered,
121 // fill it's place with zeros as a placeholder, and it will be later populated when it's associated
122 // proxy is found
124 }
TSize ValueType
Definition: ArchiveSize.h:35

References terse::ArchiveSize< TSize, TOffset >::position, terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process(), and terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::stream.

◆ process() [4/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<typename T , typename ... Args>
void terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( const Blob< T, Args... > &  source)
inlineprotected
147 {
148 using ValueType = typename Blob<T, Args...>::value_type;
149 if (source.size() != 0ul) {
150 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
151 stream->write(reinterpret_cast<const char*>(source.data()), source.size() * sizeof(ValueType));
152 }
153 }

References terse::Blob< T, TAllocator >::data(), terse::Blob< T, TAllocator >::size(), and terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::stream.

◆ process() [5/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<typename T , typename ... Args>
void terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( const DynArray< T, Args... > &  source)
inlineprotected
202 {
203 processSize(source.size());
204 processElements(source);
205 }
std::enable_if<!traits::is_batchable< TContainer >::value >::type processElements(const TContainer &source)
Definition: binary/OutputArchive.h:232
void processSize(std::size_t size)
Definition: binary/OutputArchive.h:225

References terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::processElements(), terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::processSize(), and terse::DynArray< T, TAllocator >::size().

◆ process() [6/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<typename T , std::size_t N>
void terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( const std::array< T, N > &  source)
inlineprotected

◆ process() [7/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<typename T , typename ... Args>
void terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( const std::basic_string< T, Args... > &  source)
inlineprotected

◆ process() [8/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<typename K , typename V >
void terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( const std::pair< K, V > &  source)
inlineprotected
214 {
215 BaseArchive::dispatch(source.first);
216 BaseArchive::dispatch(source.second);
217 }
void dispatch(Head &&head)
Definition: Archive.h:61

References terse::Archive< TExtender >::dispatch().

◆ process() [9/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<typename K , typename V >
void terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( const std::tuple< K, V > &  source)
inlineprotected
220 {
221 BaseArchive::dispatch(std::get<0>(source));
222 BaseArchive::dispatch(std::get<1>(source));
223 }

References terse::Archive< TExtender >::dispatch().

◆ process() [10/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<typename T , typename ... Args>
void terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( const std::vector< T, Args... > &  source)
inlineprotected

◆ process() [11/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<typename T >
std::enable_if< traits::has_save_member< T >::value, void >::type terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( const T &  source)
inlineprotected
157 {
158 const_cast<T&>(source).save(*static_cast<TExtender*>(this));
159 }

◆ process() [12/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<typename T >
std::enable_if< traits::has_serialize_member< T >::value, void >::type terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( const T &  source)
inlineprotected
163 {
164 const_cast<T&>(source).serialize(*static_cast<TExtender*>(this));
165 }

◆ process() [13/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<typename T >
std::enable_if< traits::has_save_function< T >::value, void >::type terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( const T &  source)
inlineprotected
169 {
170 save(*static_cast<TExtender*>(this), const_cast<T&>(source));
171 }

◆ process() [14/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<typename T >
std::enable_if< traits::has_serialize_function< T >::value, void >::type terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( const T &  source)
inlineprotected
175 {
176 serialize(*static_cast<TExtender*>(this), const_cast<T&>(source));
177 }

◆ process() [15/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<typename T >
std::enable_if<!traits::has_save_member< T >::value &&!traits::has_serialize_member< T >::value &&!traits::has_save_function< T >::value &&!traits::has_serialize_function< T >::value, void >::type terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( const T &  source)
inlineprotected
182 {
183 T swapped;
184 std::memcpy(&swapped, &source, sizeof(T));
185 SwapTo<EByteOrder>::swap(swapped);
186 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
187 stream->write(reinterpret_cast<char*>(&swapped), sizeof(T));
188 }

References terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::stream.

◆ process() [16/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<typename T >
void terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( Transparent< T > &&  source)
inlineprotected

◆ process() [17/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
void terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( typename ArchiveOffset< OffsetType >::Proxy &&  source)
inlineprotected

◆ process() [18/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
void terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( typename ArchiveOffset< OffsetType >::Proxy &  source)
inlineprotected
92 {
93 // The current position of the stream needs to be written to the position where the associated
94 // `ArchiveOffset` is found.
95 auto current = stream->tell();
96 assert(current <= std::numeric_limits<OffsetType>::max());
97 source.target->value = static_cast<OffsetType>(current);
98 // Seek to the actual position of the offset marker and write the stream's above captured position there
99 stream->seek(source.target->position);
100 process(static_cast<OffsetType>(current));
101 // Return to the earlier captured stream position so processing can safely resume from there
102 stream->seek(current);
103 }

References terse::ArchiveOffset< TOffset >::position, terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process(), terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::stream, terse::ArchiveOffset< TOffset >::Proxy::target, and terse::ArchiveOffset< TOffset >::value.

◆ process() [19/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
void terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( typename ArchiveSize< SizeType, OffsetType >::Proxy &&  source)
inlineprotected

◆ process() [20/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
void terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( typename ArchiveSize< SizeType, OffsetType >::Proxy &  source)
inlineprotected
126 {
127 // The current position of the stream minus the base offset needs to be written to the position
128 // where the associated `ArchiveSize` is found.
129 const auto current = stream->tell();
130 assert(source.base != nullptr);
131 assert(source.base->value <= current);
132 auto size = current - source.base->value;
133 assert(size <= std::numeric_limits<SizeType>::max());
134 source.target->value = static_cast<SizeType>(size);
135 // Seek to the actual position of the size marker and write the above calculated size
136 stream->seek(source.target->position);
137 process(static_cast<SizeType>(size));
138 // Return to the earlier captured stream position so processing can safely resume from there
139 stream->seek(current);
140 }
TSize SizeType
Definition: binary/OutputArchive.h:44

References terse::ArchiveSize< TSize, TOffset >::Proxy::base, terse::ArchiveSize< TSize, TOffset >::position, terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process(), terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::stream, terse::ArchiveSize< TSize, TOffset >::Proxy::target, and terse::ArchiveSize< TSize, TOffset >::value.

◆ processElements() [1/3]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<class TContainer >
std::enable_if<!traits::is_batchable< TContainer >::value >::type terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::processElements ( const TContainer &  source)
inlineprotected

◆ processElements() [2/3]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<class TContainer >
std::enable_if< traits::is_batchable< TContainer >::value &&traits::has_wide_elements< TContainer >::value >::type terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::processElements ( const TContainer &  source)
inlineprotected
240 {
241 for (const auto& element : source) {
242 BaseArchive::dispatch(element);
243 }
244 }

References terse::Archive< TExtender >::dispatch().

◆ processElements() [3/3]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<class TContainer >
std::enable_if< traits::is_batchable< TContainer >::value &&!traits::has_wide_elements< TContainer >::value >::type terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::processElements ( const TContainer &  source)
inlineprotected
248 {
249 using ValueType = typename TContainer::value_type;
250 const auto size = source.size();
251 if (size != 0ul) {
252 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
253 stream->write(reinterpret_cast<const char*>(&source[0]), size * sizeof(ValueType));
254 }
255 }

References terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::stream.

◆ processSize()

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
void terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::processSize ( std::size_t  size)
inlineprotected

◆ sync()

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
void terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::sync ( )
inline
59 {
60 }

Member Data Documentation

◆ stream

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
TStream* terse::ExtendableBinaryOutputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::stream
private

The documentation for this class was generated from the following file: