libDwm-0.9.45
DwmFileIO.hh
Go to the documentation of this file.
1//===========================================================================
2// @(#) $DwmPath$
3//===========================================================================
4// Copyright (c) Daniel W. McRobb 2004-2007, 2016, 2017, 2020, 2024
5// All rights reserved.
6//
7// Redistribution and use in source and binary forms, with or without
8// modification, are permitted provided that the following conditions
9// are met:
10//
11// 1. Redistributions of source code must retain the above copyright
12// notice, this list of conditions and the following disclaimer.
13// 2. Redistributions in binary form must reproduce the above copyright
14// notice, this list of conditions and the following disclaimer in the
15// documentation and/or other materials provided with the distribution.
16// 3. The names of the authors and copyright holders may not be used to
17// endorse or promote products derived from this software without
18// specific prior written permission.
19//
20// IN NO EVENT SHALL DANIEL W. MCROBB BE LIABLE TO ANY PARTY FOR
21// DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
22// INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE,
23// EVEN IF DANIEL W. MCROBB HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
24// DAMAGE.
25//
26// THE SOFTWARE PROVIDED HEREIN IS ON AN "AS IS" BASIS, AND
27// DANIEL W. MCROBB HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT,
28// UPDATES, ENHANCEMENTS, OR MODIFICATIONS. DANIEL W. MCROBB MAKES NO
29// REPRESENTATIONS AND EXTENDS NO WARRANTIES OF ANY KIND, EITHER
30// IMPLIED OR EXPRESS, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
31// WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
32// PURPOSE, OR THAT THE USE OF THIS SOFTWARE WILL NOT INFRINGE ANY PATENT,
33// TRADEMARK OR OTHER RIGHTS.
34//===========================================================================
35
36//---------------------------------------------------------------------------
39//---------------------------------------------------------------------------
40
41#ifndef _DWMFILEIO_HH_
42#define _DWMFILEIO_HH_
43
44#include <array>
45#include <cassert>
46#include <cstdint>
47#include <cstdio>
48#include <deque>
49#include <iostream>
50#include <list>
51#include <map>
52#include <set>
53#include <string>
54#include <tuple>
55#include <unordered_map>
56#include <unordered_set>
57#include <variant>
58#include <vector>
59
60#include "DwmPortability.hh"
61#include "DwmFileIOCapable.hh"
63
64namespace Dwm {
65
66 //--------------------------------------------------------------------------
80 //--------------------------------------------------------------------------
81 class FileIO
82 {
83 public:
84 //------------------------------------------------------------------------
87 //------------------------------------------------------------------------
88 static size_t Read(FILE * f, char & c);
89
90 //------------------------------------------------------------------------
93 //------------------------------------------------------------------------
94 static size_t Write(FILE * f, char c);
95
96 //------------------------------------------------------------------------
99 //------------------------------------------------------------------------
100 static size_t Read(FILE * f, uint8_t & c);
101
102 //------------------------------------------------------------------------
105 //------------------------------------------------------------------------
106 static size_t Write(FILE * f, uint8_t c);
107
108 //------------------------------------------------------------------------
111 //------------------------------------------------------------------------
112 static size_t Read(FILE * f, bool & b);
113
114 //------------------------------------------------------------------------
117 //------------------------------------------------------------------------
118 static size_t Write(FILE * f, bool b);
119
120 //------------------------------------------------------------------------
123 //------------------------------------------------------------------------
124 static size_t Read(FILE * f, int16_t & val);
125
126 //------------------------------------------------------------------------
129 //------------------------------------------------------------------------
130 static size_t Write(FILE * f, int16_t val);
131
132 //------------------------------------------------------------------------
135 //------------------------------------------------------------------------
136 static size_t Read(FILE * f, uint16_t & val);
137
138 //------------------------------------------------------------------------
141 //------------------------------------------------------------------------
142 static size_t Write(FILE * f, uint16_t val);
143
144 //------------------------------------------------------------------------
147 //------------------------------------------------------------------------
148 static size_t Read(FILE * f, int32_t & val);
149
150 //------------------------------------------------------------------------
153 //------------------------------------------------------------------------
154 static size_t Write(FILE * f, int32_t val);
155
156 //------------------------------------------------------------------------
159 //------------------------------------------------------------------------
160 static size_t Read(FILE * f, uint32_t & val);
161
162 //------------------------------------------------------------------------
165 //------------------------------------------------------------------------
166 static size_t Write(FILE * f, uint32_t val);
167
168 //------------------------------------------------------------------------
171 //------------------------------------------------------------------------
172 static size_t Read(FILE * f, int64_t & val);
173
174 //------------------------------------------------------------------------
177 //------------------------------------------------------------------------
178 static size_t Write(FILE * f, const int64_t & val);
179
180 //------------------------------------------------------------------------
183 //------------------------------------------------------------------------
184 static size_t Read(FILE * f, uint64_t & val);
185
186 //------------------------------------------------------------------------
189 //------------------------------------------------------------------------
190 static size_t Write(FILE * f, const uint64_t & val);
191
192 //------------------------------------------------------------------------
196 //------------------------------------------------------------------------
197 static size_t Read(FILE * f, float & val);
198
199 //------------------------------------------------------------------------
203 //------------------------------------------------------------------------
204 static size_t Write(FILE * f, float val);
205
206 //------------------------------------------------------------------------
210 //------------------------------------------------------------------------
211 static size_t Read(FILE * f, double & val);
212
213 //------------------------------------------------------------------------
217 //------------------------------------------------------------------------
218 static size_t Write(FILE * f, const double & val);
219
220 //------------------------------------------------------------------------
224 //------------------------------------------------------------------------
225 static size_t Read(FILE * f, std::string & s);
226
227 //------------------------------------------------------------------------
232 //------------------------------------------------------------------------
233 static size_t Write(FILE * f, const std::string & s);
234
235 //------------------------------------------------------------------------
237 //------------------------------------------------------------------------
238 static size_t Read(FILE *f, FileReadable & val)
239 { return val.Read(f); }
240
241 //------------------------------------------------------------------------
244 //------------------------------------------------------------------------
245 static size_t Read(FILE *f, HasFileRead auto & val)
246 { return val.Read(f); }
247
248 //------------------------------------------------------------------------
250 //------------------------------------------------------------------------
251 static size_t Write(FILE * f, const FileWritable & val)
252 { return(val.Write(f)); }
253
254 //------------------------------------------------------------------------
257 //------------------------------------------------------------------------
258 static size_t Write(FILE *f, const HasFileWrite auto & val)
259 { return val.Write(f); }
260
261 //------------------------------------------------------------------------
264 //------------------------------------------------------------------------
265 template <typename _firstT, typename _secondT>
266 static size_t Read(FILE *f, std::pair<_firstT,_secondT> & p)
267 {
268 size_t rc = 0;
269 if (f)
270 if (Read(f, p.first) > 0)
271 if (Read(f, p.second) > 0)
272 rc = 1;
273 return(rc);
274 }
275
276 //------------------------------------------------------------------------
279 //------------------------------------------------------------------------
280 template <typename _firstT, typename _secondT>
281 static size_t Write(FILE *f, const std::pair<_firstT,_secondT> & p)
282 {
283 size_t rc = 0;
284 if (f)
285 if (Write(f, p.first) > 0)
286 if (Write(f, p.second) > 0)
287 rc = 1;
288 return(rc);
289 }
290
291 //------------------------------------------------------------------------
294 //------------------------------------------------------------------------
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)
298 {
299 return(PairAssocContRead<std::map<_keyT, _valueT, _Compare, _Alloc> >(f, m));
300 }
301
302 //------------------------------------------------------------------------
305 //------------------------------------------------------------------------
306 template <typename _keyT, typename _valueT,
307 typename _Compare, typename _Alloc>
308 static size_t
309 Write(FILE *f, const std::map<_keyT, _valueT, _Compare, _Alloc> & m)
310 {
311 return(ContainerWrite<std::map<_keyT,_valueT> >(f, m));
312 }
313
314 //------------------------------------------------------------------------
317 //------------------------------------------------------------------------
318 template <typename _keyT, typename _valueT,
319 typename _Compare, typename _Alloc>
320 static size_t
321 Read(FILE *f, std::multimap<_keyT, _valueT, _Compare, _Alloc> & m)
322 {
323 return(PairAssocContRead<std::multimap<_keyT,_valueT,_Compare,_Alloc> >(f, m));
324 }
325
326 //------------------------------------------------------------------------
329 //------------------------------------------------------------------------
330 template <typename _keyT, typename _valueT,
331 typename _Compare, typename _Alloc>
332 static size_t
333 Write(FILE *f, const std::multimap<_keyT,_valueT, _Compare, _Alloc> & m)
334 {
335 return(ContainerWrite<std::multimap<_keyT,_valueT,_Compare,_Alloc> >(f, m));
336 }
337
338 //------------------------------------------------------------------------
341 //------------------------------------------------------------------------
342 template <typename _valueT, size_t N>
343 static size_t Read(FILE *f, std::array<_valueT, N> & a)
344 {
345 size_t rc = 1;
346 for (size_t i = 0; i < N; ++i) {
347 if (! Read(f, a[i])) {
348 rc = 0;
349 break;
350 }
351 }
352 return rc;
353 }
354
355 //------------------------------------------------------------------------
358 //------------------------------------------------------------------------
359 template <typename _valueT, size_t N>
360 static size_t Write(FILE *f, const std::array<_valueT, N> & a)
361 {
362 size_t rc = 1;
363 for (size_t i = 0; i < N; ++i) {
364 if (! Write(f, a[i])) {
365 rc = 0;
366 break;
367 }
368 }
369 return rc;
370 }
371
372 //------------------------------------------------------------------------
375 //------------------------------------------------------------------------
376 template <typename _valueT, typename _Alloc>
377 static size_t Read(FILE *f, std::vector<_valueT, _Alloc> & v)
378 {
379 return(ContainerRead<std::vector<_valueT, _Alloc> >(f, v));
380 }
381
382 //------------------------------------------------------------------------
385 //------------------------------------------------------------------------
386 template <typename _valueT, typename _Alloc>
387 static size_t Write(FILE *f, const std::vector<_valueT, _Alloc> & v)
388 {
389 return(ContainerWrite<std::vector<_valueT, _Alloc> >(f, v));
390 }
391
392 //------------------------------------------------------------------------
395 //------------------------------------------------------------------------
396 template <typename _valueT, typename _Alloc>
397 static size_t Read(FILE *f, std::deque<_valueT, _Alloc> & d)
398 {
399 return(ContainerRead<std::deque<_valueT, _Alloc> >(f, d));
400 }
401
402 //------------------------------------------------------------------------
405 //------------------------------------------------------------------------
406 template <typename _valueT, typename _Alloc>
407 static size_t Write(FILE *f, const std::deque<_valueT, _Alloc> & d)
408 {
409 return(ContainerWrite<std::deque<_valueT, _Alloc> >(f, d));
410 }
411
412 //------------------------------------------------------------------------
415 //------------------------------------------------------------------------
416 template <typename _valueT, typename _Alloc>
417 static size_t Read(FILE *f, std::list<_valueT, _Alloc> & l)
418 {
419 return(ContainerRead<std::list<_valueT, _Alloc> >(f, l));
420 }
421
422 //------------------------------------------------------------------------
425 //------------------------------------------------------------------------
426 template <typename _valueT, typename _Alloc>
427 static size_t Write(FILE *f, const std::list<_valueT, _Alloc> & l)
428 {
429 return(ContainerWrite<std::list<_valueT, _Alloc> >(f, l));
430 }
431
432 //------------------------------------------------------------------------
435 //------------------------------------------------------------------------
436 template <typename _valueT, typename _Compare, typename _Alloc>
437 static size_t Read(FILE *f, std::set<_valueT, _Compare, _Alloc> & l)
438 {
439 return(ContainerRead<std::set<_valueT, _Compare, _Alloc> >(f, l));
440 }
441
442 //------------------------------------------------------------------------
445 //------------------------------------------------------------------------
446 template <typename _valueT, typename _Compare, typename _Alloc>
447 static size_t Write(FILE *f, const std::set<_valueT, _Compare, _Alloc> & l)
448 {
449 return(ContainerWrite<std::set<_valueT, _Compare, _Alloc> >(f, l));
450 }
451
452 //------------------------------------------------------------------------
455 //------------------------------------------------------------------------
456 template <typename _valueT, typename _Compare, typename _Alloc>
457 static size_t Read(FILE *f, std::multiset<_valueT, _Compare, _Alloc> & l)
458 {
459 return(ContainerRead<std::multiset<_valueT, _Compare, _Alloc> >(f, l));
460 }
461
462 //------------------------------------------------------------------------
465 //------------------------------------------------------------------------
466 template <typename _valueT, typename _Compare, typename _Alloc>
467 static size_t
468 Write(FILE *f, const std::multiset<_valueT, _Compare, _Alloc> & l)
469 {
470 return(ContainerWrite<std::multiset<_valueT, _Compare, _Alloc> >(f, l));
471 }
472
473 //------------------------------------------------------------------------
475 //------------------------------------------------------------------------
476 template <typename... Args>
477 static size_t Read(FILE *f, std::tuple<Args...> & t)
478 {
479 return(std::apply([&f](auto && ...args)
480 {
481 auto read_tuple_mem = [&f](auto && x) { return Read(f, x); };
482 return (read_tuple_mem(args) && ...);
483 }, t));
484 }
485
486 //------------------------------------------------------------------------
488 //------------------------------------------------------------------------
489 template <typename... Args>
490 static size_t Write(FILE *f, const std::tuple<Args...> & t)
491 {
492 return(std::apply([&f](auto && ...args)
493 {
494 auto write_tuple_mem = [&f](auto && x) { return Write(f, x); };
495 return (write_tuple_mem(args) && ...);
496 }, t));
497 }
498
499 //------------------------------------------------------------------------
503 //------------------------------------------------------------------------
504 static size_t Read(FILE *fp, std::monostate & sm)
505 {
506 return 1;
507 }
508
509 //------------------------------------------------------------------------
513 //------------------------------------------------------------------------
514 static size_t Write(FILE *fp, const std::monostate & sm)
515 {
516 return 1;
517 }
518
519 //------------------------------------------------------------------------
521 //------------------------------------------------------------------------
522 template <typename... Ts>
523 static size_t Read(FILE *fp, std::variant<Ts...> & v)
524 {
525 size_t rc = 0;
526 uint64_t index = 0;
527 if (Read(fp, index)) {
528 if (index < std::variant_size_v<std::variant<Ts...>>) {
529 v = VariantFromIndex<Ts...>(index);
530 std::visit([&] (auto && arg) { rc = Read(fp, arg); }, v);
531 }
532 }
533 return rc;
534 }
535
536 //------------------------------------------------------------------------
538 //------------------------------------------------------------------------
539 template <typename... Ts>
540 static size_t Write(FILE *fp, const std::variant<Ts...> & v)
541 {
542 size_t rc = 0;
543 uint64_t index = v.index();
544 if (Write(fp, index)) {
545 std::visit([&] (const auto & arg) { rc = Write(fp, arg); }, v);
546 }
547 return rc;
548 }
549
550 //------------------------------------------------------------------------
553 //------------------------------------------------------------------------
554 template<typename _keyT, typename _valueT, typename _Hash,
555 typename _Pred, typename _Alloc>
556 static size_t
557 Read(FILE *f, std::unordered_map<_keyT,_valueT,_Hash,_Pred,_Alloc> & hm)
558 {
559 return(PairAssocContRead<std::unordered_map<_keyT,_valueT,_Hash,_Pred,_Alloc> >(f, hm));
560 }
561
562 //------------------------------------------------------------------------
565 //------------------------------------------------------------------------
566 template<typename _keyT, typename _valueT, typename _Hash,
567 typename _Pred, typename _Alloc>
568 static size_t
569 Write(FILE *f, const std::unordered_map<_keyT,_valueT,_Hash,_Pred,_Alloc> & hm)
570 {
571 return(ContainerWrite<std::unordered_map<_keyT,_valueT,_Hash,_Pred,_Alloc> >(f, hm));
572 }
573
574 //------------------------------------------------------------------------
577 //------------------------------------------------------------------------
578 template<typename _keyT, typename _valueT, typename _Hash,
579 typename _Pred, typename _Alloc>
580 static size_t
581 Read(FILE *f, std::unordered_multimap<_keyT,_valueT,_Hash,_Pred,_Alloc> & hm)
582 {
583 return(PairAssocContRead<std::unordered_multimap<_keyT,_valueT,_Hash,_Pred,_Alloc> >(f, hm));
584 }
585
586 //------------------------------------------------------------------------
589 //------------------------------------------------------------------------
590 template<typename _keyT, typename _valueT, typename _Hash,
591 typename _Pred, typename _Alloc>
592 static size_t
593 Write(FILE *f, const std::unordered_multimap<_keyT,_valueT,_Hash,_Pred,_Alloc> & hm)
594 {
595 return(ContainerWrite<std::unordered_multimap<_keyT,_valueT,_Hash,_Pred,_Alloc> >(f, hm));
596 }
597
598 //------------------------------------------------------------------------
601 //------------------------------------------------------------------------
602 template<typename _valueT, typename _Hash,
603 typename _Pred, typename _Alloc>
604 static size_t
605 Read(FILE *f, std::unordered_set<_valueT,_Hash,_Pred,_Alloc> & hm)
606 {
607 return(ContainerRead<std::unordered_set<_valueT,_Hash,_Pred,_Alloc> >(f, hm));
608 }
609
610 //------------------------------------------------------------------------
613 //------------------------------------------------------------------------
614 template<typename _valueT, typename _Hash,
615 typename _Pred, typename _Alloc>
616 static size_t
617 Write(FILE *f, const std::unordered_set<_valueT,_Hash,_Pred,_Alloc> & hm)
618 {
619 return(ContainerWrite<std::unordered_set<_valueT,_Hash,_Pred,_Alloc> >(f, hm));
620 }
621
622 //------------------------------------------------------------------------
625 //------------------------------------------------------------------------
626 template<typename _valueT, typename _Hash,
627 typename _Pred, typename _Alloc>
628 static size_t
629 Read(FILE *f, std::unordered_multiset<_valueT,_Hash,_Pred,_Alloc> & hm)
630 {
631 return(ContainerRead<std::unordered_multiset<_valueT,_Hash,_Pred,_Alloc> >(f, hm));
632 }
633
634 //------------------------------------------------------------------------
637 //------------------------------------------------------------------------
638 template<typename _valueT, typename _Hash,
639 typename _Pred, typename _Alloc>
640 static size_t
641 Write(FILE *f, const std::unordered_multiset<_valueT,_Hash,_Pred,_Alloc> & hm)
642 {
643 return(ContainerWrite<std::unordered_multiset<_valueT,_Hash,_Pred,_Alloc> >(f, hm));
644 }
645
646 //------------------------------------------------------------------------
649 //------------------------------------------------------------------------
650 template <typename... Args>
651 static size_t ReadV(FILE *f, Args & ...args)
652 {
653 return (Read(f,args) && ...);
654 }
655
656 //------------------------------------------------------------------------
659 //------------------------------------------------------------------------
660 template <typename... Args>
661 static size_t WriteV(FILE *f, const Args & ...args)
662 {
663 return (Write(f,args) && ...);
664 }
665
666 private:
667 //------------------------------------------------------------------------
669 //------------------------------------------------------------------------
670 template <typename _inputIteratorT>
671 static size_t Write(FILE *file, _inputIteratorT f, _inputIteratorT l)
672 {
673 size_t rc = 0;
674 if (file) {
675 for ( ; f != l; ++f) {
676 if (Write(file, *f) <= 0) {
677 break;
678 }
679 }
680 if (f == l)
681 rc = 1;
682 }
683 return(rc);
684 }
685
686 //------------------------------------------------------------------------
689 //------------------------------------------------------------------------
690 template <typename _containerT>
691 static size_t ContainerRead(FILE *f, _containerT & c)
692 {
693 size_t rc = 0;
694 if (! c.empty())
695 c.clear();
696 if (f) {
697 uint64_t numEntries;
698 if (Read(f, numEntries)) {
699 uint64_t i = 0;
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));
704 else
705 break;
706 }
707 if (i == numEntries)
708 rc = 1;
709 }
710 }
711 return(rc);
712 }
713
714 //------------------------------------------------------------------------
717 //------------------------------------------------------------------------
718 template <typename _containerT>
719 static size_t ContainerWrite(FILE *f, const _containerT & c)
720 {
721 size_t rc = 0;
722 if (f) {
723 uint64_t numEntries = c.size();
724 if (Write(f, numEntries)) {
725 if (numEntries) {
727 c.begin(), c.end());
728 }
729 else {
730 rc = 1;
731 }
732 }
733 }
734 return(rc);
735 }
736
737 //------------------------------------------------------------------------
741 //------------------------------------------------------------------------
742 template <typename _containerT>
743 static size_t PairAssocContRead(FILE *f, _containerT & m)
744 {
745 ssize_t rc = 0;
746 if (! m.empty())
747 m.clear();
748 if (f) {
749 uint64_t numEntries;
750 if (Read(f, numEntries)) {
751 uint64_t i = 0;
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),
758 std::move(val)));
759 }
760 else {
761 break;
762 }
763 }
764 else {
765 break;
766 }
767 }
768 if (i == numEntries)
769 rc = 1;
770 }
771 }
772 return(rc);
773 }
774
775 };
776
777
778} // namespace Dwm
779
780#endif // _DWMFILEIO_HH_
781
782//---------------------------- emacs settings -----------------------------
783// Local Variables:
784// mode: C++
785// tab-width: 2
786// indent-tabs-mode: nil
787// c-basic-offset: 2
788// End:
789//-------------------------------------------------------------------------
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