6namespace Stroika::Frameworks::Led {
9 void SetMarkerRange_ (TextStore& textstore, Marker* marker,
size_t start,
size_t end)
noexcept;
10 void PreRemoveMarker_ (TextStore& textstore, Marker* marker);
11 void RemoveMarkers_ (TextStore& textstore, Marker*
const markerArray[],
size_t markerCount);
25 inline TextStore& MarkerOwner::GetTextStore ()
const
27 TextStore* ts = PeekAtTextStore ();
36 inline void MarkerOwner::AboutToUpdateText (
const UpdateInfo& )
46 inline void MarkerOwner::EarlyDidUpdateText (
const UpdateInfo& )
noexcept
55 inline void MarkerOwner::DidUpdateText (
const UpdateInfo& )
noexcept
65 inline void Marker::AboutToUpdateText (
const UpdateInfo& )
75 inline void Marker::DidUpdateText (
const UpdateInfo& )
noexcept
84 inline size_t Marker::GetStart ()
const
87 return fTextStoreHook->GetStart ();
95 inline size_t Marker::GetEnd ()
const
98 return fTextStoreHook->GetEnd ();
105 inline size_t Marker::GetLength ()
const
108 return fTextStoreHook->GetLength ();
116 inline MarkerOwner* Marker::GetOwner ()
const
119 return (fTextStoreHook ==
nullptr ?
nullptr : fTextStoreHook->GetOwner ());
126 inline void Marker::GetRange (
size_t* start,
size_t* end)
const
131 fTextStoreHook->GetStartEnd (start, end);
139 inline MarkerOwner::UpdateInfo::UpdateInfo (
size_t from,
size_t to,
const Led_tChar* withWhat,
size_t withWhatCharCount,
140 bool textModified,
bool realContentUpdate)
143 , fTextInserted{withWhat}
144 , fTextLength{withWhatCharCount}
145 , fTextModified{textModified}
146 , fRealContentUpdate{realContentUpdate}
149 inline size_t MarkerOwner::UpdateInfo::GetResultingRHS ()
const
151 return fTextModified ? (fReplaceFrom + fTextLength) : fReplaceTo;
159 template <
typename MARKER>
160 inline MarkerMortuary<MARKER>::~MarkerMortuary ()
162 Assert (fMarkersToBeDeleted.size () == 0);
164 template <
typename MARKER>
179 inline void MarkerMortuary<MARKER>::AccumulateMarkerForDeletion (MARKER* m)
182 Require (IndexOf (fMarkersToBeDeleted, m) == kBadIndex);
184 if (fMarkersToBeDeleted.size () != 0) {
185 RequireNotNull (
static_cast<Marker*
> (fMarkersToBeDeleted[0])->GetOwner ());
186 RequireNotNull (
static_cast<Marker*
> (fMarkersToBeDeleted[0])->GetOwner ()->PeekAtTextStore ());
188 RequireNotNull (
static_cast<Marker*
> (m)->GetOwner ()->PeekAtTextStore ());
189 Require (
static_cast<Marker*
> (fMarkersToBeDeleted[0])->GetOwner ()->PeekAtTextStore () ==
190 static_cast<Marker*
> (m)->GetOwner ()->PeekAtTextStore ());
195 Private_::PreRemoveMarker_ (
static_cast<Marker*
> (m)->GetOwner ()->GetTextStore (), m);
199 fMarkersToBeDeleted.push_back (m);
201 template <
typename MARKER>
206 void MarkerMortuary<MARKER>::SafeAccumulateMarkerForDeletion (MARKER* m)
209 if (IndexOf (fMarkersToBeDeleted, m) == kBadIndex) {
210 AccumulateMarkerForDeletion (m);
213 template <
typename MARKER>
219 void MarkerMortuary<MARKER>::FinalizeMarkerDeletions () noexcept
221 if (fMarkersToBeDeleted.size () != 0) {
222 MarkerOwner* owner =
static_cast<Marker*
> (fMarkersToBeDeleted[0])->GetOwner ();
224 TextStore& textStore = owner->GetTextStore ();
227 MARKER*
const* markersToBeDeleted_ = &fMarkersToBeDeleted.front ();
228 Marker*
const* markersToBeDeleted = (Marker*
const*)markersToBeDeleted_;
229 Private_::RemoveMarkers_ (textStore, markersToBeDeleted, fMarkersToBeDeleted.size ());
230 for (
size_t i = 0; i < fMarkersToBeDeleted.size (); ++i) {
231 delete fMarkersToBeDeleted[i];
233 fMarkersToBeDeleted.clear ();
236 template <
typename MARKER>
241 inline bool MarkerMortuary<MARKER>::IsEmpty () const noexcept
243 return fMarkersToBeDeleted.size () == 0;
259 inline bool Contains (
const Marker& containedMarker,
const Marker& containerMarker)
261 size_t containerStart;
263 containerMarker.GetRange (&containerStart, &containerEnd);
265 size_t containedStart;
267 containedMarker.GetRange (&containedStart, &containedEnd);
268 return ((containedStart >= containerStart) and (containerEnd >= containedEnd));
270 inline bool Contains (
size_t containedMarkerStart,
size_t containedMarkerEnd,
const Marker& containerMarker)
272 Assert (containedMarkerStart <= containedMarkerEnd);
273 size_t containerStart;
275 containerMarker.GetRange (&containerStart, &containerEnd);
276 return ((containedMarkerStart >= containerStart) and (containerEnd >= containedMarkerEnd));
278 inline bool Contains (
const Marker& marker,
size_t charPos)
282 marker.GetRange (&start, &end);
283 return (charPos >= start and charPos < end);
285 inline bool Contains (
size_t containedMarkerStart,
size_t containedMarkerEnd,
size_t charPos)
287 return (charPos >= containedMarkerStart and charPos < containedMarkerEnd);
295 inline size_t TempMarker::GetStart ()
const
297 return fMarker.GetStart ();
299 inline size_t TempMarker::GetEnd ()
const
301 return fMarker.GetEnd ();
303 inline size_t TempMarker::GetLength ()
const
305 return fMarker.GetLength ();
307 inline void TempMarker::GetLocation (
size_t* start,
size_t* end)
const
309 fMarker.GetRange (start, end);
317 template <
typename MARKER>
318 TemporaryMarkerSlideDown<MARKER>::TemporaryMarkerSlideDown (TextStore& ts,
const vector<MARKER*>& m, ptrdiff_t slideBy)
323 for (
auto i = fMarkers.begin (); i != fMarkers.end (); ++i) {
326 (*i)->GetRange (&start, &end);
327 Private_::SetMarkerRange_ (fTextStore, (*i), start + fSlideBy, end + fSlideBy);
330 template <
typename MARKER>
331 TemporaryMarkerSlideDown<MARKER>::~TemporaryMarkerSlideDown ()
333 for (
auto i = fMarkers.begin (); i != fMarkers.end (); ++i) {
336 (*i)->GetRange (&start, &end);
337 Private_::SetMarkerRange_ (fTextStore, (*i), start - fSlideBy, end - fSlideBy);
#define qStroika_Foundation_Debug_AssertionsChecked
The qStroika_Foundation_Debug_AssertionsChecked flag determines if assertions are checked and validat...
#define RequireNotNull(p)