diff --git a/IOStreams/CMakeLists.txt b/IOStreams/CMakeLists.txt index c3ed932..ade9e39 100644 --- a/IOStreams/CMakeLists.txt +++ b/IOStreams/CMakeLists.txt @@ -1,3 +1,4 @@ add_subdirectory( IStreamable.test ) add_subdirectory( OStreamable.test ) add_subdirectory( streamable.test ) +add_subdirectory( OutUnixFileBuf.test ) diff --git a/IOStreams/OutUnixFileBuf.h b/IOStreams/OutUnixFileBuf.h new file mode 100644 index 0000000..1827953 --- /dev/null +++ b/IOStreams/OutUnixFileBuf.h @@ -0,0 +1,47 @@ +static_assert( __cplusplus > 2020'99 ); + +#pragma once + +#include + +#include + +#include + +namespace Alepha::Hydrogen::IOStreams ::detail:: OutUnixFileBuf_m +{ + inline namespace exports + { + class OutUnixFileBuf; + } + + class exports::OutUnixFileBuf + : virtual public std::streambuf + { + private: + int fd; + + int + overflow( const int ch_ ) override + { + if( ch_ == EOF ) throw std::runtime_error{ "Unexpected EOF" }; + const char ch= ch_; + xsputn( &ch, 1 ); + return ch_; + } + + std::streamsize + xsputn( const char *const data, const std::streamsize amt ) override + { + return ::write( fd, data, amt ); + } + + public: + explicit OutUnixFileBuf( const int fd ) : fd( fd ) {} + }; +} + +namespace Alepha::Hydrogen::IOStreams::inline exports::inline OutUnixFileBuf_m +{ + using namespace detail::OutUnixFileBuf_m::exports; +} diff --git a/IOStreams/OutUnixFileBuf.test/0.cc b/IOStreams/OutUnixFileBuf.test/0.cc new file mode 100644 index 0000000..d5ec5ae --- /dev/null +++ b/IOStreams/OutUnixFileBuf.test/0.cc @@ -0,0 +1,28 @@ +static_assert( __cplusplus > 2020'99 ); + +#include "../OutUnixFileBuf.h" + +#include +#include + +#include +#include + +#include + +auto init= Alepha::Utility::enroll <=[] +{ + using namespace Alepha::Testing::exports; + + "Can we write to /dev/null?"_test <=[] + { + const auto fd= Alepha::AutoRAII + { + []{ return open( "/dev/null", O_WRONLY ); }, + ::close + }; + + Alepha::IOStreams::OutUnixFileBuf buf{ fd }; + std::ostream file{ &buf }; + }; +}; diff --git a/IOStreams/OutUnixFileBuf.test/CMakeLists.txt b/IOStreams/OutUnixFileBuf.test/CMakeLists.txt new file mode 100644 index 0000000..b099603 --- /dev/null +++ b/IOStreams/OutUnixFileBuf.test/CMakeLists.txt @@ -0,0 +1 @@ +unit_test( 0 )