4#include "InternallySynchronizedOutputStream.h"
7namespace Stroika::Foundation::Streams::SplitterOutputStream {
10 template <
typename ELEMENT_TYPE>
11 class Rep_ :
public OutputStream::IRep<ELEMENT_TYPE> {
13 Rep_ (
const typename OutputStream::Ptr<ELEMENT_TYPE>& realOut1,
const typename OutputStream::Ptr<ELEMENT_TYPE>& realOut2)
14 : fRealOut1_{realOut1}
15 , fRealOut2_{realOut2}
20 virtual bool IsSeekable ()
const override
23 return fRealOut1_.IsSeekable () and fRealOut2_.IsSeekable ();
25 virtual void CloseWrite ()
override
29 fRealOut1_.CloseWrite ();
30 fRealOut2_.CloseWrite ();
32 Assert (fRealOut1_ ==
nullptr);
33 Assert (fRealOut2_ ==
nullptr);
34 Ensure (not IsOpenWrite ());
36 virtual bool IsOpenWrite ()
const override
39 Assert (fRealOut1_.IsOpenWrite () == fRealOut2_.IsOpenWrite ());
40 return fRealOut1_.IsOpenWrite ();
45 Assert (fRealOut1_.GetWriteOffset () == fRealOut2_.GetWriteOffset ());
46 return fRealOut1_.GetWriteOffset ();
48 virtual SeekOffsetType SeekWrite (Whence whence, SignedSeekOffsetType offset)
override
50 Require (IsOpenWrite ());
53 [[maybe_unused]]
SeekOffsetType o2 = fRealOut2_.SeekWrite (whence, offset);
57 virtual void Flush ()
override
60 Require (IsOpenWrite ());
66 virtual void Write (span<const ELEMENT_TYPE> elts)
override
68 Require (start < end);
69 Require (IsOpenWrite ());
71 fRealOut1_.Write (start, end);
72 fRealOut2_.Write (start, end);
76 typename OutputStream::Ptr<ELEMENT_TYPE> fRealOut1_;
77 typename OutputStream::Ptr<ELEMENT_TYPE> fRealOut2_;
78 [[no_unique_address]] Debug::AssertExternallySynchronizedMutex fThisAssertExternallySynchronized_;
87 template <
typename ELEMENT_TYPE>
91 return make_shared<Private_::Rep_> (realOut1, realOut2);
93 template <
typename ELEMENT_TYPE>
97 switch (internallySynchronized) {
98 case Execution::eInternallySynchronized:
99 return Streams::InternallySynchronizedOutputStream::New<Private_::Rep_> ({}, fileName, seekable);
100 case Execution::eNotKnownInternallySynchronized:
101 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.