6namespace Stroika::Foundation::Streams::InternallySynchronizedOutputStream {
9 template <
typename BASE_REP_TYPE,
typename OPTIONS>
10 struct Rep_ final : Memory::InheritAndUseBlockAllocationIfAppropriate<Rep_<BASE_REP_TYPE, OPTIONS>, BASE_REP_TYPE> {
11 using ElementType =
typename BASE_REP_TYPE::ElementType;
12 using inherited = Memory::InheritAndUseBlockAllocationIfAppropriate<Rep_<BASE_REP_TYPE, OPTIONS>, BASE_REP_TYPE>;
13 template <
typename... ARGS>
14 Rep_ (OPTIONS o, ARGS&&... args)
15 : inherited{forward<ARGS> (args)...}
19 Rep_ (
const Rep_&) =
delete;
20 virtual bool IsSeekable ()
const override
22 lock_guard critSec{fCriticalSection_};
23 return BASE_REP_TYPE::IsSeekable ();
25 virtual void CloseWrite ()
override
27 lock_guard critSec{fCriticalSection_};
28 BASE_REP_TYPE::CloseWrite ();
30 virtual bool IsOpenWrite ()
const override
32 lock_guard critSec{fCriticalSection_};
33 return BASE_REP_TYPE::IsOpenWrite ();
37 lock_guard critSec{fCriticalSection_};
38 Require (IsOpenWrite ());
39 return BASE_REP_TYPE::GetWriteOffset ();
41 virtual SeekOffsetType SeekWrite (Whence whence, SignedSeekOffsetType offset)
override
43 lock_guard critSec{fCriticalSection_};
44 Require (IsOpenWrite ());
45 return BASE_REP_TYPE::SeekWrite (whence, offset);
47 virtual void Write (span<const ElementType> elts)
override
49 lock_guard critSec{fCriticalSection_};
50 Require (IsOpenWrite ());
51 BASE_REP_TYPE::Write (elts);
53 virtual void Flush ()
override
55 lock_guard critSec{fCriticalSection_};
56 Require (IsOpenWrite ());
57 BASE_REP_TYPE::Flush ();
61 [[no_unique_address]] OPTIONS fOptions_;
62 mutable typename OPTIONS::MutexType fCriticalSection_;
64 template <
typename ELEMENT_TYPE,
typename OPTIONS>
65 struct Rep2_ : OutputStream::IRep<ELEMENT_TYPE> {
66 using ElementType = ELEMENT_TYPE;
67 Rep2_ ([[maybe_unused]]
const OPTIONS& o,
const OutputStream::Ptr<ELEMENT_TYPE>& stream2Wrap)
68 : fStream2Wrap{stream2Wrap}
71 virtual bool IsSeekable ()
const override
73 lock_guard critSec{fCriticalSection_};
74 return fStream2Wrap.IsSeekable ();
76 virtual void CloseWrite ()
override
78 lock_guard critSec{fCriticalSection_};
79 fStream2Wrap.CloseWrite ();
81 virtual bool IsOpenWrite ()
const override
83 lock_guard critSec{fCriticalSection_};
84 return fStream2Wrap.IsOpenWrite ();
88 lock_guard critSec{fCriticalSection_};
89 Require (IsOpenWrite ());
90 return fStream2Wrap.GetWriteOffset ();
92 virtual SeekOffsetType SeekWrite (Whence whence, SignedSeekOffsetType offset)
override
94 lock_guard critSec{fCriticalSection_};
95 Require (IsOpenWrite ());
96 return fStream2Wrap.SeekWrite (whence, offset);
98 virtual void Write (span<const ElementType> elts)
override
100 lock_guard critSec{fCriticalSection_};
101 Require (IsOpenWrite ());
102 fStream2Wrap.Write (elts);
104 virtual void Flush ()
override
106 lock_guard critSec{fCriticalSection_};
107 Require (IsOpenWrite ());
108 fStream2Wrap.Flush ();
112 OutputStream::Ptr<ELEMENT_TYPE> fStream2Wrap;
113 mutable typename OPTIONS::MutexType fCriticalSection_;
122 template <
typename BASE_REP_TYPE,
typename OPTIONS,
typename... ARGS>
123 inline Ptr<typename BASE_REP_TYPE::ElementType> New (
const OPTIONS& o, ARGS&&... args)
125 return Ptr<typename BASE_REP_TYPE::ElementType>{Memory::MakeSharedPtr<Private_::Rep_<BASE_REP_TYPE, OPTIONS>> (o, forward<ARGS> (args)...)};
127 template <
typename ELEMENT_TYPE,
typename OPTIONS>
128 inline Ptr<ELEMENT_TYPE> New (
const OPTIONS& o,
const OutputStream::Ptr<ELEMENT_TYPE>& stream2Wrap)
130 return Ptr<ELEMENT_TYPE>{make_shared<Private_::Rep2_<ELEMENT_TYPE, OPTIONS>> (o, stream2Wrap)};