55#include <unordered_map>
56#include <unordered_set>
88 static size_t Read(FILE * f,
char & c);
94 static size_t Write(FILE * f,
char c);
100 static size_t Read(FILE * f, uint8_t & c);
106 static size_t Write(FILE * f, uint8_t c);
112 static size_t Read(FILE * f,
bool & b);
118 static size_t Write(FILE * f,
bool b);
124 static size_t Read(FILE * f, int16_t & val);
130 static size_t Write(FILE * f, int16_t val);
136 static size_t Read(FILE * f, uint16_t & val);
142 static size_t Write(FILE * f, uint16_t val);
148 static size_t Read(FILE * f, int32_t & val);
154 static size_t Write(FILE * f, int32_t val);
160 static size_t Read(FILE * f, uint32_t & val);
166 static size_t Write(FILE * f, uint32_t val);
172 static size_t Read(FILE * f, int64_t & val);
178 static size_t Write(FILE * f,
const int64_t & val);
184 static size_t Read(FILE * f, uint64_t & val);
190 static size_t Write(FILE * f,
const uint64_t & val);
197 static size_t Read(FILE * f,
float & val);
204 static size_t Write(FILE * f,
float val);
211 static size_t Read(FILE * f,
double & val);
218 static size_t Write(FILE * f,
const double & val);
225 static size_t Read(FILE * f, std::string & s);
233 static size_t Write(FILE * f,
const std::string & s);
239 {
return val.
Read(f); }
246 {
return val.Read(f); }
252 {
return(val.
Write(f)); }
259 {
return val.Write(f); }
265 template <
typename _firstT,
typename _secondT>
266 static size_t Read(FILE *f, std::pair<_firstT,_secondT> & p)
270 if (
Read(f, p.first) > 0)
271 if (
Read(f, p.second) > 0)
280 template <
typename _firstT,
typename _secondT>
281 static size_t Write(FILE *f,
const std::pair<_firstT,_secondT> & p)
285 if (
Write(f, p.first) > 0)
286 if (
Write(f, p.second) > 0)
295 template <
typename _keyT,
typename _valueT,
296 typename _Compare,
typename _Alloc>
297 static size_t Read(FILE *f, std::map<_keyT, _valueT, _Compare, _Alloc> & m)
299 return(PairAssocContRead<std::map<_keyT, _valueT, _Compare, _Alloc> >(f, m));
306 template <
typename _keyT,
typename _valueT,
307 typename _Compare,
typename _Alloc>
309 Write(FILE *f,
const std::map<_keyT, _valueT, _Compare, _Alloc> & m)
311 return(ContainerWrite<std::map<_keyT,_valueT> >(f, m));
318 template <
typename _keyT,
typename _valueT,
319 typename _Compare,
typename _Alloc>
321 Read(FILE *f, std::multimap<_keyT, _valueT, _Compare, _Alloc> & m)
323 return(PairAssocContRead<std::multimap<_keyT,_valueT,_Compare,_Alloc> >(f, m));
330 template <
typename _keyT,
typename _valueT,
331 typename _Compare,
typename _Alloc>
333 Write(FILE *f,
const std::multimap<_keyT,_valueT, _Compare, _Alloc> & m)
335 return(ContainerWrite<std::multimap<_keyT,_valueT,_Compare,_Alloc> >(f, m));
342 template <
typename _valueT,
size_t N>
343 static size_t Read(FILE *f, std::array<_valueT, N> & a)
346 for (
size_t i = 0; i < N; ++i) {
347 if (!
Read(f, a[i])) {
359 template <
typename _valueT,
size_t N>
360 static size_t Write(FILE *f,
const std::array<_valueT, N> & a)
363 for (
size_t i = 0; i < N; ++i) {
364 if (!
Write(f, a[i])) {
376 template <
typename _valueT,
typename _Alloc>
377 static size_t Read(FILE *f, std::vector<_valueT, _Alloc> & v)
379 return(ContainerRead<std::vector<_valueT, _Alloc> >(f, v));
386 template <
typename _valueT,
typename _Alloc>
387 static size_t Write(FILE *f,
const std::vector<_valueT, _Alloc> & v)
389 return(ContainerWrite<std::vector<_valueT, _Alloc> >(f, v));
396 template <
typename _valueT,
typename _Alloc>
397 static size_t Read(FILE *f, std::deque<_valueT, _Alloc> & d)
399 return(ContainerRead<std::deque<_valueT, _Alloc> >(f, d));
406 template <
typename _valueT,
typename _Alloc>
407 static size_t Write(FILE *f,
const std::deque<_valueT, _Alloc> & d)
409 return(ContainerWrite<std::deque<_valueT, _Alloc> >(f, d));
416 template <
typename _valueT,
typename _Alloc>
417 static size_t Read(FILE *f, std::list<_valueT, _Alloc> & l)
419 return(ContainerRead<std::list<_valueT, _Alloc> >(f, l));
426 template <
typename _valueT,
typename _Alloc>
427 static size_t Write(FILE *f,
const std::list<_valueT, _Alloc> & l)
429 return(ContainerWrite<std::list<_valueT, _Alloc> >(f, l));
436 template <
typename _valueT,
typename _Compare,
typename _Alloc>
437 static size_t Read(FILE *f, std::set<_valueT, _Compare, _Alloc> & l)
439 return(ContainerRead<std::set<_valueT, _Compare, _Alloc> >(f, l));
446 template <
typename _valueT,
typename _Compare,
typename _Alloc>
447 static size_t Write(FILE *f,
const std::set<_valueT, _Compare, _Alloc> & l)
449 return(ContainerWrite<std::set<_valueT, _Compare, _Alloc> >(f, l));
456 template <
typename _valueT,
typename _Compare,
typename _Alloc>
457 static size_t Read(FILE *f, std::multiset<_valueT, _Compare, _Alloc> & l)
459 return(ContainerRead<std::multiset<_valueT, _Compare, _Alloc> >(f, l));
466 template <
typename _valueT,
typename _Compare,
typename _Alloc>
468 Write(FILE *f,
const std::multiset<_valueT, _Compare, _Alloc> & l)
470 return(ContainerWrite<std::multiset<_valueT, _Compare, _Alloc> >(f, l));
476 template <
typename... Args>
477 static size_t Read(FILE *f, std::tuple<Args...> & t)
479 return(std::apply([&f](
auto && ...args)
481 auto read_tuple_mem = [&f](
auto && x) {
return Read(f, x); };
482 return (read_tuple_mem(args) && ...);
489 template <
typename... Args>
490 static size_t Write(FILE *f,
const std::tuple<Args...> & t)
492 return(std::apply([&f](
auto && ...args)
494 auto write_tuple_mem = [&f](
auto && x) {
return Write(f, x); };
495 return (write_tuple_mem(args) && ...);
504 static size_t Read(FILE *fp, std::monostate & sm)
514 static size_t Write(FILE *fp,
const std::monostate & sm)
522 template <
typename... Ts>
523 static size_t Read(FILE *fp, std::variant<Ts...> & v)
527 if (
Read(fp, index)) {
528 if (index < std::variant_size_v<std::variant<Ts...>>) {
530 std::visit([&] (
auto && arg) { rc =
Read(fp, arg); }, v);
539 template <
typename... Ts>
540 static size_t Write(FILE *fp,
const std::variant<Ts...> & v)
543 uint64_t index = v.index();
544 if (
Write(fp, index)) {
545 std::visit([&] (
const auto & arg) { rc =
Write(fp, arg); }, v);
554 template<
typename _keyT,
typename _valueT,
typename _Hash,
555 typename _Pred,
typename _Alloc>
557 Read(FILE *f, std::unordered_map<_keyT,_valueT,_Hash,_Pred,_Alloc> & hm)
559 return(PairAssocContRead<std::unordered_map<_keyT,_valueT,_Hash,_Pred,_Alloc> >(f, hm));
566 template<
typename _keyT,
typename _valueT,
typename _Hash,
567 typename _Pred,
typename _Alloc>
569 Write(FILE *f,
const std::unordered_map<_keyT,_valueT,_Hash,_Pred,_Alloc> & hm)
571 return(ContainerWrite<std::unordered_map<_keyT,_valueT,_Hash,_Pred,_Alloc> >(f, hm));
578 template<
typename _keyT,
typename _valueT,
typename _Hash,
579 typename _Pred,
typename _Alloc>
581 Read(FILE *f, std::unordered_multimap<_keyT,_valueT,_Hash,_Pred,_Alloc> & hm)
583 return(PairAssocContRead<std::unordered_multimap<_keyT,_valueT,_Hash,_Pred,_Alloc> >(f, hm));
590 template<
typename _keyT,
typename _valueT,
typename _Hash,
591 typename _Pred,
typename _Alloc>
593 Write(FILE *f,
const std::unordered_multimap<_keyT,_valueT,_Hash,_Pred,_Alloc> & hm)
595 return(ContainerWrite<std::unordered_multimap<_keyT,_valueT,_Hash,_Pred,_Alloc> >(f, hm));
602 template<
typename _valueT,
typename _Hash,
603 typename _Pred,
typename _Alloc>
605 Read(FILE *f, std::unordered_set<_valueT,_Hash,_Pred,_Alloc> & hm)
607 return(ContainerRead<std::unordered_set<_valueT,_Hash,_Pred,_Alloc> >(f, hm));
614 template<
typename _valueT,
typename _Hash,
615 typename _Pred,
typename _Alloc>
617 Write(FILE *f,
const std::unordered_set<_valueT,_Hash,_Pred,_Alloc> & hm)
619 return(ContainerWrite<std::unordered_set<_valueT,_Hash,_Pred,_Alloc> >(f, hm));
626 template<
typename _valueT,
typename _Hash,
627 typename _Pred,
typename _Alloc>
629 Read(FILE *f, std::unordered_multiset<_valueT,_Hash,_Pred,_Alloc> & hm)
631 return(ContainerRead<std::unordered_multiset<_valueT,_Hash,_Pred,_Alloc> >(f, hm));
638 template<
typename _valueT,
typename _Hash,
639 typename _Pred,
typename _Alloc>
641 Write(FILE *f,
const std::unordered_multiset<_valueT,_Hash,_Pred,_Alloc> & hm)
643 return(ContainerWrite<std::unordered_multiset<_valueT,_Hash,_Pred,_Alloc> >(f, hm));
650 template <
typename... Args>
651 static size_t ReadV(FILE *f, Args & ...args)
653 return (
Read(f,args) && ...);
660 template <
typename... Args>
661 static size_t WriteV(FILE *f,
const Args & ...args)
663 return (
Write(f,args) && ...);
670 template <
typename _inputIteratorT>
671 static size_t Write(FILE *file, _inputIteratorT f, _inputIteratorT l)
675 for ( ; f != l; ++f) {
676 if (
Write(file, *f) <= 0) {
690 template <
typename _containerT>
691 static size_t ContainerRead(FILE *f, _containerT & c)
698 if (
Read(f, numEntries)) {
700 for ( ; i < numEntries; ++i) {
701 typename _containerT::value_type val;
702 if (
Read(f, val) > 0)
703 c.insert(c.end(), std::move(val));
718 template <
typename _containerT>
719 static size_t ContainerWrite(FILE *f,
const _containerT & c)
723 uint64_t numEntries = c.size();
724 if (
Write(f, numEntries)) {
742 template <
typename _containerT>
743 static size_t PairAssocContRead(FILE *f, _containerT & m)
750 if (
Read(f, numEntries)) {
752 for ( ; i < numEntries; ++i) {
753 typename _containerT::key_type key;
754 if (
Read(f, key) > 0) {
755 typename _containerT::mapped_type val;
756 if (
Read(f, val) > 0) {
757 m.insert(
typename _containerT::value_type(std::move(key),
Dwm::HasFileRead and Dwm::HasFileWrite concepts. Dwm::FileIOCapable pure virtual class declaration.
A configure target for dealing with OS differences.
Dwm::VariantFromIndex function template.
std::variant< Ts... > VariantFromIndex(size_t index)
Returns a variant type V whose contents are set to a default constructed value of the type at index i...
Definition DwmVariantFromIndex.hh:57
This class contains a collection of static functions for reading and writing simple types,...
Definition DwmFileIO.hh:82
static size_t Read(FILE *f, std::unordered_multiset< _valueT, _Hash, _Pred, _Alloc > &hm)
Reads an unordered_multiset from a FILE.
Definition DwmFileIO.hh:629
static size_t Read(FILE *f, std::set< _valueT, _Compare, _Alloc > &l)
Reads a set<_valueT> from a FILE.
Definition DwmFileIO.hh:437
static size_t Read(FILE *fp, std::monostate &sm)
Just a dummy helper function for std::variant instances that hold a std::monostate.
Definition DwmFileIO.hh:504
static size_t Write(FILE *f, const std::unordered_multimap< _keyT, _valueT, _Hash, _Pred, _Alloc > &hm)
Writes an unordered_multimap to a FILE.
Definition DwmFileIO.hh:593
static size_t Read(FILE *f, std::list< _valueT, _Alloc > &l)
Reads a list<_valueT> from a FILE.
Definition DwmFileIO.hh:417
static size_t Read(FILE *f, uint16_t &val)
Reads val from f, in network byte order (MSB first).
static size_t Read(FILE *f, uint64_t &val)
Reads val from f, in network byte order (MSB first).
static size_t Read(FILE *f, float &val)
Reads val from f, in IEEE format (see RFC 1832 and/or ANSI/IEEE Standard 754-1985).
static size_t Write(FILE *f, const std::multimap< _keyT, _valueT, _Compare, _Alloc > &m)
Writes a multimap<_keyT,_valueT> to a FILE.
Definition DwmFileIO.hh:333
static size_t Write(FILE *fp, const std::monostate &sm)
Just a dummy helper function for std::variant instances that hold a std::monostate.
Definition DwmFileIO.hh:514
static size_t Read(FILE *fp, std::variant< Ts... > &v)
Reads a variant from a FILE. Returns 1 on success, 0 on failure.
Definition DwmFileIO.hh:523
static size_t Write(FILE *f, bool b)
Writes b to f.
static size_t Write(FILE *f, int32_t val)
Writes val to f, in network byte order (MSB first).
static size_t Read(FILE *f, double &val)
Reads val from f, in IEEE format (see RFC 1832 and/or ANSI/IEEE Standard 754-1985).
static size_t Read(FILE *f, std::tuple< Args... > &t)
Reads a tuple from a FILE. Returns 1 on success, 0 on failure.
Definition DwmFileIO.hh:477
static size_t Write(FILE *f, const std::deque< _valueT, _Alloc > &d)
Writes a deque<_valueT> to a FILE.
Definition DwmFileIO.hh:407
static size_t Read(FILE *f, int64_t &val)
Reads val from f, in network byte order (MSB first).
static size_t Read(FILE *f, std::pair< _firstT, _secondT > &p)
Reads a pair<_firstT,_secondT> from a FILE.
Definition DwmFileIO.hh:266
static size_t Read(FILE *f, std::unordered_set< _valueT, _Hash, _Pred, _Alloc > &hm)
Reads an unordered_set from a FILE.
Definition DwmFileIO.hh:605
static size_t Write(FILE *f, char c)
Writes c to f.
static size_t Write(FILE *f, const std::pair< _firstT, _secondT > &p)
Writes a pair<_firstT,_secondT> to a FILE.
Definition DwmFileIO.hh:281
static size_t Read(FILE *f, FileReadable &val)
Wrapper function to read a FileReadable object from a FILE.
Definition DwmFileIO.hh:238
static size_t Read(FILE *f, bool &b)
Reads b from f.
static size_t Write(FILE *f, const double &val)
Writes val to f, in IEEE format (see RFC 1832 and/or ANSI/IEEE Standard 754-1985).
static size_t Read(FILE *f, std::deque< _valueT, _Alloc > &d)
Reads a deque<_valueT> from a FILE.
Definition DwmFileIO.hh:397
static size_t Write(FILE *f, const std::vector< _valueT, _Alloc > &v)
Writes a vector<_valueT> to a FILE.
Definition DwmFileIO.hh:387
static size_t ReadV(FILE *f, Args &...args)
Reads multiple objects from a FILE.
Definition DwmFileIO.hh:651
static size_t Read(FILE *f, std::multimap< _keyT, _valueT, _Compare, _Alloc > &m)
Reads a multimap<_keyT,_valueT> from a FILE.
Definition DwmFileIO.hh:321
static size_t Write(FILE *f, const std::unordered_set< _valueT, _Hash, _Pred, _Alloc > &hm)
Writes an unordered_set to a FILE.
Definition DwmFileIO.hh:617
static size_t Read(FILE *f, std::array< _valueT, N > &a)
Reads an array<_valueT,N> from a FILE.
Definition DwmFileIO.hh:343
static size_t Read(FILE *f, std::unordered_multimap< _keyT, _valueT, _Hash, _Pred, _Alloc > &hm)
Reads an unordered_multimap from a FILE.
Definition DwmFileIO.hh:581
static size_t Read(FILE *f, uint32_t &val)
Reads val from f, in network byte order (MSB first).
static size_t Write(FILE *f, const std::string &s)
Writes s to f.
static size_t Write(FILE *f, const std::set< _valueT, _Compare, _Alloc > &l)
Writes a set<_valueT> to a FILE.
Definition DwmFileIO.hh:447
static size_t WriteV(FILE *f, const Args &...args)
Writes multiple objects to a FILE.
Definition DwmFileIO.hh:661
static size_t Write(FILE *f, const std::array< _valueT, N > &a)
Writes an array<_valueT,N> to a FILE.
Definition DwmFileIO.hh:360
static size_t Write(FILE *f, const uint64_t &val)
Writes val to f, in network byte order (MSB first).
static size_t Read(FILE *f, uint8_t &c)
Reads c from f.
static size_t Write(FILE *f, const FileWritable &val)
Wrapper function to write a FileWritable object to a FILE.
Definition DwmFileIO.hh:251
static size_t Read(FILE *f, int16_t &val)
Reads val from f, in network byte order (MSB first).
static size_t Write(FILE *f, uint8_t c)
Writes c to f.
static size_t Write(FILE *f, uint32_t val)
Writes val to f, in network byte order (MSB first).
static size_t Read(FILE *f, char &c)
Reads c from f.
static size_t Read(FILE *f, std::multiset< _valueT, _Compare, _Alloc > &l)
Reads a multiset<_valueT> from a FILE.
Definition DwmFileIO.hh:457
static size_t Read(FILE *f, std::map< _keyT, _valueT, _Compare, _Alloc > &m)
Reads a map<_keyT,_valueT> from a FILE.
Definition DwmFileIO.hh:297
static size_t Write(FILE *f, const HasFileWrite auto &val)
Writes val to FILE f, where val meets the requirements of the HasFileWrite concept.
Definition DwmFileIO.hh:258
static size_t Read(FILE *f, std::string &s)
Reads s from f.
static size_t Write(FILE *f, const int64_t &val)
Writes val to f, in network byte order (MSB first).
static size_t Read(FILE *f, std::unordered_map< _keyT, _valueT, _Hash, _Pred, _Alloc > &hm)
Reads an unordered_map from a FILE.
Definition DwmFileIO.hh:557
static size_t Write(FILE *f, int16_t val)
Writes val to f, in network byte order (MSB first).
static size_t Write(FILE *f, const std::unordered_map< _keyT, _valueT, _Hash, _Pred, _Alloc > &hm)
Writes an unordered_map to a FILE.
Definition DwmFileIO.hh:569
static size_t Write(FILE *f, float val)
Writes val to f, in IEEE format (see RFC 1832 and/or ANSI/IEEE Standard 754-1985).
static size_t Write(FILE *f, uint16_t val)
Writes val to f, in network byte order (MSB first).
static size_t Read(FILE *f, std::vector< _valueT, _Alloc > &v)
Reads a vector<_valueT> from a FILE.
Definition DwmFileIO.hh:377
static size_t Write(FILE *fp, const std::variant< Ts... > &v)
Writes a variant to a FILE. Returns 1 on success, 0 on failure.
Definition DwmFileIO.hh:540
static size_t Read(FILE *f, HasFileRead auto &val)
Reads val from FILE f, where val meets the requirements of the HasFileRead concept.
Definition DwmFileIO.hh:245
static size_t Write(FILE *f, const std::multiset< _valueT, _Compare, _Alloc > &l)
Writes a multiset<_valueT> to a FILE.
Definition DwmFileIO.hh:468
static size_t Write(FILE *f, const std::tuple< Args... > &t)
Writes a tuple to a FILE. Returns 1 on success, 0 on failure.
Definition DwmFileIO.hh:490
static size_t Write(FILE *f, const std::list< _valueT, _Alloc > &l)
Writes a list<_valueT> to a FILE.
Definition DwmFileIO.hh:427
static size_t Write(FILE *f, const std::map< _keyT, _valueT, _Compare, _Alloc > &m)
Writes a map<_keyT,_valueT> to a FILE.
Definition DwmFileIO.hh:309
static size_t Read(FILE *f, int32_t &val)
Reads val from f, in network byte order (MSB first).
static size_t Write(FILE *f, const std::unordered_multiset< _valueT, _Hash, _Pred, _Alloc > &hm)
Writes an unordered_multiset to a FILE.
Definition DwmFileIO.hh:641
This class defines an interface for classes that can read their contents from a FILE pointer.
Definition DwmFileIOCapable.hh:73
virtual size_t Read(FILE *f)=0
Read from a FILE pointer.
This class defines an interface for classes that can write their contents to a FILE pointer.
Definition DwmFileIOCapable.hh:92
virtual size_t Write(FILE *f) const =0
Write to a FILE pointer.
T has a Read(FILE *) member that returns size_t (1 on success, 0 on failure).
Definition DwmFileIOCapable.hh:55
T has a Write(FILE *) const member that returns size_t (1 on success, 0 on failure).
Definition DwmFileIOCapable.hh:64