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

#include <InputArchive.h>

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

Public Types

using SizeType = TSize
 
using OffsetType = TOffset
 

Public Member Functions

 ExtendableBinaryInputArchive (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 > &&dest)
 
void process (Anchor< OffsetType > &dest)
 
void process (ArchiveOffset< OffsetType > &dest)
 
void process (typename ArchiveOffset< OffsetType >::Proxy &dest)
 
void process (typename ArchiveOffset< OffsetType >::Proxy &&dest)
 
void process (ArchiveSize< SizeType, OffsetType > &dest)
 
void process (typename ArchiveSize< SizeType, OffsetType >::Proxy &dest)
 
void process (typename ArchiveSize< SizeType, OffsetType >::Proxy &&dest)
 
template<typename T , typename ... Args>
void process (Blob< T, Args... > &dest)
 
template<typename T >
std::enable_if< traits::has_load_member< T >::value, void >::type process (T &dest)
 
template<typename T >
std::enable_if< traits::has_serialize_member< T >::value, void >::type process (T &dest)
 
template<typename T >
std::enable_if< traits::has_load_function< T >::value, void >::type process (T &dest)
 
template<typename T >
std::enable_if< traits::has_serialize_function< T >::value, void >::type process (T &dest)
 
template<typename T >
std::enable_if<!traits::has_load_member< T >::value &&!traits::has_serialize_member< T >::value &&!traits::has_load_function< T >::value &&!traits::has_serialize_function< T >::value, void >::type process (T &dest)
 
template<typename T , std::size_t N>
void process (std::array< T, N > &dest)
 
template<typename T , typename ... Args>
void process (std::vector< T, Args... > &dest)
 
template<typename T , typename ... Args>
void process (DynArray< T, Args... > &dest)
 
template<typename T , typename ... Args>
void process (std::basic_string< T, Args... > &dest)
 
template<typename K , typename V >
void process (std::pair< K, V > &dest)
 
template<typename K , typename V >
void process (std::tuple< K, V > &dest)
 
std::size_t processSize ()
 
template<class TContainer >
std::enable_if<!traits::is_batchable< TContainer >::value &&traits::has_reserve_member< TContainer >::value &&traits::has_push_back_member< TContainer >::value >::type processElements (TContainer &dest, std::size_t size)
 
template<class TContainer >
std::enable_if<!traits::is_batchable< TContainer >::value &&!traits::has_reserve_member< TContainer >::value &&!traits::has_push_back_member< TContainer >::value >::type processElements (TContainer &dest, std::size_t size)
 
template<class TContainer >
std::enable_if< traits::is_batchable< TContainer >::value &&traits::has_wide_elements< TContainer >::value >::type processElements (TContainer &dest, std::size_t size)
 
template<class TContainer >
std::enable_if< traits::is_batchable< TContainer >::value &&!traits::has_wide_elements< TContainer >::value >::type processElements (TContainer &dest, std::size_t size)
 
- 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 Member Functions

template<class TContainer >
void resize (TContainer &dest, std::size_t size)
 
template<typename T , class TAllocator >
void resize (DynArray< T, TAllocator > &dest, std::size_t size)
 

Private Attributes

TStream * stream
 

Member Typedef Documentation

◆ BaseArchive

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

◆ OffsetType

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

◆ SizeType

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

Constructor & Destructor Documentation

◆ ExtendableBinaryInputArchive()

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

Member Function Documentation

◆ endianness()

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
static constexpr Endianness terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::endianness ( )
inlinestaticconstexpr
44 {
45 return EByteOrder;
46 }

◆ isOk()

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
bool terse::ExtendableBinaryInputArchive< 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::ExtendableBinaryInputArchive< 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::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( Anchor< OffsetType > &  dest)
inlineprotected
71 {
72 dest.value = static_cast<OffsetType>(stream->tell());
73 }
TOffset OffsetType
Definition: binary/InputArchive.h:42

References terse::ExtendableBinaryInputArchive< 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::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( ArchiveOffset< OffsetType > &  dest)
inlineprotected
75 {
76 // Load the offset value itself (this points forward within the stream to the position of
77 // the data with which the offset is associated)
78 process(dest.value);
79 }
void process(Transparent< T > &&dest)
Definition: binary/InputArchive.h:67

References terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process(), and terse::ArchiveOffset< TOffset >::value.

◆ process() [3/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
void terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( ArchiveSize< SizeType, OffsetType > &  dest)
inlineprotected
90 {
91 // Load the size value itself (this value can be combined with an offset to get the end of a data region)
92 process(dest.value);
93 }

References terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process(), and terse::ArchiveSize< TSize, TOffset >::value.

◆ process() [4/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<typename T , typename ... Args>
void terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( Blob< T, Args... > &  dest)
inlineprotected
106 {
107 using ValueType = typename Blob<T, Args...>::value_type;
108 // Blob relies on a predetermined (user specified) size of how much data it should consume
109 if (dest.size() != 0ul) {
110 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
111 stream->read(reinterpret_cast<char*>(dest.data()), dest.size() * sizeof(ValueType));
112 }
113 }

References terse::Blob< T, TAllocator >::data(), terse::Blob< T, TAllocator >::size(), and terse::ExtendableBinaryInputArchive< 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::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( DynArray< T, Args... > &  dest)
inlineprotected
162 {
163 const auto size = processSize();
164 processElements(dest, size);
165 }
std::enable_if<!traits::is_batchable< TContainer >::value &&traits::has_reserve_member< TContainer >::value &&traits::has_push_back_member< TContainer >::value >::type processElements(TContainer &dest, std::size_t size)
Definition: binary/InputArchive.h:196
std::size_t processSize()
Definition: binary/InputArchive.h:185

References terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::processElements(), and terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::processSize().

◆ process() [6/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<typename T , std::size_t N>
void terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( std::array< T, N > &  dest)
inlineprotected
149 {
150 for (auto& element : dest) {
151 BaseArchive::dispatch(element);
152 }
153 }
void dispatch(Head &&head)
Definition: Archive.h:61

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

◆ process() [7/20]

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

◆ process() [8/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<typename K , typename V >
void terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( std::pair< K, V > &  dest)
inlineprotected
174 {
175 BaseArchive::dispatch(dest.first);
176 BaseArchive::dispatch(dest.second);
177 }

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::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( std::tuple< K, V > &  dest)
inlineprotected
180 {
181 BaseArchive::dispatch(std::get<0>(dest));
182 BaseArchive::dispatch(std::get<1>(dest));
183 }

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::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( std::vector< T, Args... > &  dest)
inlineprotected

◆ process() [11/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<typename T >
std::enable_if< traits::has_load_member< T >::value, void >::type terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( T &  dest)
inlineprotected
117 {
118 dest.load(*static_cast<TExtender*>(this));
119 }

◆ 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::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( T &  dest)
inlineprotected
123 {
124 dest.serialize(*static_cast<TExtender*>(this));
125 }

◆ process() [13/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<typename T >
std::enable_if< traits::has_load_function< T >::value, void >::type terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( T &  dest)
inlineprotected
129 {
130 load(*static_cast<TExtender*>(this), dest);
131 }

◆ 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::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( T &  dest)
inlineprotected
135 {
136 serialize(*static_cast<TExtender*>(this), dest);
137 }

◆ process() [15/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<typename T >
std::enable_if<!traits::has_load_member< T >::value &&!traits::has_serialize_member< T >::value &&!traits::has_load_function< T >::value &&!traits::has_serialize_function< T >::value, void >::type terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( T &  dest)
inlineprotected
142 {
143 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
144 stream->read(reinterpret_cast<char*>(&dest), sizeof(T));
145 SwapFrom<EByteOrder>::swap(dest);
146 }

References terse::ExtendableBinaryInputArchive< 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::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( Transparent< T > &&  dest)
inlineprotected

◆ process() [17/20]

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

◆ process() [18/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
void terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( typename ArchiveOffset< OffsetType >::Proxy &  dest)
inlineprotected
81 {
82 // Rely on the offset value stored in the associated `ArchiveOffset` and seek to it
83 stream->seek(dest.target->value);
84 }

References terse::ExtendableBinaryInputArchive< 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::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( typename ArchiveSize< SizeType, OffsetType >::Proxy &&  dest)
inlineprotected

◆ process() [20/20]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
void terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process ( typename ArchiveSize< SizeType, OffsetType >::Proxy &  dest)
inlineprotected
95 {
96 // Calculate the offset + size value stored in the associated `ArchiveSize` and `Anchor` and seek to it
97 assert(dest.base != nullptr);
98 stream->seek(dest.base->value + dest.target->value);
99 }

References terse::ArchiveSize< TSize, TOffset >::Proxy::base, terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::stream, terse::ArchiveSize< TSize, TOffset >::Proxy::target, and terse::ArchiveSize< TSize, TOffset >::value.

◆ processElements() [1/4]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<class TContainer >
std::enable_if<!traits::is_batchable< TContainer >::value &&traits::has_reserve_member< TContainer >::value &&traits::has_push_back_member< TContainer >::value >::type terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::processElements ( TContainer &  dest,
std::size_t  size 
)
inlineprotected
196 {
197 using ValueType = typename TContainer::value_type;
198 dest.clear();
199 dest.reserve(size);
200 for (std::size_t i = 0ul; i < size; ++i) {
201 dest.push_back(impl::ValueFactory<ValueType>::create(dest.get_allocator()));
202 BaseArchive::dispatch(dest.back());
203 }
204 }
static std::enable_if< IsPrimitive, T >::type create(const ParentAllocator &)
Definition: Common.h:36

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

Referenced by terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::process().

◆ processElements() [2/4]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<class TContainer >
std::enable_if<!traits::is_batchable< TContainer >::value &&!traits::has_reserve_member< TContainer >::value &&!traits::has_push_back_member< TContainer >::value >::type terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::processElements ( TContainer &  dest,
std::size_t  size 
)
inlineprotected
210 {
211 resize(dest, size);
212 for (auto& element : dest) {
213 BaseArchive::dispatch(element);
214 }
215 }
void resize(TContainer &dest, std::size_t size)
Definition: binary/InputArchive.h:250

References terse::Archive< TExtender >::dispatch(), and terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::resize().

◆ processElements() [3/4]

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::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::processElements ( TContainer &  dest,
std::size_t  size 
)
inlineprotected
219 {
220 using ValueType = typename TContainer::value_type;
221 if (size != 0ul) {
222 resize(dest, size);
223 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
224 stream->read(reinterpret_cast<char*>(&dest[0]), size * sizeof(ValueType));
225 const std::size_t blockWidth = 16ul / sizeof(ValueType);
226 const std::size_t alignedSize = size - (size % blockWidth);
227 for (std::size_t i = 0ul; i < alignedSize; i += blockWidth) {
228 SwapFrom<EByteOrder>::swap(&dest[i]);
229 }
230
231 for (std::size_t i = alignedSize; i < size; ++i) {
232 SwapFrom<EByteOrder>::swap(dest[i]);
233 }
234 }
235 }

References terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::resize(), and terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::stream.

◆ processElements() [4/4]

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::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::processElements ( TContainer &  dest,
std::size_t  size 
)
inlineprotected
239 {
240 using ValueType = typename TContainer::value_type;
241 if (size != 0ul) {
242 resize(dest, size);
243 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
244 stream->read(reinterpret_cast<char*>(&dest[0]), size * sizeof(ValueType));
245 }
246 }

References terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::resize(), and terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::stream.

◆ processSize()

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

◆ resize() [1/2]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<typename T , class TAllocator >
void terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::resize ( DynArray< T, TAllocator > &  dest,
std::size_t  size 
)
inlineprivate
255 {
256 dest.resize_uninitialized(size);
257 }

References terse::DynArray< T, TAllocator >::resize_uninitialized().

◆ resize() [2/2]

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
template<class TContainer >
void terse::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::resize ( TContainer &  dest,
std::size_t  size 
)
inlineprivate

◆ sync()

template<class TExtender , class TStream , typename TSize , typename TOffset , Endianness EByteOrder>
void terse::ExtendableBinaryInputArchive< 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::ExtendableBinaryInputArchive< TExtender, TStream, TSize, TOffset, EByteOrder >::stream
private

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