6namespace Stroika::Foundation::Streams::InternallySynchronizedInputOutputStream {
9 template <
typename BASE_REP_TYPE,
typename OPTIONS>
10 struct Rep_ final : Memory::InheritAndUseBlockAllocationIfAppropriate<Rep_<BASE_REP_TYPE, OPTIONS>, BASE_REP_TYPE> {
11 using inherited = Memory::InheritAndUseBlockAllocationIfAppropriate<Rep_<BASE_REP_TYPE, OPTIONS>, BASE_REP_TYPE>;
12 using ElementType =
typename BASE_REP_TYPE::ElementType;
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 [[maybe_unused]] lock_guard critSec{fCriticalSection_};
23 return BASE_REP_TYPE::IsSeekable ();
25 virtual void CloseRead ()
override
27 [[maybe_unused]] lock_guard critSec{fCriticalSection_};
28 BASE_REP_TYPE::CloseRead ();
30 virtual bool IsOpenRead ()
const override
32 [[maybe_unused]] lock_guard critSec{fCriticalSection_};
33 return BASE_REP_TYPE::IsOpenRead ();
37 [[maybe_unused]] lock_guard critSec{fCriticalSection_};
38 Require (IsOpenRead ());
39 return BASE_REP_TYPE::GetReadOffset ();
41 virtual SeekOffsetType SeekRead (Whence whence, SignedSeekOffsetType offset)
override
43 [[maybe_unused]] lock_guard critSec{fCriticalSection_};
44 Require (IsOpenRead ());
45 return BASE_REP_TYPE::SeekRead (whence, offset);
47 virtual optional<size_t> AvailableToRead ()
override
49 [[maybe_unused]] lock_guard critSec{fCriticalSection_};
50 Require (IsOpenRead ());
51 return BASE_REP_TYPE::AvailableToRead ();
53 virtual optional<SeekOffsetType> RemainingLength ()
override
55 [[maybe_unused]] lock_guard critSec{fCriticalSection_};
56 Require (IsOpenRead ());
57 return BASE_REP_TYPE::RemainingLength ();
59 virtual optional<span<ElementType>> Read (span<ElementType> intoBuffer, NoDataAvailableHandling blockFlag)
override
61 [[maybe_unused]] lock_guard critSec{fCriticalSection_};
62 Require (IsOpenRead ());
63 return BASE_REP_TYPE::Read (intoBuffer, blockFlag);
65 virtual void CloseWrite ()
override
67 [[maybe_unused]] lock_guard critSec{fCriticalSection_};
68 BASE_REP_TYPE::CloseWrite ();
70 virtual bool IsOpenWrite ()
const override
72 [[maybe_unused]] lock_guard critSec{fCriticalSection_};
73 return BASE_REP_TYPE::IsOpenWrite ();
77 [[maybe_unused]] lock_guard critSec{fCriticalSection_};
78 Require (IsOpenWrite ());
79 return BASE_REP_TYPE::GetWriteOffset ();
81 virtual SeekOffsetType SeekWrite (Whence whence, SignedSeekOffsetType offset)
override
83 [[maybe_unused]] lock_guard critSec{fCriticalSection_};
84 Require (IsOpenWrite ());
85 return BASE_REP_TYPE::SeekWrite (whence, offset);
87 virtual void Write (span<const ElementType> elts)
override
89 [[maybe_unused]] lock_guard critSec{fCriticalSection_};
90 Require (IsOpenWrite ());
91 BASE_REP_TYPE::Write (elts);
93 virtual void Flush ()
override
95 [[maybe_unused]] lock_guard critSec{fCriticalSection_};
96 Require (IsOpenWrite ());
97 BASE_REP_TYPE::Flush ();
101 [[no_unique_address]] OPTIONS fOptions_;
102 mutable typename OPTIONS::MutexType fCriticalSection_;
104 template <
typename ELEMENT_TYPE,
typename OPTIONS>
105 struct Rep2_ : InputOutputStream::IRep<ELEMENT_TYPE> {
106 using ElementType = ELEMENT_TYPE;
107 Rep2_ ([[maybe_unused]]
const OPTIONS& o,
const InputOutputStream::Ptr<ELEMENT_TYPE>& stream2Wrap)
108 : fStream2Wrap{stream2Wrap}
111 virtual bool IsSeekable ()
const override
113 [[maybe_unused]] lock_guard critSec{fCriticalSection_};
114 return fStream2Wrap.IsSeekable ();
116 virtual void CloseRead ()
override
118 [[maybe_unused]] lock_guard critSec{fCriticalSection_};
120 fStream2Wrap.CloseRead ();
122 Ensure (not IsOpenRead ());
124 virtual bool IsOpenRead ()
const override
126 [[maybe_unused]] lock_guard critSec{fCriticalSection_};
127 return fStream2Wrap.IsOpenRead ();
131 [[maybe_unused]] lock_guard critSec{fCriticalSection_};
132 Require (IsOpenRead ());
133 return fStream2Wrap.GetReadOffset ();
135 virtual SeekOffsetType SeekRead (Whence whence, SignedSeekOffsetType offset)
override
137 [[maybe_unused]] lock_guard critSec{fCriticalSection_};
138 Require (IsOpenRead ());
139 return fStream2Wrap.SeekRead (whence, offset);
141 virtual optional<size_t> AvailableToRead ()
override
143 [[maybe_unused]] lock_guard critSec{fCriticalSection_};
144 Require (IsOpenRead ());
145 return fStream2Wrap.AvailableToRead ();
147 virtual optional<SeekOffsetType> RemainingLength ()
override
149 [[maybe_unused]] lock_guard critSec{fCriticalSection_};
150 Require (IsOpenRead ());
151 return fStream2Wrap.RemainingLength ();
153 virtual size_t Read (span<ElementType> intoBuffer, NoDataAvailableHandling blockFlag)
override
155 [[maybe_unused]] lock_guard critSec{fCriticalSection_};
156 Require (IsOpenRead ());
157 return fStream2Wrap.Read (intoBuffer, blockFlag);
161 InputOutputStream::Ptr<ELEMENT_TYPE> fStream2Wrap;
162 mutable typename OPTIONS::MutexType fCriticalSection_;
171 template <
typename BASE_REP_TYPE,
typename OPTIONS,
typename... ARGS>
172 inline auto New (
const OPTIONS& o, ARGS&&... args) -> Ptr<typename BASE_REP_TYPE::ElementType>
174 return Ptr<typename BASE_REP_TYPE::ElementType>{make_shared<Private_::Rep_<BASE_REP_TYPE, OPTIONS>> (o, forward<ARGS> (args)...)};
176 template <
typename ELEMENT_TYPE,
typename OPTIONS>
177 inline Ptr<ELEMENT_TYPE> New (
const OPTIONS& o,
const InputOutputStream::Ptr<ELEMENT_TYPE>& stream2Wrap)
179 return Ptr<ELEMENT_TYPE>{make_shared<Private_::Rep2_<ELEMENT_TYPE, OPTIONS>> (o, stream2Wrap)};