#ifndef IO_HH #define IO_HH #include namespace io { class pipe { public: pipe(); pipe(pipe&& other); ~pipe(); pipe& operator=(pipe&& other) { reset(); swap(other); return *this; } bool open(); explicit operator bool() const { return read() != -1; } void reset(); void swap(pipe& pipe); int read() const { return fd_[0]; } int write() const { return fd_[1]; } private: pipe(pipe const&) = delete; pipe& operator=(pipe const&) = delete; int fd_[2]; }; class unique_fd { public: unique_fd(); explicit unique_fd(int fd); unique_fd(unique_fd&& fd); ~unique_fd(); unique_fd& operator=(unique_fd&& fd) { reset(); swap(fd); return *this; } int get() const { return fd_; } explicit operator bool() const { return get() != -1; } void reset(); void reset(int fd); void swap(unique_fd& fd); int release(); private: unique_fd(unique_fd const& fd) = delete; unique_fd& operator=(unique_fd const& fd) = delete; int fd_; }; bool read(pipe const& pipe, void* dst, size_t max, size_t* got = nullptr); bool write(pipe const& pipe, void const* src, size_t size, size_t* wrote = nullptr); bool read(unique_fd const& fd, void* dst, size_t max, size_t* got = nullptr); bool write(unique_fd const& fd, void const* src, size_t size, size_t* wrote = nullptr); } // namespace #endif // IO_HH