diff --git a/IOStreams/CMakeLists.txt b/IOStreams/CMakeLists.txt index 09f5d84..a37fa4f 100644 --- a/IOStreams/CMakeLists.txt +++ b/IOStreams/CMakeLists.txt @@ -1,2 +1,3 @@ add_subdirectory( IStreamable.test ) add_subdirectory( OStreamable.test ) +add_subdirectory( Streamable.test ) diff --git a/IOStreams/Streamable.test/0.cc b/IOStreams/Streamable.test/0.cc new file mode 100644 index 0000000..c0b2e17 --- /dev/null +++ b/IOStreams/Streamable.test/0.cc @@ -0,0 +1,57 @@ +static_assert( __cplusplus > 2020'00 ); + +#include "../streamable.h" + +#include +#include + +#include + +#include + +#include + +namespace +{ + template< typename= Alepha::Capabilities< Alepha::auto_comparable, Alepha::IOStreams::streamable > > + struct Agg_core + { + int x; + int y; + int z; + }; + + using Agg= Agg_core<>; + static_assert( Alepha::Aggregate< Agg > ); + static_assert( Alepha::Capability< Agg, Alepha::IOStreams::IStreamable > ); + static_assert( Alepha::Capability< Agg, Alepha::IOStreams::OStreamable > ); +} + + +std::string +roundTripString( const std::string text, const std::string delim ) +{ + using namespace Alepha::IOStreams::exports::delimiters; + std::istringstream iss{ text }; + + Agg agg; + iss >> setFieldDelimiter( delim ) >> agg; + + std::ostringstream oss; + oss << setFieldDelimiter( delim ) << agg; + + return oss.str(); +} + +static auto init= Alepha::Utility::enroll <=[] +{ + using namespace Alepha::Testing::exports; + using namespace Alepha::Testing::literals::test_literals; + + "Simple IStream"_test <=TableTest< roundTripString > + ::Cases + { + { "smoke test", { "1\t2\t3", "\t" }, { "1\t2\t3" } }, + { "smoke test", { "1,2,3", "," }, { "1,2,3" } }, + }; +}; diff --git a/IOStreams/Streamable.test/CMakeLists.txt b/IOStreams/Streamable.test/CMakeLists.txt new file mode 100644 index 0000000..b099603 --- /dev/null +++ b/IOStreams/Streamable.test/CMakeLists.txt @@ -0,0 +1 @@ +unit_test( 0 ) diff --git a/IOStreams/streamable.h b/IOStreams/streamable.h new file mode 100644 index 0000000..197dc4e --- /dev/null +++ b/IOStreams/streamable.h @@ -0,0 +1,21 @@ +static_assert( __cplusplus > 2020'00 ); + +#pragma once + +#include + +#include "IStreamable.h" +#include "OStreamable.h" + +namespace Alepha::Hydrogen::IOStreams ::detail:: streamable_m +{ + inline namespace exports + { + struct streamable : OStreamable, IStreamable {}; + } +} + +namespace Alepha::Hydrogen::IOStreams::inline exports::inline streamable_m +{ + using namespace detail::streamable_m::exports; +}