5namespace Stroika::Frameworks::Led {
12 inline TextStore::SimpleUpdater::SimpleUpdater (TextStore& ts,
const UpdateInfo& updateInfo)
15 , fUpdateInfo (updateInfo)
20 ts.CollectAllMarkersInRangeInto_OrSurroundings (updateInfo.fReplaceFrom, updateInfo.fReplaceTo, kAnyMarkerOwner, fMarkerSink);
21 ts.DoAboutToUpdateCalls (fUpdateInfo, fMarkerSink.fMarkers.begin (), fMarkerSink.fMarkers.end ());
23 inline TextStore::SimpleUpdater::SimpleUpdater (TextStore& ts,
size_t from,
size_t to,
bool realContentUpdate)
26 , fUpdateInfo (from, to, LED_TCHAR_OF (
""), 0, false, realContentUpdate)
31 ts.CollectAllMarkersInRangeInto_OrSurroundings (from, to, kAnyMarkerOwner, fMarkerSink);
32 ts.DoAboutToUpdateCalls (fUpdateInfo, fMarkerSink.fMarkers.begin (), fMarkerSink.fMarkers.end ());
34 inline TextStore::SimpleUpdater::~SimpleUpdater ()
37 fTextStore.DoDidUpdateCalls (fUpdateInfo, fMarkerSink.fMarkers.begin (), fMarkerSink.fMarkers.end ());
40 inline void TextStore::SimpleUpdater::Cancel ()
50 inline TextStore::SearchParameters::SearchParameters (
const Led_tString& searchString,
bool wrap,
bool wholeWord,
bool caseSensative)
51 : fMatchString (searchString)
53 , fWholeWordSearch (wholeWord)
54 , fCaseSensativeSearch (caseSensative)
63 inline TextStore::VectorMarkerSink::VectorMarkerSink (vector<Marker*>* markers)
74 inline TextStore::TextStore ()
76 fMarkerOwners.push_back (
this);
85 inline void TextStore::AddMarkerOwner (MarkerOwner* owner)
88#if !qVirtualBaseMixinCallDuringCTORBug
89 Require (owner->PeekAtTextStore () ==
this);
91 Require (find (fMarkerOwners.begin (), fMarkerOwners.end (), owner) == fMarkerOwners.end ());
92 PUSH_BACK (fMarkerOwners, owner);
99 inline void TextStore::RemoveMarkerOwner (MarkerOwner* owner)
102#if !qVirtualBaseMixinCallDuringCTORBug
103 Require (owner->PeekAtTextStore () ==
this);
105 vector<MarkerOwner*>::iterator i = find (fMarkerOwners.begin (), fMarkerOwners.end (), owner);
106 Assert (i != fMarkerOwners.end ());
107 fMarkerOwners.erase (i);
114 inline const vector<MarkerOwner*>& TextStore::GetMarkerOwners () const noexcept
116 return fMarkerOwners;
122 inline void TextStore::RemoveMarker (Marker* marker)
124 RemoveMarkers (&marker, 1);
131 inline size_t TextStore::GetStart ()
139 inline size_t TextStore::GetEnd ()
const
141 return (GetLength ());
156 inline vector<Marker*> TextStore::CollectAllMarkersInRange (
size_t from,
size_t to,
const MarkerOwner* owner)
const
158 Require (from <= to);
159 Require (to <= GetEnd () + 1);
160 vector<Marker*> list;
161 VectorMarkerSink vml (&list);
162 CollectAllMarkersInRangeInto (from, to, owner, vml);
165 inline void TextStore::CollectAllMarkersInRangeInto_OrSurroundings (
size_t from,
size_t to,
const MarkerOwner* owner, MarkerSink& output)
const
167 Require (from <= to);
168 Require (to <= GetEnd () + 1);
169 CollectAllMarkersInRangeInto ((from > 0) ? (from - 1) : from, min (to + 1, GetEnd () + 1), owner, output);
171 inline void TextStore::CollectAllMarkersInRangeInto (
size_t from,
size_t to,
const MarkerOwner* owner, vector<Marker*>* markerList)
const
174 markerList->clear ();
175 VectorMarkerSink vml (markerList);
176 CollectAllMarkersInRangeInto (from, to, owner, vml);
178 inline vector<Marker*> TextStore::CollectAllMarkersInRange_OrSurroundings (
size_t from,
size_t to,
const MarkerOwner* owner)
const
180 Require (from <= to);
181 Require (to <= GetEnd () + 1);
182 return CollectAllMarkersInRange ((from > 0) ? (from - 1) : from, min (to + 1, GetEnd () + 1), owner);
184 inline void TextStore::CollectAllMarkersInRangeInto_OrSurroundings (
size_t from,
size_t to,
const MarkerOwner* owner, vector<Marker*>* markerList)
const
186 Require (from <= to);
187 Require (to <= GetEnd () + 1);
189 VectorMarkerSink vml (markerList);
190 CollectAllMarkersInRangeInto ((from > 0) ? (from - 1) : from, min (to + 1, GetEnd () + 1), owner, vml);
192 inline size_t TextStore::CharacterToTCharIndex (
size_t i)
196 inline size_t TextStore::TCharToCharacterIndex (
size_t i)
205 inline void TextStore::SetMarkerStart (Marker* marker,
size_t start)
noexcept
207 SetMarkerRange (marker, start, marker->GetEnd ());
214 inline void TextStore::SetMarkerEnd (Marker* marker,
size_t end)
noexcept
216 SetMarkerRange (marker, marker->GetStart (), end);
224 inline void TextStore::SetMarkerLength (Marker* marker,
size_t length)
noexcept
226 size_t start = marker->GetStart ();
227 SetMarkerRange (marker, start, start + length);
229 inline size_t TextStore::GetLineLength (
size_t lineNumber)
const
231 return (GetStartOfLine (lineNumber) - GetEndOfLine (lineNumber));
233 inline size_t TextStore::FindNextCharacter (
size_t afterPos)
const
235 if (afterPos >= GetEnd ()) {
238 size_t result = afterPos + 1;
239 Ensure (result <= GetEnd ());
251 inline shared_ptr<TextBreaks> TextStore::GetTextBreaker ()
const
253 if (fTextBreaker ==
nullptr) {
254 fTextBreaker = make_shared<TextBreaks_DefaultImpl> ();
262 inline void TextStore::SetTextBreaker (
const shared_ptr<TextBreaks>& textBreaker)
264 fTextBreaker = textBreaker;
266 inline void TextStore::Invariant ()
const
268#if qStroika_Foundation_Debug_AssertionsChecked and qStroika_Frameworks_Led_HeavyDebugging
272 inline bool TextStore::Overlap (
size_t mStart,
size_t mEnd,
size_t from,
size_t to)
274 Require (mStart <= mEnd);
275 Require (from <= to);
277 if ((from <= mEnd) and (mStart <= to)) {
281 Assert (mEnd >= from);
282 overlapSize = min (mEnd - from, mEnd - mStart);
285 Assert (to >= mStart);
286 overlapSize = min (to - from, to - mStart);
288 Assert (overlapSize <= (to - from));
289 Assert (overlapSize <= (mEnd - mStart));
291 if (overlapSize == 0) {
296 return mEnd == mStart;
333 inline bool TextStore::Overlap (
const Marker& m,
size_t from,
size_t to)
335 Require (from <= to);
339 m.GetRange (&start, &end);
340 Assert (start <= end);
342#if qStroika_Foundation_Debug_AssertionsChecked
347 bool oldAlgorithmAnswer;
354 oldAlgorithmAnswer = (from < Xend) and (start < to);
358 if ((from <= end) and (start <= to)) {
362 Assert (end >= from);
363 overlapSize = min (end - from, end - start);
366 Assert (to >= start);
367 overlapSize = min (to - from, to - start);
369 Assert (overlapSize <= (to - from));
370 Assert (overlapSize <= (end - start));
372 if (overlapSize == 0) {
381#if qStroika_Foundation_Debug_AssertionsChecked
382 Ensure (oldAlgorithmAnswer ==
true);
388#if qStroika_Foundation_Debug_AssertionsChecked
389 Ensure (oldAlgorithmAnswer ==
false);
400 template <
typename T>
401 inline MarkerOfATypeMarkerSink<T>::MarkerOfATypeMarkerSink ()
405 template <
typename T>
406 void MarkerOfATypeMarkerSink<T>::Append (Marker* m)
409 T* tMarker =
dynamic_cast<T*
> (m);
410 if (tMarker !=
nullptr) {
411 Assert (fResult ==
nullptr);
421 template <
typename T>
422 inline MarkersOfATypeMarkerSink2Vector<T>::MarkersOfATypeMarkerSink2Vector ()
426 template <
typename T>
427 void MarkersOfATypeMarkerSink2Vector<T>::Append (Marker* m)
430 T* tMarker =
dynamic_cast<T*
> (m);
431 if (tMarker !=
nullptr) {
432 PUSH_BACK (fResult, tMarker);
441 template <
typename T>
442 inline MarkersOfATypeMarkerSink2SmallStackBuffer<T>::MarkersOfATypeMarkerSink2SmallStackBuffer ()
446 template <
typename T>
447 void MarkersOfATypeMarkerSink2SmallStackBuffer<T>::Append (Marker* m)
450 T* tMarker =
dynamic_cast<T*
> (m);
451 if (tMarker !=
nullptr) {
452 fResult.push_back (tMarker);
#define RequireNotNull(p)