6#include "Stroika/Foundation/Streams/InternallySynchronizedOutputStream.h"
8namespace Stroika::Foundation::Streams::SplitterOutputStream {
11 template <
typename ELEMENT_TYPE>
12 class Rep_ :
public OutputStream::IRep<ELEMENT_TYPE> {
14 Rep_ (
const typename OutputStream::Ptr<ELEMENT_TYPE>& realOut1,
const typename OutputStream::Ptr<ELEMENT_TYPE>& realOut2)
15 : fRealOut1_{realOut1}
16 , fRealOut2_{realOut2}
21 virtual bool IsSeekable ()
const override
24 return fRealOut1_.IsSeekable () and fRealOut2_.IsSeekable ();
26 virtual void CloseWrite ()
override
30 fRealOut1_.CloseWrite ();
31 fRealOut2_.CloseWrite ();
33 Assert (fRealOut1_ ==
nullptr);
34 Assert (fRealOut2_ ==
nullptr);
35 Ensure (not IsOpenWrite ());
37 virtual bool IsOpenWrite ()
const override
40 Assert (fRealOut1_.IsOpenWrite () == fRealOut2_.IsOpenWrite ());
41 return fRealOut1_.IsOpenWrite ();
46 Assert (fRealOut1_.GetWriteOffset () == fRealOut2_.GetWriteOffset ());
47 return fRealOut1_.GetWriteOffset ();
49 virtual SeekOffsetType SeekWrite (Whence whence, SignedSeekOffsetType offset)
override
51 Require (IsOpenWrite ());
54 [[maybe_unused]]
SeekOffsetType o2 = fRealOut2_.SeekWrite (whence, offset);
58 virtual void Flush ()
override
61 Require (IsOpenWrite ());
67 virtual void Write (span<const ELEMENT_TYPE> elts)
override
69 Require (start < end);
70 Require (IsOpenWrite ());
72 fRealOut1_.Write (start, end);
73 fRealOut2_.Write (start, end);
77 typename OutputStream::Ptr<ELEMENT_TYPE> fRealOut1_;
78 typename OutputStream::Ptr<ELEMENT_TYPE> fRealOut2_;
79 [[no_unique_address]] Debug::AssertExternallySynchronizedMutex fThisAssertExternallySynchronized_;
88 template <
typename ELEMENT_TYPE>
92 return Memory::MakeSharedPtr<Private_::Rep_> (realOut1, realOut2);
94 template <
typename ELEMENT_TYPE>
98 switch (internallySynchronized) {
99 case Execution::eInternallySynchronized:
100 return Streams::InternallySynchronizedOutputStream::New<Private_::Rep_> ({}, fileName, seekable);
101 case Execution::eNotKnownInternallySynchronized:
102 return New<ELEMENT_TYPE> (realOut1, realOut2);
#define RequireNotReached()
shared_lock< const AssertExternallySynchronizedMutex > ReadContext
Instantiate AssertExternallySynchronizedMutex::ReadContext to designate an area of code where protect...
unique_lock< AssertExternallySynchronizedMutex > WriteContext
Instantiate AssertExternallySynchronizedMutex::WriteContext to designate an area of code where protec...
OutputStream<>::Ptr is Smart pointer to a stream-based sink of data.
A Streams::Ptr<ELEMENT_TYPE> is a smart-pointer to a stream of elements of type T.