7namespace Stroika::Frameworks::Led {
14 inline TextStore::SimpleUpdater::SimpleUpdater (TextStore& ts,
const UpdateInfo& updateInfo)
17 , fUpdateInfo (updateInfo)
22 ts.CollectAllMarkersInRangeInto_OrSurroundings (updateInfo.fReplaceFrom, updateInfo.fReplaceTo, kAnyMarkerOwner, fMarkerSink);
23 ts.DoAboutToUpdateCalls (fUpdateInfo, fMarkerSink.fMarkers.begin (), fMarkerSink.fMarkers.end ());
25 inline TextStore::SimpleUpdater::SimpleUpdater (TextStore& ts,
size_t from,
size_t to,
bool realContentUpdate)
28 , fUpdateInfo (from, to, LED_TCHAR_OF (
""), 0, false, realContentUpdate)
33 ts.CollectAllMarkersInRangeInto_OrSurroundings (from, to, kAnyMarkerOwner, fMarkerSink);
34 ts.DoAboutToUpdateCalls (fUpdateInfo, fMarkerSink.fMarkers.begin (), fMarkerSink.fMarkers.end ());
36 inline TextStore::SimpleUpdater::~SimpleUpdater ()
39 fTextStore.DoDidUpdateCalls (fUpdateInfo, fMarkerSink.fMarkers.begin (), fMarkerSink.fMarkers.end ());
42 inline void TextStore::SimpleUpdater::Cancel ()
52 inline TextStore::SearchParameters::SearchParameters (
const Led_tString& searchString,
bool wrap,
bool wholeWord,
bool caseSensative)
53 : fMatchString (searchString)
55 , fWholeWordSearch (wholeWord)
56 , fCaseSensativeSearch (caseSensative)
65 inline TextStore::VectorMarkerSink::VectorMarkerSink (vector<Marker*>* markers)
76 inline TextStore::TextStore ()
78 fMarkerOwners.push_back (
this);
87 inline void TextStore::AddMarkerOwner (MarkerOwner* owner)
90#if !qVirtualBaseMixinCallDuringCTORBug
91 Require (owner->PeekAtTextStore () ==
this);
93 Require (find (fMarkerOwners.begin (), fMarkerOwners.end (), owner) == fMarkerOwners.end ());
94 PUSH_BACK (fMarkerOwners, owner);
101 inline void TextStore::RemoveMarkerOwner (MarkerOwner* owner)
104#if !qVirtualBaseMixinCallDuringCTORBug
105 Require (owner->PeekAtTextStore () ==
this);
107 vector<MarkerOwner*>::iterator i = find (fMarkerOwners.begin (), fMarkerOwners.end (), owner);
108 Assert (i != fMarkerOwners.end ());
109 fMarkerOwners.erase (i);
116 inline const vector<MarkerOwner*>& TextStore::GetMarkerOwners () const noexcept
118 return fMarkerOwners;
124 inline void TextStore::RemoveMarker (Marker* marker)
126 RemoveMarkers (&marker, 1);
133 inline size_t TextStore::GetStart ()
141 inline size_t TextStore::GetEnd ()
const
143 return (GetLength ());
158 inline vector<Marker*> TextStore::CollectAllMarkersInRange (
size_t from,
size_t to,
const MarkerOwner* owner)
const
160 Require (from <= to);
161 Require (to <= GetEnd () + 1);
162 vector<Marker*> list;
163 VectorMarkerSink vml (&list);
164 CollectAllMarkersInRangeInto (from, to, owner, vml);
167 inline void TextStore::CollectAllMarkersInRangeInto_OrSurroundings (
size_t from,
size_t to,
const MarkerOwner* owner, MarkerSink& output)
const
169 Require (from <= to);
170 Require (to <= GetEnd () + 1);
171 CollectAllMarkersInRangeInto ((from > 0) ? (from - 1) : from, min (to + 1, GetEnd () + 1), owner, output);
173 inline void TextStore::CollectAllMarkersInRangeInto (
size_t from,
size_t to,
const MarkerOwner* owner, vector<Marker*>* markerList)
const
176 markerList->clear ();
177 VectorMarkerSink vml (markerList);
178 CollectAllMarkersInRangeInto (from, to, owner, vml);
180 inline vector<Marker*> TextStore::CollectAllMarkersInRange_OrSurroundings (
size_t from,
size_t to,
const MarkerOwner* owner)
const
182 Require (from <= to);
183 Require (to <= GetEnd () + 1);
184 return CollectAllMarkersInRange ((from > 0) ? (from - 1) : from, min (to + 1, GetEnd () + 1), owner);
186 inline void TextStore::CollectAllMarkersInRangeInto_OrSurroundings (
size_t from,
size_t to,
const MarkerOwner* owner, vector<Marker*>* markerList)
const
188 Require (from <= to);
189 Require (to <= GetEnd () + 1);
191 VectorMarkerSink vml (markerList);
192 CollectAllMarkersInRangeInto ((from > 0) ? (from - 1) : from, min (to + 1, GetEnd () + 1), owner, vml);
194 inline size_t TextStore::CharacterToTCharIndex (
size_t i)
198 inline size_t TextStore::TCharToCharacterIndex (
size_t i)
207 inline void TextStore::SetMarkerStart (Marker* marker,
size_t start)
noexcept
209 SetMarkerRange (marker, start, marker->GetEnd ());
216 inline void TextStore::SetMarkerEnd (Marker* marker,
size_t end)
noexcept
218 SetMarkerRange (marker, marker->GetStart (), end);
226 inline void TextStore::SetMarkerLength (Marker* marker,
size_t length)
noexcept
228 size_t start = marker->GetStart ();
229 SetMarkerRange (marker, start, start + length);
231 inline size_t TextStore::GetLineLength (
size_t lineNumber)
const
233 return (GetStartOfLine (lineNumber) - GetEndOfLine (lineNumber));
235 inline size_t TextStore::FindNextCharacter (
size_t afterPos)
const
237 if (afterPos >= GetEnd ()) {
240 size_t result = afterPos + 1;
241 Ensure (result <= GetEnd ());
253 inline shared_ptr<TextBreaks> TextStore::GetTextBreaker ()
const
255 if (fTextBreaker ==
nullptr) {
256 fTextBreaker = Memory::MakeSharedPtr<TextBreaks_DefaultImpl> ();
264 inline void TextStore::SetTextBreaker (
const shared_ptr<TextBreaks>& textBreaker)
266 fTextBreaker = textBreaker;
268 inline void TextStore::Invariant ()
const
270#if qStroika_Foundation_Debug_AssertionsChecked and qStroika_Frameworks_Led_HeavyDebugging
274 inline bool TextStore::Overlap (
size_t mStart,
size_t mEnd,
size_t from,
size_t to)
276 Require (mStart <= mEnd);
277 Require (from <= to);
279 if ((from <= mEnd) and (mStart <= to)) {
283 Assert (mEnd >= from);
284 overlapSize = min (mEnd - from, mEnd - mStart);
287 Assert (to >= mStart);
288 overlapSize = min (to - from, to - mStart);
290 Assert (overlapSize <= (to - from));
291 Assert (overlapSize <= (mEnd - mStart));
293 if (overlapSize == 0) {
298 return mEnd == mStart;
335 inline bool TextStore::Overlap (
const Marker& m,
size_t from,
size_t to)
337 Require (from <= to);
341 m.GetRange (&start, &end);
342 Assert (start <= end);
344#if qStroika_Foundation_Debug_AssertionsChecked
349 bool oldAlgorithmAnswer;
356 oldAlgorithmAnswer = (from < Xend) and (start < to);
360 if ((from <= end) and (start <= to)) {
364 Assert (end >= from);
365 overlapSize = min (end - from, end - start);
368 Assert (to >= start);
369 overlapSize = min (to - from, to - start);
371 Assert (overlapSize <= (to - from));
372 Assert (overlapSize <= (end - start));
374 if (overlapSize == 0) {
383#if qStroika_Foundation_Debug_AssertionsChecked
384 Ensure (oldAlgorithmAnswer ==
true);
390#if qStroika_Foundation_Debug_AssertionsChecked
391 Ensure (oldAlgorithmAnswer ==
false);
402 template <
typename T>
403 inline MarkerOfATypeMarkerSink<T>::MarkerOfATypeMarkerSink ()
407 template <
typename T>
408 void MarkerOfATypeMarkerSink<T>::Append (Marker* m)
411 T* tMarker =
dynamic_cast<T*
> (m);
412 if (tMarker !=
nullptr) {
413 Assert (fResult ==
nullptr);
423 template <
typename T>
424 inline MarkersOfATypeMarkerSink2Vector<T>::MarkersOfATypeMarkerSink2Vector ()
428 template <
typename T>
429 void MarkersOfATypeMarkerSink2Vector<T>::Append (Marker* m)
432 T* tMarker =
dynamic_cast<T*
> (m);
433 if (tMarker !=
nullptr) {
434 PUSH_BACK (fResult, tMarker);
443 template <
typename T>
444 inline MarkersOfATypeMarkerSink2SmallStackBuffer<T>::MarkersOfATypeMarkerSink2SmallStackBuffer ()
448 template <
typename T>
449 void MarkersOfATypeMarkerSink2SmallStackBuffer<T>::Append (Marker* m)
452 T* tMarker =
dynamic_cast<T*
> (m);
453 if (tMarker !=
nullptr) {
454 fResult.push_back (tMarker);
#define RequireNotNull(p)