42#ifndef _DWMDESCRIPTORIO_HH_
43#define _DWMDESCRIPTORIO_HH_
56#include <unordered_map>
57#include <unordered_set>
90 static ssize_t
Read(
int fd,
char & c);
96 static ssize_t
Write(
int fd,
char c);
102 static ssize_t
Read(
int fd, uint8_t & c);
108 static ssize_t
Write(
int fd, uint8_t c);
114 static ssize_t
Read(
int fd,
bool & b);
120 static ssize_t
Write(
int fd,
bool b);
126 static ssize_t
Read(
int fd, int16_t & val);
133 static ssize_t
Write(
int fd, int16_t val);
139 static ssize_t
Read(
int fd, uint16_t & val);
146 static ssize_t
Write(
int fd, uint16_t val);
152 static ssize_t
Read(
int fd, int32_t & val);
159 static ssize_t
Write(
int fd, int32_t val);
165 static ssize_t
Read(
int fd, uint32_t & val);
172 static ssize_t
Write(
int fd, uint32_t val);
178 static ssize_t
Read(
int fd, int64_t & val);
185 static ssize_t
Write(
int fd,
const int64_t & val);
191 static ssize_t
Read(
int fd, uint64_t & val);
198 static ssize_t
Write(
int fd,
const uint64_t & val);
205 static ssize_t
Read(
int fd,
float & val);
212 static ssize_t
Write(
int fd,
float val);
219 static ssize_t
Read(
int fd,
double & val);
226 static ssize_t
Write(
int fd,
const double & val);
234 static ssize_t
Read(
int fd, std::string & s);
243 static ssize_t
Write(
int fd,
const std::string & s);
250 {
return(val.
Read(fd)); }
257 {
return val.Read(fd); }
264 {
return(val.
Write(fd)); }
271 {
return val.Write(fd); }
277 template <
typename _firstT,
typename _secondT>
278 static ssize_t
Read(
int fd, std::pair<_firstT, _secondT> & p)
282 ssize_t bytesRead =
Read(fd, p.first);
285 bytesRead =
Read(fd, p.second);
299 template <
typename _firstT,
typename _secondT>
300 static ssize_t
Write(
int fd,
const std::pair<_firstT,_secondT> & p)
304 ssize_t bytesWritten =
Write(fd, p.first);
305 if (bytesWritten > 0) {
307 bytesWritten =
Write(fd, p.second);
308 if (bytesWritten > 0) {
323 template <
typename _keyT,
typename _valueT,
324 typename _Compare,
typename _Alloc>
325 static ssize_t
Read(
int fd, std::map<_keyT, _valueT, _Compare, _Alloc> & m)
327 return(PairAssocContRead<std::map<_keyT, _valueT, _Compare, _Alloc> >(fd, m));
334 template<
typename _keyT,
typename _valueT,
335 typename _Compare,
typename _Alloc>
337 Write(
int fd,
const std::map<_keyT,_valueT,_Compare,_Alloc> & m)
339 return(ContainerWrite<std::map<_keyT,_valueT,_Compare,_Alloc> >(fd, m));
346 template <
typename _keyT,
typename _valueT,
347 typename _Compare,
typename _Alloc>
349 Read(
int fd, std::multimap<_keyT, _valueT, _Compare, _Alloc> & m)
351 return(PairAssocContRead<std::multimap<_keyT,_valueT,_Compare,_Alloc> >(fd, m));
358 template <
typename _keyT,
typename _valueT,
359 typename _Compare,
typename _Alloc>
361 Write(
int fd,
const std::multimap<_keyT,_valueT, _Compare, _Alloc> & m)
363 return(ContainerWrite<std::multimap<_keyT,_valueT,_Compare,_Alloc> >(fd, m));
370 template <
typename _valueT, std::
size_t N>
371 static ssize_t
Read(
int fd, std::array<_valueT, N> & a)
374 for (std::size_t i = 0; i < N; ++i) {
375 ssize_t bytesRead =
Read(fd, a[i]);
391 template <
typename _valueT, std::
size_t N>
392 static ssize_t
Write(
int fd,
const std::array<_valueT, N> & a)
395 for (std::size_t i = 0; i < N; ++i) {
396 ssize_t bytesWritten =
Write(fd, a[i]);
397 if (bytesWritten > 0) {
412 template <
typename _valueT,
typename _Alloc>
413 static ssize_t
Read(
int fd, std::vector<_valueT, _Alloc> & v)
415 return(ContainerRead<std::vector<_valueT, _Alloc> >(fd, v));
422 template <
typename _valueT,
typename _Alloc>
423 static ssize_t
Write(
int fd,
const std::vector<_valueT, _Alloc> & v)
425 return(ContainerWrite<std::vector<_valueT, _Alloc> >(fd, v));
432 template <
typename _valueT,
typename _Alloc>
433 static ssize_t
Read(
int fd, std::deque<_valueT, _Alloc> & d)
435 return(ContainerRead<std::deque<_valueT, _Alloc> >(fd, d));
442 template <
typename _valueT,
typename _Alloc>
443 static ssize_t
Write(
int fd,
const std::deque<_valueT, _Alloc> & d)
445 return(ContainerWrite<std::deque<_valueT, _Alloc> >(fd, d));
452 template <
typename _valueT,
typename _Alloc>
453 static ssize_t
Read(
int fd, std::list<_valueT, _Alloc> & l)
455 return(ContainerRead<std::list<_valueT, _Alloc> >(fd, l));
462 template <
typename _valueT,
typename _Alloc>
463 static ssize_t
Write(
int fd,
const std::list<_valueT, _Alloc> & l)
465 return(ContainerWrite<std::list<_valueT, _Alloc> >(fd, l));
472 template <
typename _valueT,
typename _Compare,
typename _Alloc>
473 static ssize_t
Read(
int fd, std::set<_valueT, _Compare, _Alloc> & l)
475 return(ContainerRead<std::set<_valueT, _Compare, _Alloc> >(fd, l));
482 template <
typename _valueT,
typename _Compare,
typename _Alloc>
483 static ssize_t
Write(
int fd,
const std::set<_valueT, _Compare, _Alloc> & l)
485 return(ContainerWrite<std::set<_valueT, _Compare, _Alloc> >(fd, l));
492 template <
typename _valueT,
typename _Compare,
typename _Alloc>
493 static ssize_t
Read(
int fd, std::multiset<_valueT, _Compare, _Alloc> & l)
495 return(ContainerRead<std::multiset<_valueT, _Compare, _Alloc> >(fd, l));
502 template <
typename _valueT,
typename _Compare,
typename _Alloc>
504 Write(
int fd,
const std::multiset<_valueT, _Compare, _Alloc> & l)
506 return(ContainerWrite<std::multiset<_valueT, _Compare, _Alloc> >(fd, l));
513 template <
typename... Args>
514 static ssize_t
Read(
int fd, std::tuple<Args...> & t)
516 return(std::apply([&fd](
auto&&...args)
519 auto read_tuple_mem = [&fd,&rc](
auto&& x) {
520 int bytesRead =
Read(fd, x);
521 if (bytesRead > 0) { rc += bytesRead;
return true; }
522 else {
return false; }
524 if ((read_tuple_mem(args) && ...)) {
528 return (ssize_t)(-1);
537 template <
typename... Args>
538 static ssize_t
Write(
int fd,
const std::tuple<Args...> & t)
540 return(std::apply([&fd](
auto&&...args)
543 auto read_tuple_mem = [&fd,&rc](
auto&& x) {
544 int bytesWritten =
Write(fd, x);
545 if (bytesWritten > 0) { rc += bytesWritten;
return true; }
546 else {
return false; }
548 if ((read_tuple_mem(args) && ...)) {
552 return (ssize_t)(-1);
561 template <
typename _keyT,
typename _valueT,
562 typename _Hash,
typename _Pred,
typename _Alloc>
564 Read(
int fd, std::unordered_map<_keyT, _valueT, _Hash, _Pred, _Alloc> & m)
566 return(PairAssocContRead<std::unordered_map<_keyT, _valueT, _Hash, _Pred, _Alloc> >(fd, m));
573 template<
typename _keyT,
typename _valueT,
574 typename _Hash,
typename _Pred,
typename _Alloc>
577 const std::unordered_map<_keyT,_valueT,_Hash,_Pred,_Alloc> & m)
579 return(ContainerWrite<std::unordered_map<_keyT,_valueT,_Hash,_Pred,_Alloc> >(fd, m));
586 template <
typename _keyT,
typename _valueT,
587 typename _Hash,
typename _Pred,
typename _Alloc>
589 Read(
int fd, std::unordered_multimap<_keyT, _valueT, _Hash, _Pred, _Alloc> & m)
591 return(PairAssocContRead<std::unordered_multimap<_keyT, _valueT, _Hash, _Pred, _Alloc> >(fd, m));
598 template<
typename _keyT,
typename _valueT,
599 typename _Hash,
typename _Pred,
typename _Alloc>
601 Write(
int fd,
const std::unordered_multimap<_keyT,_valueT,_Hash,_Pred,_Alloc> & m)
603 return(ContainerWrite<std::unordered_multimap<_keyT,_valueT,_Hash,_Pred,_Alloc> >(fd, m));
610 template <
typename _valueT,
typename _Hash,
611 typename _Pred,
typename _Alloc>
613 Read(
int fd, std::unordered_set<_valueT, _Hash, _Pred, _Alloc> & m)
615 return(ContainerRead<std::unordered_set<_valueT, _Hash, _Pred, _Alloc> >(fd, m));
622 template<
typename _valueT,
typename _Hash,
623 typename _Pred,
typename _Alloc>
625 Write(
int fd,
const std::unordered_set<_valueT,_Hash,_Pred,_Alloc> & m)
627 return(ContainerWrite<std::unordered_set<_valueT,_Hash,_Pred,_Alloc> >(fd, m));
634 template <
typename _valueT,
typename _Hash,
635 typename _Pred,
typename _Alloc>
637 Read(
int fd, std::unordered_multiset<_valueT, _Hash, _Pred, _Alloc> & m)
639 return(ContainerRead<std::unordered_multiset<_valueT, _Hash, _Pred, _Alloc> >(fd, m));
646 template<
typename _valueT,
typename _Hash,
647 typename _Pred,
typename _Alloc>
649 Write(
int fd,
const std::unordered_multiset<_valueT,_Hash,_Pred,_Alloc> & m)
651 return(ContainerWrite<std::unordered_multiset<_valueT,_Hash,_Pred,_Alloc> >(fd, m));
659 static ssize_t
Read(
int fd, std::monostate & sm)
669 static ssize_t
Write(
int fd,
const std::monostate & sm)
678 template <
typename... Ts>
679 static ssize_t
Read(
int fd, std::variant<Ts...> & v)
683 ssize_t bytesRead =
Read(fd, index);
686 if (index < std::variant_size_v<std::variant<Ts...>>) {
688 std::visit([&] (
auto && arg) { bytesRead =
Read(fd, arg); }, v);
689 if (bytesRead >= 0) {
707 template <
typename... Ts>
708 static ssize_t
Write(
int fd,
const std::variant<Ts...> & v)
711 uint64_t index = v.index();
712 ssize_t bytesWritten =
Write(fd, index);
713 if (bytesWritten > 0) {
715 std::visit([&fd,&bytesWritten] (
const auto & arg)
716 { bytesWritten =
Write(fd, arg); }, v);
717 if (bytesWritten >= 0) {
731 template <
typename ...Args>
732 static ssize_t
ReadV(
int fd, Args & ...args)
735 auto readOne = [&] (
auto & arg) {
737 int bytesRead =
Read(fd,arg);
747 (readOne(args) && ...);
755 template <
typename ...Args>
756 static ssize_t
WriteV(
int fd,
const Args & ...args)
759 auto writeOne = [&] (
auto & arg) {
761 int bytesWritten =
Write(fd, arg);
762 if (bytesWritten > 0) {
771 (writeOne(args) && ...);
778 static ssize_t
Read(
int fd,
void *buf,
size_t buflen);
783 static ssize_t
Write(
int fd,
const void *buf,
size_t buflen);
789 template <
typename _inputIteratorT>
790 static ssize_t
Write(
int fd, _inputIteratorT f, _inputIteratorT l)
794 for ( ; f != l; ++f) {
795 ssize_t bytesWritten =
Write(fd, *f);
796 if (bytesWritten > 0) {
813 template <
typename _containerT>
814 static ssize_t ContainerRead(
int fd, _containerT & c)
821 ssize_t bytesRead =
Read(fd, numEntries);
822 if (bytesRead ==
sizeof(numEntries)) {
824 for (uint64_t i = 0; i < numEntries; ++i) {
825 typename _containerT::value_type val;
826 bytesRead =
Read(fd, val);
829 c.insert(c.end(), std::move(val));
846 template <
typename _containerT>
847 static ssize_t ContainerWrite(
int fd,
const _containerT & c)
851 uint64_t numEntries = c.size();
852 uint64_t bytesWritten =
Write(fd, numEntries);
853 if (bytesWritten ==
sizeof(numEntries)) {
860 if (bytesWritten > 0)
875 template <
typename _containerT>
876 static ssize_t PairAssocContRead(
int fd, _containerT & m)
883 ssize_t bytesRead =
Read(fd, numEntries);
884 if (bytesRead ==
sizeof(numEntries)) {
886 for (uint64_t i = 0; i < numEntries; ++i) {
887 typename _containerT::key_type key;
888 bytesRead =
Read(fd, key);
891 typename _containerT::mapped_type val;
892 bytesRead =
Read(fd, val);
895 m.insert(
typename _containerT::value_type(std::move(key),
Dwm::HasDescriptorRead and Dwm::HasDescriptorWrite concepts. Dwm::DescriptorReadable,...
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 DwmDescriptorIO.hh:84
static ssize_t Write(int fd, const std::monostate &sm)
Just a dummy helper function for std::variant instances that hold a std::monostate.
Definition DwmDescriptorIO.hh:669
static ssize_t Write(int fd, const std::tuple< Args... > &t)
Writes a tuple to a file descriptor.
Definition DwmDescriptorIO.hh:538
static ssize_t Write(int fd, const double &val)
Writes val to fd, in IEEE format (see RFC 1832 and/or ANSI/IEEE Standard 754-1985).
static ssize_t Write(int fd, uint8_t c)
Writes c to fd.
static ssize_t Read(int fd, std::multiset< _valueT, _Compare, _Alloc > &l)
Reads a multiset<_valueT> from a file descriptor.
Definition DwmDescriptorIO.hh:493
static ssize_t Read(int fd, std::map< _keyT, _valueT, _Compare, _Alloc > &m)
Reads a map<_keyT,_valueT> from a file descriptor.
Definition DwmDescriptorIO.hh:325
static ssize_t Read(int fd, std::deque< _valueT, _Alloc > &d)
Reads a deque<_valueT> from a file descriptor.
Definition DwmDescriptorIO.hh:433
static ssize_t Read(int fd, uint64_t &val)
Reads val from fd, in network byte order (MSB first).
static ssize_t Read(int fd, std::unordered_multiset< _valueT, _Hash, _Pred, _Alloc > &m)
Reads an unordered_multiset<_valueT> from a file descriptor.
Definition DwmDescriptorIO.hh:637
static ssize_t Read(int fd, int16_t &val)
Reads val from fd, in network byte order (MSB first).
static ssize_t Read(int fd, bool &b)
Reads b from fd.
static ssize_t Read(int fd, uint8_t &c)
Reads c from fd.
static ssize_t Write(int fd, uint16_t val)
Writes val to fd, in network byte order (MSB first).
static ssize_t Read(int fd, std::monostate &sm)
Just a dummy helper function for std::variant instances that hold a std::monostate.
Definition DwmDescriptorIO.hh:659
static ssize_t Read(int fd, std::pair< _firstT, _secondT > &p)
Reads a pair<_firstT,_secondT> from a file descriptor.
Definition DwmDescriptorIO.hh:278
static ssize_t Write(int fd, const std::set< _valueT, _Compare, _Alloc > &l)
Writes a set<_valueT> to a file descriptor.
Definition DwmDescriptorIO.hh:483
static ssize_t Write(int fd, const int64_t &val)
Writes val to fd, in network byte order (MSB first).
static ssize_t Read(int fd, int32_t &val)
Reads val from fd, in network byte order (MSB first).
static ssize_t Write(int fd, const std::multimap< _keyT, _valueT, _Compare, _Alloc > &m)
Writes a multimap<_keyT,_valueT> to a file descriptor.
Definition DwmDescriptorIO.hh:361
static ssize_t Read(int fd, std::set< _valueT, _Compare, _Alloc > &l)
Reads a set<_valueT> from a file descriptor.
Definition DwmDescriptorIO.hh:473
static ssize_t Read(int fd, HasDescriptorRead auto &val)
Reads val from fd, where val meets the requirements of the HasDescriptorRead concept.
Definition DwmDescriptorIO.hh:256
static ssize_t Write(int fd, const std::unordered_set< _valueT, _Hash, _Pred, _Alloc > &m)
Writes an unordered_set<_valueT> to a file descriptor.
Definition DwmDescriptorIO.hh:625
static ssize_t Write(int fd, char c)
Writes c to fd.
static ssize_t Write(int fd, const DescriptorWritable &val)
Wrapper function to write a DescriptorWritable object to a descriptor.
Definition DwmDescriptorIO.hh:263
static ssize_t Write(int fd, const std::unordered_multimap< _keyT, _valueT, _Hash, _Pred, _Alloc > &m)
Writes an unordered_multimap<_keyT,_valueT> to a file descriptor.
Definition DwmDescriptorIO.hh:601
static ssize_t Write(int fd, bool b)
Writes b to fd.
static ssize_t Write(int fd, const uint64_t &val)
Writes val to fd, in network byte order (MSB first).
static ssize_t Read(int fd, char &c)
Reads c from fd.
static ssize_t Read(int fd, uint32_t &val)
Reads val from fd, in network byte order (MSB first).
static ssize_t Write(int fd, const std::array< _valueT, N > &a)
Writes an array<_valueT,N> to a file descriptor.
Definition DwmDescriptorIO.hh:392
static ssize_t Write(int fd, const HasDescriptorWrite auto &val)
Writes val to fd, where val meets the requirements of the HasDescriptorWrite concept.
Definition DwmDescriptorIO.hh:270
static ssize_t Write(int fd, const std::string &s)
Writes s to fd.
static ssize_t Read(int fd, std::array< _valueT, N > &a)
Read an array<_valueT,N> from a file descriptor.
Definition DwmDescriptorIO.hh:371
static ssize_t Write(int fd, const std::unordered_multiset< _valueT, _Hash, _Pred, _Alloc > &m)
Writes an unordered_multiset<_valueT> to a file descriptor.
Definition DwmDescriptorIO.hh:649
static ssize_t WriteV(int fd, const Args &...args)
Writes args to fd.
Definition DwmDescriptorIO.hh:756
static ssize_t Read(int fd, std::unordered_map< _keyT, _valueT, _Hash, _Pred, _Alloc > &m)
Reads an unordered_map<_keyT,_valueT> from a file descriptor.
Definition DwmDescriptorIO.hh:564
static ssize_t Write(int fd, int16_t val)
Writes val to fd, in network byte order (MSB first).
static ssize_t Read(int fd, DescriptorReadable &val)
Wrapper function to read a DescriptorReadable object from a descriptor.
Definition DwmDescriptorIO.hh:249
static ssize_t Write(int fd, const std::deque< _valueT, _Alloc > &d)
Writes a deque<_valueT> to a file descriptor.
Definition DwmDescriptorIO.hh:443
static ssize_t Write(int fd, float val)
Writes val to fd, in IEEE format (see RFC 1832 and/or ANSI/IEEE Standard 754-1985).
static ssize_t Write(int fd, const std::vector< _valueT, _Alloc > &v)
Writes a vector<_valueT> to a file descriptor.
Definition DwmDescriptorIO.hh:423
static ssize_t Write(int fd, uint32_t val)
Writes val to fd, in network byte order (MSB first).
static ssize_t ReadV(int fd, Args &...args)
Reads args from fd.
Definition DwmDescriptorIO.hh:732
static ssize_t Read(int fd, int64_t &val)
Reads val from fd, in network byte order (MSB first).
static ssize_t Write(int fd, const std::variant< Ts... > &v)
Writes a variant to a descriptor.
Definition DwmDescriptorIO.hh:708
static ssize_t Read(int fd, std::unordered_set< _valueT, _Hash, _Pred, _Alloc > &m)
Reads an unordered_set<_valueT> from a file descriptor.
Definition DwmDescriptorIO.hh:613
static ssize_t Read(int fd, std::list< _valueT, _Alloc > &l)
Reads a list<_valueT> from a file descriptor.
Definition DwmDescriptorIO.hh:453
static ssize_t Write(int fd, const std::unordered_map< _keyT, _valueT, _Hash, _Pred, _Alloc > &m)
Writes an unordered_map<_keyT,_valueT> to a file descriptor.
Definition DwmDescriptorIO.hh:576
static ssize_t Write(int fd, const std::multiset< _valueT, _Compare, _Alloc > &l)
Writes a multiset<_valueT> to a file descriptor.
Definition DwmDescriptorIO.hh:504
static ssize_t Write(int fd, const std::map< _keyT, _valueT, _Compare, _Alloc > &m)
Writes a map<_keyT,_valueT> to a file descriptor.
Definition DwmDescriptorIO.hh:337
static ssize_t Read(int fd, std::variant< Ts... > &v)
Reads a variant from a descriptor.
Definition DwmDescriptorIO.hh:679
static ssize_t Read(int fd, std::vector< _valueT, _Alloc > &v)
Reads a vector<_valueT> from a file descriptor.
Definition DwmDescriptorIO.hh:413
static ssize_t Read(int fd, std::multimap< _keyT, _valueT, _Compare, _Alloc > &m)
Reads a multimap<_keyT,_valueT> from a file descriptor.
Definition DwmDescriptorIO.hh:349
static ssize_t Read(int fd, float &val)
Reads val from fd, in IEEE format (see RFC 1832 and/or ANSI/IEEE Standard 754-1985).
static ssize_t Read(int fd, std::unordered_multimap< _keyT, _valueT, _Hash, _Pred, _Alloc > &m)
Reads an unordered_multimap<_keyT,_valueT> from a file descriptor.
Definition DwmDescriptorIO.hh:589
static ssize_t Read(int fd, double &val)
Reads val from fd, in IEEE format (see RFC 1832 and/or ANSI/IEEE Standard 754-1985).
static ssize_t Write(int fd, const std::pair< _firstT, _secondT > &p)
Writes a pair<_firstT,_secondT> to a file descriptor.
Definition DwmDescriptorIO.hh:300
static ssize_t Read(int fd, uint16_t &val)
Reads val from fd, in network byte order (MSB first).
static ssize_t Write(int fd, const std::list< _valueT, _Alloc > &l)
Writes a list<_valueT> to a file descriptor.
Definition DwmDescriptorIO.hh:463
static ssize_t Read(int fd, std::string &s)
Reads s from fd.
static ssize_t Write(int fd, int32_t val)
Writes val to fd, in network byte order (MSB first).
static ssize_t Read(int fd, std::tuple< Args... > &t)
Reads a tuple from a file descriptor.
Definition DwmDescriptorIO.hh:514
This class defines an interface for classes that can read their contents from a file descriptor.
Definition DwmDescriptorIOCapable.hh:78
virtual ssize_t Read(int fd)=0
Read from a file descriptor.
This class defines an interface for classes that can write their contents to a file descriptor.
Definition DwmDescriptorIOCapable.hh:97
virtual ssize_t Write(int fd) const =0
Write to a file descriptor.
T has a Read(int) member that returns ssize_t (number of bytes read on success, -1 on failure).
Definition DwmDescriptorIOCapable.hh:60
T has a Write(int fd) const member that returns ssize_t (number of bytes read on success,...
Definition DwmDescriptorIOCapable.hh:69