From 8520b876891b4441e50022bf934a84b0e965b06a Mon Sep 17 00:00:00 2001 From: ADAM David Alan Martin Date: Wed, 18 Oct 2023 01:43:05 -0400 Subject: [PATCH] Stackable streambuf cleanup needs to be per-instance. --- Utility/StackableStreambuf.h | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/Utility/StackableStreambuf.h b/Utility/StackableStreambuf.h index 8f7d188..0954e9b 100644 --- a/Utility/StackableStreambuf.h +++ b/Utility/StackableStreambuf.h @@ -24,6 +24,7 @@ namespace Alepha::Hydrogen::Utility ::detail:: stackable_streambuf inline namespace impl { void releaseStack( std::ios_base &ios ); + bool releaseTop( std::ostream &os ); void iosCallback( const std::ios_base::event event, std::ios_base &ios, const int idx ); } @@ -68,19 +69,26 @@ namespace Alepha::Hydrogen::Utility ::detail:: stackable_streambuf } }; + inline bool + impl::releaseTop( std::ostream &os ) + { + auto *const streambuf= os.rdbuf(); + if( not streambuf ) return false; + auto *const stacked= dynamic_cast< StackableStreambuf * >( streambuf ); + if( not stacked ) return false; + + stacked->drain(); + os.rdbuf( stacked->underlying ); + delete stacked; + return true; + } + inline void impl::releaseStack( std::ios_base &ios ) { auto &os= dynamic_cast< std::ostream & >( ios ); - auto *streambuf= os.rdbuf(); - while( auto *stacked= dynamic_cast< StackableStreambuf * >( streambuf ) ) - { - streambuf= stacked->underlying; - stacked->drain(); - os.rdbuf( stacked->underlying ); - delete stacked; - } + while( releaseTop( os ) ); } inline void @@ -113,7 +121,7 @@ namespace Alepha::Hydrogen::Utility ::detail:: stackable_streambuf std::ostream & operator << ( std::ostream &os, PopStack< T > ) { - releaseStack( os ); + if( not releaseTop( os ) ) throw std::logic_error( "OStream has no stacked streambufs!" ); return os; }