4#ifndef _Stroika_Frameworks_Led_TextStore_h_
5#define _Stroika_Frameworks_Led_TextStore_h_ 1
7#include "Stroika/Frameworks/StroikaPreComp.h"
14#include "Stroika/Foundation/Containers/Common.h"
34#include "Stroika/Frameworks/Led/Marker.h"
35#include "Stroika/Frameworks/Led/Support.h"
36#include "Stroika/Frameworks/Led/TextBreaks.h"
38namespace Stroika::Frameworks::Led {
45#ifndef qStroika_Frameworks_Led_UseWin32CompareStringCallForCaseInsensitiveSearch
46#define qStroika_Frameworks_Led_UseWin32CompareStringCallForCaseInsensitiveSearch qStroika_Platform_Windows
84 class TextStore :
public virtual MarkerOwner {
89 virtual ~TextStore ();
98 virtual TextStore* ConstructNewTextStore ()
const = 0;
106 virtual void AddMarkerOwner (MarkerOwner* owner);
107 virtual void RemoveMarkerOwner (MarkerOwner* owner);
108 nonvirtual
const vector<MarkerOwner*>& GetMarkerOwners () const noexcept;
111 vector<MarkerOwner*> fMarkerOwners{};
119 virtual size_t GetLength () const noexcept = 0;
127 virtual
void CopyOut (
size_t from,
size_t count, Led_tChar* buffer) const noexcept = 0;
131 static
size_t GetStart ();
132 nonvirtual
size_t GetEnd () const;
145 nonvirtual
size_t CharacterToTCharIndex (
size_t i);
146 nonvirtual
size_t TCharToCharacterIndex (
size_t i);
150 nonvirtual
void Replace (
size_t from,
size_t to, const Led_tChar* withWhat,
size_t withWhatCount);
158 virtual
void ReplaceWithoutUpdate (
size_t from,
size_t to, const Led_tChar* withWhat,
size_t withWhatCount) = 0;
176 virtual
void AddMarker (Marker* marker,
size_t lhs,
size_t length, MarkerOwner* owner) = 0;
184 nonvirtual
void RemoveMarker (Marker* marker);
192 virtual
void RemoveMarkers (Marker* const markerArray[],
size_t markerCount) = 0;
194 template <typename T>
200 nonvirtual
void RemoveTypedMarkers (T* const ma[],
size_t mc)
203 for (
size_t i = 0; i < mc; ++i) {
209 template <
typename T>
214 nonvirtual
void RemoveAndDeleteMarkers (T*
const ma[],
size_t mc)
216 RemoveTypedMarkers (ma, mc);
217 for (
size_t i = 0; i < mc; ++i) {
230 virtual void PreRemoveMarker (Marker* marker) = 0;
240 virtual void SetMarkerRange (Marker* marker,
size_t start,
size_t end)
noexcept = 0;
241 nonvirtual
void SetMarkerStart (Marker* marker,
size_t start)
noexcept;
242 nonvirtual
void SetMarkerEnd (Marker* marker,
size_t end)
noexcept;
243 nonvirtual
void SetMarkerLength (Marker* marker,
size_t length)
noexcept;
276 virtual void Append (Marker* m) = 0;
284 class VectorMarkerSink :
public MarkerSink {
286 VectorMarkerSink (vector<Marker*>* markers);
288 virtual void Append (Marker* m)
override;
291 vector<Marker*>* fMarkers;
300 class InlineBufferMarkerSink :
public MarkerSink {
302 InlineBufferMarkerSink () =
default;
304 virtual void Append (Marker* m)
override;
307 Foundation::Memory::InlineBuffer<Marker*> fMarkers;
315 static const MarkerOwner* kAnyMarkerOwner;
316 virtual void CollectAllMarkersInRangeInto (
size_t from,
size_t to,
const MarkerOwner* owner, MarkerSink& output)
const = 0;
321 static bool Overlap (
size_t mStart,
size_t mEnd,
size_t from,
size_t to);
322 static bool Overlap (
const Marker& m,
size_t from,
size_t to);
324 nonvirtual
void CollectAllMarkersInRangeInto_OrSurroundings (
size_t from,
size_t to,
const MarkerOwner* owner, MarkerSink& output)
const;
326 nonvirtual
void CollectAllMarkersInRangeInto (
size_t from,
size_t to,
const MarkerOwner* owner, vector<Marker*>* markerList)
const;
327 nonvirtual
void CollectAllMarkersInRangeInto_OrSurroundings (
size_t from,
size_t to,
const MarkerOwner* owner, vector<Marker*>* markerList)
const;
329 nonvirtual vector<Marker*> CollectAllMarkersInRange (
size_t from,
size_t to,
const MarkerOwner* owner = kAnyMarkerOwner)
const;
330 nonvirtual vector<Marker*> CollectAllMarkersInRange_OrSurroundings (
size_t from,
size_t to,
const MarkerOwner* owner = kAnyMarkerOwner)
const;
344 virtual size_t GetStartOfLine (
size_t lineNumber)
const;
345 virtual size_t GetStartOfLineContainingPosition (
size_t charPosition)
const;
346 virtual size_t GetEndOfLine (
size_t lineNumber)
const;
347 virtual size_t GetEndOfLineContainingPosition (
size_t afterPos)
const;
348 virtual size_t GetLineContainingPosition (
size_t charPosition)
const;
349 virtual size_t GetLineCount ()
const;
350 nonvirtual
size_t GetLineLength (
size_t lineNumber)
const;
359 nonvirtual
size_t FindNextCharacter (
size_t afterPos)
const;
360 nonvirtual
size_t FindPreviousCharacter (
size_t beforePos)
const;
363 nonvirtual shared_ptr<TextBreaks> GetTextBreaker ()
const;
364 nonvirtual
void SetTextBreaker (
const shared_ptr<TextBreaks>& textBreaker);
367 mutable shared_ptr<TextBreaks> fTextBreaker{};
370 nonvirtual
void FindWordBreaks (
size_t afterPosition,
size_t* wordStartResult,
size_t* wordEndResult,
bool* wordReal,
371 TextBreaks* useTextBreaker =
nullptr);
372 nonvirtual
void FindLineBreaks (
size_t afterPosition,
size_t* wordEndResult,
bool* wordReal, TextBreaks* useTextBreaker =
nullptr);
378 nonvirtual
size_t FindFirstWordStartBeforePosition (
size_t position,
bool wordMustBeReal =
true);
381 nonvirtual
size_t FindFirstWordStartStrictlyBeforePosition (
size_t position,
bool wordMustBeReal =
true);
384 nonvirtual
size_t FindFirstWordEndAfterPosition (
size_t position,
bool wordMustBeReal =
true);
388 nonvirtual
size_t FindFirstWordStartAfterPosition (
size_t position);
396 struct SearchParameters {
397 SearchParameters (
const Led_tString& searchString = LED_TCHAR_OF (
""),
bool wrap =
true,
bool wholeWord =
false,
bool caseSensative =
false);
399 Led_tString fMatchString;
401 bool fWholeWordSearch;
402 bool fCaseSensativeSearch;
406 eUseSearchParameters = kBadIndex
413 virtual size_t Find (
const SearchParameters& params,
size_t searchFrom,
size_t searchTo = eUseSearchParameters);
417 nonvirtual
void DoAboutToUpdateCalls (
const UpdateInfo& updateInfo, Marker*
const* markersBegin, Marker*
const* markersEnd);
418 nonvirtual
void DoDidUpdateCalls (
const UpdateInfo& updateInfo, Marker*
const* markersBegin, Marker*
const* markersEnd)
noexcept;
424 virtual TextStore* PeekAtTextStore ()
const override;
434 nonvirtual
void Invariant ()
const;
436#if qStroika_Foundation_Debug_AssertionsChecked
438 virtual void Invariant_ ()
const;
465 class TextStore::SimpleUpdater :
public Foundation::Memory::UseBlockAllocationIfAppropriate<SimpleUpdater> {
467 SimpleUpdater (TextStore& ts,
const UpdateInfo& updateInfo);
468 SimpleUpdater (TextStore& ts,
size_t from,
size_t to,
bool realContentUpdate =
true);
472 nonvirtual
void Cancel ();
475 TextStore& fTextStore;
476 InlineBufferMarkerSink fMarkerSink;
477 UpdateInfo fUpdateInfo;
491 template <
typename T>
492 class MarkerOfATypeMarkerSink :
public TextStore::MarkerSink {
494 MarkerOfATypeMarkerSink ();
496 virtual void Append (Marker* m)
override;
507 template <
typename T>
508 class MarkersOfATypeMarkerSink2Vector :
public TextStore::MarkerSink {
510 MarkersOfATypeMarkerSink2Vector ();
512 virtual void Append (Marker* m)
override;
523 template <
typename T>
524 class MarkersOfATypeMarkerSink2SmallStackBuffer :
public TextStore::MarkerSink {
526 MarkersOfATypeMarkerSink2SmallStackBuffer ();
528 virtual void Append (Marker* m)
override;
530 Foundation::Memory::InlineBuffer<T*> fResult;
540#include "TextStore.inl"
void Append(TARGET_CONTAINER *v)
CONTAINER::value_type * Start(CONTAINER &c)
For a contiguous container (such as a vector or basic_string) - find the pointer to the start of the ...