From bacaa9fcee300f388054bbb0360e5d98acf41acb Mon Sep 17 00:00:00 2001 From: ADAM David Alan Martin Date: Wed, 25 Oct 2023 03:55:42 -0400 Subject: [PATCH] Make stream state have a default-construction option. Start integrating it for the field delimiters. --- IOStreams/OStreamable.test/0.cc | 36 ++++++++++++++++++++++++++++++++- IOStreams/StreamState.h | 6 +++--- IOStreams/delimiters.h | 13 ++++++++++-- 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/IOStreams/OStreamable.test/0.cc b/IOStreams/OStreamable.test/0.cc index 75280cd..21486b0 100644 --- a/IOStreams/OStreamable.test/0.cc +++ b/IOStreams/OStreamable.test/0.cc @@ -30,10 +30,28 @@ namespace stringify( const Agg &agg, const std::string delim ) { std::ostringstream oss; + Alepha::IOStreams::setGlobalFieldDelimiter( "YOU SHOULD NOT SEE THIS" ); oss << Alepha::IOStreams::setFieldDelimiter( delim ); oss << agg; return std::move( oss ).str(); } + + auto + stringify_global( const Agg &agg, const std::string delim ) + { + std::ostringstream oss; + Alepha::IOStreams::setGlobalFieldDelimiter( delim ); + oss << agg; + return std::move( oss ).str(); + } + + auto + stringify_default( const Agg &agg ) + { + std::ostringstream oss; + oss << agg; + return std::move( oss ).str(); + } } static auto init= Alepha::Utility::enroll <=[] @@ -41,7 +59,13 @@ static auto init= Alepha::Utility::enroll <=[] using namespace Alepha::Testing::exports; using namespace Alepha::Testing::literals::test_literals; - "Simple OStream"_test <=TableTest< stringify > + "Simple OStream (default delimiter)"_test <=TableTest< stringify_default > + ::Cases + { + { "smoke test", { { 1, 2, 3 } }, { "1\t2\t3" } }, + }; + + "Simple OStream (specific delimiter)"_test <=TableTest< stringify > ::Cases { { "smoke test", { { 1, 2, 3 }, "\t" }, { "1\t2\t3" } }, @@ -49,4 +73,14 @@ static auto init= Alepha::Utility::enroll <=[] { "smoke test", { { 1, 2, 3 }, ";;" }, { "1;;2;;3" } }, { "smoke test", { { 1, 2, 3 }, ", " }, { "1, 2, 3" } }, }; + + "Simple OStream (global delimiter)"_test <=TableTest< stringify_global > + ::Cases + { + { "smoke test", { { 1, 2, 3 }, "\t" }, { "1\t2\t3" } }, + { "smoke test", { { 1, 2, 3 }, "," }, { "1,2,3" } }, + { "smoke test", { { 1, 2, 3 }, ";;" }, { "1;;2;;3" } }, + { "smoke test", { { 1, 2, 3 }, ", " }, { "1, 2, 3" } }, + }; + }; diff --git a/IOStreams/StreamState.h b/IOStreams/StreamState.h index 0f32f40..dc23936 100644 --- a/IOStreams/StreamState.h +++ b/IOStreams/StreamState.h @@ -11,11 +11,11 @@ namespace Alepha::Hydrogen::IOStreams ::detail:: stream_state { inline namespace exports { - template< typename Tag, typename Type > + template< typename Tag, typename Type, auto Default= [] { return Type{}; } > class StreamState; } - template< typename Tag, typename Type > + template< typename Tag, typename Type, auto Default > class exports::StreamState { private: @@ -70,7 +70,7 @@ namespace Alepha::Hydrogen::IOStreams ::detail:: stream_state ios.register_callback( callback, index() ); } auto *&ptr= get_ptr( ios ); - if( not ptr ) ptr= new Type{}; + if( not ptr ) ptr= new Type{ Default() }; } public: diff --git a/IOStreams/delimiters.h b/IOStreams/delimiters.h index 097f4cd..6f543e3 100644 --- a/IOStreams/delimiters.h +++ b/IOStreams/delimiters.h @@ -20,8 +20,6 @@ namespace Alepha::Hydrogen::IOStreams ::detail:: delimiters enum { RecordDelimiter }; } - using FieldDelimiterState= StreamState< decltype( FieldDelimiter ), std::string >; - namespace C { const std::string defaultFieldDelimiter= "\t"; @@ -41,6 +39,15 @@ namespace Alepha::Hydrogen::IOStreams ::detail:: delimiters return storage::globalFieldDelimiter().value(); } + namespace exports + { + inline void + setGlobalFieldDelimiter( const std::string delim ) + { + storage::globalFieldDelimiter()= delim; + } + } + inline char globalRecordDelimiter() { @@ -48,6 +55,8 @@ namespace Alepha::Hydrogen::IOStreams ::detail:: delimiters return storage::globalRecordDelimiter().value(); } + using FieldDelimiterState= StreamState< decltype( FieldDelimiter ), std::string, globalFieldDelimiter >; + inline std::ostream & operator << ( std::ostream &os, decltype( FieldDelimiter ) ) {