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

#include <InputArchive.h>

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

Classes

struct  SerializationState
 

Public Types

using SizeType = TSize
 
using OffsetType = TOffset
 

Public Member Functions

 ExtendableJSONInputArchive (TExtender *extender, TStream *stream_)
 
bool isOk () const
 
void sync ()
 
void label (const char *value)
 
- 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)
 

Protected Member Functions

template<typename T >
void process (Transparent< T > &&dest)
 
void process (Anchor< OffsetType > &)
 
void process (ArchiveOffset< OffsetType > &dest)
 
void process (typename ArchiveOffset< OffsetType >::Proxy &)
 
void process (typename ArchiveOffset< OffsetType >::Proxy &&)
 
void process (ArchiveSize< SizeType, OffsetType > &dest)
 
void process (typename ArchiveSize< SizeType, OffsetType >::Proxy &)
 
void process (typename ArchiveSize< SizeType, OffsetType >::Proxy &&)
 
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)
 
void process (char &dest)
 
void process (std::uint8_t &dest)
 
void process (std::int8_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)
 
- 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

bool readChar (char *dest)
 
bool expectChar (char expected)
 
void skipWhiteSpace ()
 
void preStructInput ()
 
void postStructInput ()
 
void pushTransparency ()
 
bool popTransparency ()
 

Private Attributes

CharInputStreamBuf< TStream > streamBuf
 
std::istream stream
 
SerializationState state
 

Member Typedef Documentation

◆ BaseArchive

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

◆ OffsetType

template<class TExtender , class TStream , typename TSize , typename TOffset >
using terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::OffsetType = TOffset

◆ SizeType

template<class TExtender , class TStream , typename TSize , typename TOffset >
using terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::SizeType = TSize

Constructor & Destructor Documentation

◆ ExtendableJSONInputArchive()

template<class TExtender , class TStream , typename TSize , typename TOffset >
terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::ExtendableJSONInputArchive ( TExtender *  extender,
TStream *  stream_ 
)
inline
50 : BaseArchive{extender}, streamBuf{stream_},
51 stream{&streamBuf}, state{false, false, false} {
52 }
SerializationState state
Definition: json/InputArchive.h:531
CharInputStreamBuf< TStream > streamBuf
Definition: json/InputArchive.h:529
Archive< TExtender > BaseArchive
Definition: json/InputArchive.h:47
std::istream stream
Definition: json/InputArchive.h:530

Member Function Documentation

◆ expectChar()

template<class TExtender , class TStream , typename TSize , typename TOffset >
bool terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::expectChar ( char  expected)
inlineprivate

◆ isOk()

template<class TExtender , class TStream , typename TSize , typename TOffset >
bool terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::isOk ( ) const
inline

◆ label()

template<class TExtender , class TStream , typename TSize , typename TOffset >
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::label ( const char *  value)
inline
61 {
62 if (state.malformed) {
63 return;
64 }
65
67
68 if (state.firstMember) {
69 state.firstMember = false;
70 } else {
71 if (!expectChar(',')) {
72 return;
73 }
75 }
76
77 if (!expectChar('"')) {
78 return;
79 }
80
81 for (std::size_t i = {}; i < std::strlen(value); ++i) {
82 if (!expectChar(value[i])) {
83 return;
84 }
85 }
86
87 if (!expectChar('"')) {
88 return;
89 }
90
92
93 if (!expectChar(':')) {
94 return;
95 }
96
98 }
bool expectChar(char expected)
Definition: json/InputArchive.h:477
void skipWhiteSpace()
Definition: json/InputArchive.h:489
bool firstMember
Definition: json/InputArchive.h:524

References terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::expectChar(), terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::SerializationState::firstMember, terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::SerializationState::malformed, terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::skipWhiteSpace(), and terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::state.

◆ popTransparency()

template<class TExtender , class TStream , typename TSize , typename TOffset >
bool terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::popTransparency ( )
inlineprivate

◆ postStructInput()

template<class TExtender , class TStream , typename TSize , typename TOffset >
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::postStructInput ( )
inlineprivate

◆ preStructInput()

template<class TExtender , class TStream , typename TSize , typename TOffset >
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::preStructInput ( )
inlineprivate

◆ process() [1/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( Anchor< OffsetType > &  )
inlineprotected
107 {
108 // Anchor<T> has no meaning in a non-binary format, so it's just silently ignored
109 }

◆ process() [2/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( ArchiveOffset< OffsetType > &  dest)
inlineprotected
111 {
112 process(dest.value);
113 }
void process(Transparent< T > &&dest)
Definition: json/InputArchive.h:102

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

◆ process() [3/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( ArchiveSize< SizeType, OffsetType > &  dest)
inlineprotected

◆ process() [4/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
template<typename T , typename ... Args>
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( Blob< T, Args... > &  dest)
inlineprotected
136 {
137 std::basic_string<char, std::char_traits<char>,
138 typename Blob<T, Args...>::allocator_type> buffer{dest.get_allocator()};
139 // dest.size() is the size of the decoded data already (set by user), from which the length of the
140 // encoded data is calculated and used to reserve storage for the temporary buffer where the encoded
141 // data is first loaded
142 buffer.reserve(base64encode(dest.size()));
143 // Read base64-encoded data into temporary buffer
144 process(buffer);
145 // Decode from temp buffer into dest
146 base64decode(dest.data(), buffer.data(), buffer.size());
147 }
constexpr std::size_t base64decode(std::size_t size)
Definition: Base64.h:52
constexpr std::size_t base64encode(std::size_t size)
Definition: Base64.h:19

References terse::base64decode(), terse::base64encode(), terse::Blob< T, TAllocator >::data(), terse::Blob< T, TAllocator >::get_allocator(), terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process(), and terse::Blob< T, TAllocator >::size().

◆ process() [5/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( char &  dest)
inlineprotected
235 {
236 if (!expectChar('"')) {
237 return;
238 }
239
240 if (!readChar(&dest)) {
241 return;
242 }
243
244 if (!expectChar('"')) {
245 return;
246 }
247 }

References terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::expectChar(), and terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::readChar().

◆ process() [6/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
template<typename T , typename ... Args>
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( DynArray< T, Args... > &  dest)
inlineprotected
340 {
341 if (state.malformed) {
342 return;
343 }
344
346 if (!expectChar('[')) {
347 return;
348 }
350
351 if (stream.peek() == ']') {
352 expectChar(']');
353 return;
354 }
355
356 dest.resize_uninitialized(1ul);
357 std::size_t validElementCount = {};
358
359 while (true) {
360 BaseArchive::dispatch(dest[validElementCount]);
361 if (state.malformed) {
362 break;
363 }
364
365 ++validElementCount;
366 if (validElementCount == dest.size()) {
367 dest.resize_uninitialized(dest.size() * 2ul);
368 }
369
371 char ch = {};
372 if (!readChar(&ch)) {
373 break;
374 }
375 if (ch == ',') {
377 } else if (ch == ']') {
378 break;
379 }
380 }
381
382 dest.resize(validElementCount);
384 }
void dispatch(Head &&head)
Definition: Archive.h:61

References terse::Archive< TExtender >::dispatch(), terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::expectChar(), terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::SerializationState::malformed, terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::readChar(), terse::DynArray< T, TAllocator >::resize(), terse::DynArray< T, TAllocator >::resize_uninitialized(), terse::DynArray< T, TAllocator >::size(), terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::skipWhiteSpace(), terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::state, and terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::stream.

◆ process() [7/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
template<typename T , std::size_t N>
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( std::array< T, N > &  dest)
inlineprotected

◆ process() [8/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
template<typename T , typename ... Args>
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( std::basic_string< T, Args... > &  dest)
inlineprotected
387 {
388 if (state.malformed) {
389 return;
390 }
391
392 if (!expectChar('"')) {
393 return;
394 }
395
396 dest.clear();
397 char ch = {};
398 while (readChar(&ch)) {
399 if (ch == '"') {
400 return;
401 } else {
402 dest.push_back(ch);
403 }
404 }
405
406 // This should not be reached if the string was properly quoted
407 state.malformed = true;
408 }

References terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::expectChar(), terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::SerializationState::malformed, terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::readChar(), and terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::state.

◆ process() [9/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( std::int8_t &  dest)
inlineprotected
255 {
256 std::int16_t temp = {};
257 stream >> temp;
258 dest = static_cast<std::int8_t>(temp);
259 }

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

◆ process() [10/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
template<typename K , typename V >
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( std::pair< K, V > &  dest)
inlineprotected

◆ process() [11/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
template<typename K , typename V >
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( std::tuple< K, V > &  dest)
inlineprotected

◆ process() [12/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( std::uint8_t &  dest)
inlineprotected
249 {
250 std::uint16_t temp = {};
251 stream >> temp;
252 dest = static_cast<std::uint8_t>(temp);
253 }

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

◆ process() [13/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
template<typename T , typename ... Args>
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( std::vector< T, Args... > &  dest)
inlineprotected
300 {
301 if (state.malformed) {
302 return;
303 }
304
306 if (!expectChar('[')) {
307 return;
308 }
310
311 if (stream.peek() == ']') {
312 expectChar(']');
313 return;
314 }
315
316 dest.clear();
317 while (true) {
318 dest.push_back(impl::ValueFactory<T>::create(dest.get_allocator()));
319 BaseArchive::dispatch(dest.back());
320 if (state.malformed) {
321 return;
322 }
323
325 char ch = {};
326 if (!readChar(&ch)) {
327 return;
328 }
329 if (ch == ',') {
331 } else if (ch == ']') {
332 break;
333 }
334 }
335
337 }
static std::enable_if< IsPrimitive, T >::type create(const ParentAllocator &)
Definition: Common.h:36

References terse::Archive< TExtender >::dispatch(), terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::expectChar(), terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::SerializationState::malformed, terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::readChar(), terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::skipWhiteSpace(), terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::state, and terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::stream.

◆ process() [14/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
template<typename T >
std::enable_if< traits::has_load_member< T >::value, void >::type terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( T &  dest)
inlineprotected

◆ process() [15/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
template<typename T >
std::enable_if< traits::has_serialize_member< T >::value, void >::type terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( T &  dest)
inlineprotected

◆ process() [16/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
template<typename T >
std::enable_if< traits::has_load_function< T >::value, void >::type terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( T &  dest)
inlineprotected

◆ process() [17/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
template<typename T >
std::enable_if< traits::has_serialize_function< T >::value, void >::type terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( T &  dest)
inlineprotected

◆ process() [18/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
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::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( T &  dest)
inlineprotected

◆ process() [19/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
template<typename T >
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( Transparent< T > &&  dest)
inlineprotected

◆ process() [20/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( typename ArchiveOffset< OffsetType >::Proxy &&  )
inlineprotected
119 {
120 // ArchiveOffset<T>::Proxy has no meaning in a non-binary format, so it's just silently ignored
121 }

◆ process() [21/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( typename ArchiveOffset< OffsetType >::Proxy &  )
inlineprotected
115 {
116 // ArchiveOffset<T>::Proxy has no meaning in a non-binary format, so it's just silently ignored
117 }

◆ process() [22/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( typename ArchiveSize< SizeType, OffsetType >::Proxy &&  )
inlineprotected
131 {
132 // ArchiveSize<T, U>::Proxy has no meaning in a non-binary format, so it's just silently ignored
133 }

◆ process() [23/23]

template<class TExtender , class TStream , typename TSize , typename TOffset >
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::process ( typename ArchiveSize< SizeType, OffsetType >::Proxy &  )
inlineprotected
127 {
128 // ArchiveSize<T, U>::Proxy has no meaning in a non-binary format, so it's just silently ignored
129 }

◆ pushTransparency()

template<class TExtender , class TStream , typename TSize , typename TOffset >
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::pushTransparency ( )
inlineprivate

◆ readChar()

template<class TExtender , class TStream , typename TSize , typename TOffset >
bool terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::readChar ( char *  dest)
inlineprivate

◆ skipWhiteSpace()

template<class TExtender , class TStream , typename TSize , typename TOffset >
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::skipWhiteSpace ( )
inlineprivate

◆ sync()

template<class TExtender , class TStream , typename TSize , typename TOffset >
void terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::sync ( )
inline
58 {
59 }

Member Data Documentation

◆ state

template<class TExtender , class TStream , typename TSize , typename TOffset >
SerializationState terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::state
private

◆ stream

template<class TExtender , class TStream , typename TSize , typename TOffset >
std::istream terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::stream
private

◆ streamBuf

template<class TExtender , class TStream , typename TSize , typename TOffset >
CharInputStreamBuf<TStream> terse::ExtendableJSONInputArchive< TExtender, TStream, TSize, TOffset >::streamBuf
private

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