Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
InternallySynchronizedOutputStream.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
5
6namespace Stroika::Foundation::Streams::InternallySynchronizedOutputStream {
7
8 namespace Private_ {
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)...}
16 , fOptions_{o}
17 {
18 }
19 Rep_ (const Rep_&) = delete;
20 virtual bool IsSeekable () const override
21 {
22 lock_guard critSec{fCriticalSection_};
23 return BASE_REP_TYPE::IsSeekable ();
24 }
25 virtual void CloseWrite () override
26 {
27 lock_guard critSec{fCriticalSection_};
28 BASE_REP_TYPE::CloseWrite ();
29 }
30 virtual bool IsOpenWrite () const override
31 {
32 lock_guard critSec{fCriticalSection_};
33 return BASE_REP_TYPE::IsOpenWrite ();
34 }
35 virtual SeekOffsetType GetWriteOffset () const override
36 {
37 lock_guard critSec{fCriticalSection_};
38 Require (IsOpenWrite ());
39 return BASE_REP_TYPE::GetWriteOffset ();
40 }
41 virtual SeekOffsetType SeekWrite (Whence whence, SignedSeekOffsetType offset) override
42 {
43 lock_guard critSec{fCriticalSection_};
44 Require (IsOpenWrite ());
45 return BASE_REP_TYPE::SeekWrite (whence, offset);
46 }
47 virtual void Write (span<const ElementType> elts) override
48 {
49 lock_guard critSec{fCriticalSection_};
50 Require (IsOpenWrite ());
51 BASE_REP_TYPE::Write (elts);
52 }
53 virtual void Flush () override
54 {
55 lock_guard critSec{fCriticalSection_};
56 Require (IsOpenWrite ());
57 BASE_REP_TYPE::Flush ();
58 }
59
60 private:
61 [[no_unique_address]] OPTIONS fOptions_;
62 mutable typename OPTIONS::MutexType fCriticalSection_;
63 };
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}
69 {
70 }
71 virtual bool IsSeekable () const override
72 {
73 lock_guard critSec{fCriticalSection_};
74 return fStream2Wrap.IsSeekable ();
75 }
76 virtual void CloseWrite () override
77 {
78 lock_guard critSec{fCriticalSection_};
79 fStream2Wrap.CloseWrite ();
80 }
81 virtual bool IsOpenWrite () const override
82 {
83 lock_guard critSec{fCriticalSection_};
84 return fStream2Wrap.IsOpenWrite ();
85 }
86 virtual SeekOffsetType GetWriteOffset () const override
87 {
88 lock_guard critSec{fCriticalSection_};
89 Require (IsOpenWrite ());
90 return fStream2Wrap.GetWriteOffset ();
91 }
92 virtual SeekOffsetType SeekWrite (Whence whence, SignedSeekOffsetType offset) override
93 {
94 lock_guard critSec{fCriticalSection_};
95 Require (IsOpenWrite ());
96 return fStream2Wrap.SeekWrite (whence, offset);
97 }
98 virtual void Write (span<const ElementType> elts) override
99 {
100 lock_guard critSec{fCriticalSection_};
101 Require (IsOpenWrite ());
102 fStream2Wrap.Write (elts);
103 }
104 virtual void Flush () override
105 {
106 lock_guard critSec{fCriticalSection_};
107 Require (IsOpenWrite ());
108 fStream2Wrap.Flush ();
109 }
110
111 private:
112 OutputStream::Ptr<ELEMENT_TYPE> fStream2Wrap;
113 mutable typename OPTIONS::MutexType fCriticalSection_;
114 };
115 }
116
117 /*
118 ********************************************************************************
119 ***************** InternallySynchronizedOutputStream<>::New ********************
120 ********************************************************************************
121 */
122 template <typename BASE_REP_TYPE, typename OPTIONS, typename... ARGS>
123 inline Ptr<typename BASE_REP_TYPE::ElementType> New (const OPTIONS& o, ARGS&&... args)
124 {
125 return Ptr<typename BASE_REP_TYPE::ElementType>{Memory::MakeSharedPtr<Private_::Rep_<BASE_REP_TYPE, OPTIONS>> (o, forward<ARGS> (args)...)};
126 }
127 template <typename ELEMENT_TYPE, typename OPTIONS>
128 inline Ptr<ELEMENT_TYPE> New (const OPTIONS& o, const OutputStream::Ptr<ELEMENT_TYPE>& stream2Wrap)
129 {
130 return Ptr<ELEMENT_TYPE>{make_shared<Private_::Rep2_<ELEMENT_TYPE, OPTIONS>> (o, stream2Wrap)};
131 }
132
133}