diff --git a/libscio.hpp b/libscio.hpp index fd0b597..59b52d1 100644 --- a/libscio.hpp +++ b/libscio.hpp @@ -12,12 +12,13 @@ #include #include #include +#include namespace sc { namespace io { - class fdoutbuf: public std::streambuf { + class fdoutbuf : public std::streambuf { public: fdoutbuf(int fd): _fd(fd) {} @@ -44,6 +45,109 @@ namespace sc { }; + 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}; + }; + } }