// // libscio.hpp // libscio // // Created by Bob Polis at 2020-02-14 // Copyright (c) 2020 SwiftCoder. All rights reserved. // #ifndef _libscio_H_ #define _libscio_H_ #include #include #include #include namespace sc { namespace io { class fdoutbuf : public std::streambuf { public: fdoutbuf(int fd): _fd(fd) {} private: int _fd; int_type overflow(int_type c) override; std::streamsize xsputn(const char* s, std::streamsize num) override; }; class fdostream : public std::ostream { public: fdostream(int fd) : std::ostream(&_buf), _buf(fd) {} private: fdoutbuf _buf; }; class fdinbuf : public std::streambuf { }; class fdistream : public std::istream { }; class fdstream : public fdostream, public fdistream { }; class socketstream : public fdstream { }; class meminbuf : public std::streambuf { }; class memistream : public std::istream { }; class memoutbuf : public std::streambuf { }; class memostream : public std::ostream { }; class memstream : public memostream, public memistream { }; enum class byte_order { undefined, little_endian, big_endian }; class data_streamer { public: static byte_order cur_byte_order(); static inline void byte_swap(void* val, size_t n) { char* p = reinterpret_cast(val); for (size_t i = 0; i < n / 2; ++i) { std::swap(p[i], p[n - 1 - i]); } } data_streamer() = default; byte_order target_byte_order() const { return _target_byte_order; } void target_byte_order(byte_order new_byte_order) { _target_byte_order = new_byte_order; } std::string get4chars(std::istream& file) const; uint8_t getui8(std::istream& file) const; int8_t getsi8(std::istream& file) const; uin16_t getui16(std::istream& file) const; int16_t getsi16(std::istream& file) const; uint32_t getui24(std::istream& file) const; int32_t getsi24(std::istream& file) const; uint32_t getui32(std::istream& file) const; int32_t getsi32(std::istream& file) const; uint64_t getui64(std::istream& file) const; int64_t getsi64(std::istream& file) const; float getf32(std::istream& file) const; double getf64(std::istream& file) const; double getf80(std::istream& file) const; void put4chars(const std::string& s, ostream& file) const; void putui8(uint8_t val, std::ostream& file) const; void putsi8(int8_t val, std::ostream& file) const; void putui16(uint16_t val, std::ostream& file) const; void putsi16(int16_t val, std::ostream& file) const; void putui24(uint32_t val, std::ostream& file) const; void putsi24(int32_t val, std::ostream& file) const; void putui32(uint32_t val, std::ostream& file) const; void putsi32(int32_t val, std::ostream& file) const; void putui64(uint64_t val, std::ostream& file) const; void putsi64(int64_t val, std::ostream& file) const; void putf32(float val, std::ostream& file) const; void putf64(double val, std::ostream& file) const; void putf80(double val, std::ostream& file) const; private: byte_order _target_byte_order {cur_byte_order()}; }; class byte_order_changer { public: byte_order_changer(const data_streamer* ds, byte_order order); ~byte_order_changer(); byte_order_changer(byte_order_changer&& other); byte_order_changer& operator=(byte_order_changer&& other); byte_order_changer(const byte_order_changer&) = delete; byte_order_changer& operator=(const byte_order_changer&) = delete; private: data_streamer* _data_streamer {nullptr}; byte_order _saved_byte_order {byte_order::undefined}; }; } } #endif // _libscio_H_