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 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 Require (owner->PeekAtTextStore () ==
this);
103 vector<MarkerOwner*>::iterator i = find (fMarkerOwners.begin (), fMarkerOwners.end (), owner);
104 Assert (i != fMarkerOwners.end ());
105 fMarkerOwners.erase (i);
112 inline const vector<MarkerOwner*>& TextStore::GetMarkerOwners () const noexcept
114 return fMarkerOwners;
120 inline void TextStore::RemoveMarker (Marker* marker)
122 RemoveMarkers (&marker, 1);
129 inline size_t TextStore::GetStart ()
137 inline size_t TextStore::GetEnd ()
const
139 return (GetLength ());
154 inline vector<Marker*> TextStore::CollectAllMarkersInRange (
size_t from,
size_t to,
const MarkerOwner* owner)
const
156 Require (from <= to);
157 Require (to <= GetEnd () + 1);
158 vector<Marker*> list;
159 VectorMarkerSink vml (&list);
160 CollectAllMarkersInRangeInto (from, to, owner, vml);
163 inline void TextStore::CollectAllMarkersInRangeInto_OrSurroundings (
size_t from,
size_t to,
const MarkerOwner* owner, MarkerSink& output)
const
165 Require (from <= to);
166 Require (to <= GetEnd () + 1);
167 CollectAllMarkersInRangeInto ((from > 0) ? (from - 1) : from, min (to + 1, GetEnd () + 1), owner, output);
169 inline void TextStore::CollectAllMarkersInRangeInto (
size_t from,
size_t to,
const MarkerOwner* owner, vector<Marker*>* markerList)
const
172 markerList->clear ();
173 VectorMarkerSink vml (markerList);
174 CollectAllMarkersInRangeInto (from, to, owner, vml);
176 inline vector<Marker*> TextStore::CollectAllMarkersInRange_OrSurroundings (
size_t from,
size_t to,
const MarkerOwner* owner)
const
178 Require (from <= to);
179 Require (to <= GetEnd () + 1);
180 return CollectAllMarkersInRange ((from > 0) ? (from - 1) : from, min (to + 1, GetEnd () + 1), owner);
182 inline void TextStore::CollectAllMarkersInRangeInto_OrSurroundings (
size_t from,
size_t to,
const MarkerOwner* owner, vector<Marker*>* markerList)
const
184 Require (from <= to);
185 Require (to <= GetEnd () + 1);
187 VectorMarkerSink vml (markerList);
188 CollectAllMarkersInRangeInto ((from > 0) ? (from - 1) : from, min (to + 1, GetEnd () + 1), owner, vml);
190 inline size_t TextStore::CharacterToTCharIndex (
size_t i)
194 inline size_t TextStore::TCharToCharacterIndex (
size_t i)
203 inline void TextStore::SetMarkerStart (Marker* marker,
size_t start)
noexcept
205 SetMarkerRange (marker, start, marker->GetEnd ());
212 inline void TextStore::SetMarkerEnd (Marker* marker,
size_t end)
noexcept
214 SetMarkerRange (marker, marker->GetStart (), end);
222 inline void TextStore::SetMarkerLength (Marker* marker,
size_t length)
noexcept
224 size_t start = marker->GetStart ();
225 SetMarkerRange (marker, start, start + length);
227 inline size_t TextStore::GetLineLength (
size_t lineNumber)
const
229 return (GetStartOfLine (lineNumber) - GetEndOfLine (lineNumber));
231 inline size_t TextStore::FindNextCharacter (
size_t afterPos)
const
233 if (afterPos >= GetEnd ()) {
236 size_t result = afterPos + 1;
237 Ensure (result <= GetEnd ());
249 inline shared_ptr<TextBreaks> TextStore::GetTextBreaker ()
const
251 if (fTextBreaker ==
nullptr) {
252 fTextBreaker = Memory::MakeSharedPtr<TextBreaks_DefaultImpl> ();
260 inline void TextStore::SetTextBreaker (
const shared_ptr<TextBreaks>& textBreaker)
262 fTextBreaker = textBreaker;
264 inline void TextStore::Invariant ()
const
266#if qStroika_Foundation_Debug_AssertionsChecked and qStroika_Frameworks_Led_HeavyDebugging
270 inline bool TextStore::Overlap (
size_t mStart,
size_t mEnd,
size_t from,
size_t to)
272 Require (mStart <= mEnd);
273 Require (from <= to);
275 if ((from <= mEnd) and (mStart <= to)) {
279 Assert (mEnd >= from);
280 overlapSize = min (mEnd - from, mEnd - mStart);
283 Assert (to >= mStart);
284 overlapSize = min (to - from, to - mStart);
286 Assert (overlapSize <= (to - from));
287 Assert (overlapSize <= (mEnd - mStart));
289 if (overlapSize == 0) {
294 return mEnd == mStart;
331 inline bool TextStore::Overlap (
const Marker& m,
size_t from,
size_t to)
333 Require (from <= to);
337 m.GetRange (&start, &end);
338 Assert (start <= end);
340#if qStroika_Foundation_Debug_AssertionsChecked
345 bool oldAlgorithmAnswer;
352 oldAlgorithmAnswer = (from < Xend) and (start < to);
356 if ((from <= end) and (start <= to)) {
360 Assert (end >= from);
361 overlapSize = min (end - from, end - start);
364 Assert (to >= start);
365 overlapSize = min (to - from, to - start);
367 Assert (overlapSize <= (to - from));
368 Assert (overlapSize <= (end - start));
370 if (overlapSize == 0) {
379#if qStroika_Foundation_Debug_AssertionsChecked
380 Ensure (oldAlgorithmAnswer ==
true);
386#if qStroika_Foundation_Debug_AssertionsChecked
387 Ensure (oldAlgorithmAnswer ==
false);
398 template <
typename T>
399 inline MarkerOfATypeMarkerSink<T>::MarkerOfATypeMarkerSink ()
403 template <
typename T>
404 void MarkerOfATypeMarkerSink<T>::Append (Marker* m)
407 T* tMarker =
dynamic_cast<T*
> (m);
408 if (tMarker !=
nullptr) {
409 Assert (fResult ==
nullptr);
419 template <
typename T>
420 inline MarkersOfATypeMarkerSink2Vector<T>::MarkersOfATypeMarkerSink2Vector ()
424 template <
typename T>
425 void MarkersOfATypeMarkerSink2Vector<T>::Append (Marker* m)
428 T* tMarker =
dynamic_cast<T*
> (m);
429 if (tMarker !=
nullptr) {
430 PUSH_BACK (fResult, tMarker);
439 template <
typename T>
440 inline MarkersOfATypeMarkerSink2SmallStackBuffer<T>::MarkersOfATypeMarkerSink2SmallStackBuffer ()
444 template <
typename T>
445 void MarkersOfATypeMarkerSink2SmallStackBuffer<T>::Append (Marker* m)
448 T* tMarker =
dynamic_cast<T*
> (m);
449 if (tMarker !=
nullptr) {
450 fResult.push_back (tMarker);
#define RequireNotNull(p)