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 qUseWin32CompareStringCallForCaseInsensitiveSearch
46#define qUseWin32CompareStringCallForCaseInsensitiveSearch qStroika_Foundation_Common_Platform_Windows
80 class TextStore :
public virtual MarkerOwner {
85 virtual ~TextStore ();
94 virtual TextStore* ConstructNewTextStore ()
const = 0;
102 virtual void AddMarkerOwner (MarkerOwner* owner);
103 virtual void RemoveMarkerOwner (MarkerOwner* owner);
104 nonvirtual
const vector<MarkerOwner*>& GetMarkerOwners () const noexcept;
107 vector<MarkerOwner*> fMarkerOwners{};
115 virtual size_t GetLength () const noexcept = 0;
123 virtual
void CopyOut (
size_t from,
size_t count, Led_tChar* buffer) const noexcept = 0;
127 static
size_t GetStart ();
128 nonvirtual
size_t GetEnd () const;
141 nonvirtual
size_t CharacterToTCharIndex (
size_t i);
142 nonvirtual
size_t TCharToCharacterIndex (
size_t i);
146 nonvirtual
void Replace (
size_t from,
size_t to, const Led_tChar* withWhat,
size_t withWhatCount);
154 virtual
void ReplaceWithoutUpdate (
size_t from,
size_t to, const Led_tChar* withWhat,
size_t withWhatCount) = 0;
172 virtual
void AddMarker (Marker* marker,
size_t lhs,
size_t length, MarkerOwner* owner) = 0;
180 nonvirtual
void RemoveMarker (Marker* marker);
188 virtual
void RemoveMarkers (Marker* const markerArray[],
size_t markerCount) = 0;
190 template <typename T>
196 nonvirtual
void RemoveTypedMarkers (T* const ma[],
size_t mc)
199 for (
size_t i = 0; i < mc; ++i) {
205 template <
typename T>
210 nonvirtual
void RemoveAndDeleteMarkers (T*
const ma[],
size_t mc)
212 RemoveTypedMarkers (ma, mc);
213 for (
size_t i = 0; i < mc; ++i) {
226 virtual void PreRemoveMarker (Marker* marker) = 0;
236 virtual void SetMarkerRange (Marker* marker,
size_t start,
size_t end)
noexcept = 0;
237 nonvirtual
void SetMarkerStart (Marker* marker,
size_t start)
noexcept;
238 nonvirtual
void SetMarkerEnd (Marker* marker,
size_t end)
noexcept;
239 nonvirtual
void SetMarkerLength (Marker* marker,
size_t length)
noexcept;
272 virtual void Append (Marker* m) = 0;
280 class VectorMarkerSink :
public MarkerSink {
282 VectorMarkerSink (vector<Marker*>* markers);
284 virtual void Append (Marker* m)
override;
287 vector<Marker*>* fMarkers;
296 class InlineBufferMarkerSink :
public MarkerSink {
298 InlineBufferMarkerSink () =
default;
300 virtual void Append (Marker* m)
override;
303 Foundation::Memory::InlineBuffer<Marker*> fMarkers;
311 static const MarkerOwner* kAnyMarkerOwner;
312 virtual void CollectAllMarkersInRangeInto (
size_t from,
size_t to,
const MarkerOwner* owner, MarkerSink& output)
const = 0;
317 static bool Overlap (
size_t mStart,
size_t mEnd,
size_t from,
size_t to);
318 static bool Overlap (
const Marker& m,
size_t from,
size_t to);
320 nonvirtual
void CollectAllMarkersInRangeInto_OrSurroundings (
size_t from,
size_t to,
const MarkerOwner* owner, MarkerSink& output)
const;
322 nonvirtual
void CollectAllMarkersInRangeInto (
size_t from,
size_t to,
const MarkerOwner* owner, vector<Marker*>* markerList)
const;
323 nonvirtual
void CollectAllMarkersInRangeInto_OrSurroundings (
size_t from,
size_t to,
const MarkerOwner* owner, vector<Marker*>* markerList)
const;
325 nonvirtual vector<Marker*> CollectAllMarkersInRange (
size_t from,
size_t to,
const MarkerOwner* owner = kAnyMarkerOwner)
const;
326 nonvirtual vector<Marker*> CollectAllMarkersInRange_OrSurroundings (
size_t from,
size_t to,
const MarkerOwner* owner = kAnyMarkerOwner)
const;
340 virtual size_t GetStartOfLine (
size_t lineNumber)
const;
341 virtual size_t GetStartOfLineContainingPosition (
size_t charPosition)
const;
342 virtual size_t GetEndOfLine (
size_t lineNumber)
const;
343 virtual size_t GetEndOfLineContainingPosition (
size_t afterPos)
const;
344 virtual size_t GetLineContainingPosition (
size_t charPosition)
const;
345 virtual size_t GetLineCount ()
const;
346 nonvirtual
size_t GetLineLength (
size_t lineNumber)
const;
355 nonvirtual
size_t FindNextCharacter (
size_t afterPos)
const;
356 nonvirtual
size_t FindPreviousCharacter (
size_t beforePos)
const;
359 nonvirtual shared_ptr<TextBreaks> GetTextBreaker ()
const;
360 nonvirtual
void SetTextBreaker (
const shared_ptr<TextBreaks>& textBreaker);
363 mutable shared_ptr<TextBreaks> fTextBreaker{};
366 nonvirtual
void FindWordBreaks (
size_t afterPosition,
size_t* wordStartResult,
size_t* wordEndResult,
bool* wordReal,
367 TextBreaks* useTextBreaker =
nullptr);
368 nonvirtual
void FindLineBreaks (
size_t afterPosition,
size_t* wordEndResult,
bool* wordReal, TextBreaks* useTextBreaker =
nullptr);
374 nonvirtual
size_t FindFirstWordStartBeforePosition (
size_t position,
bool wordMustBeReal =
true);
377 nonvirtual
size_t FindFirstWordStartStrictlyBeforePosition (
size_t position,
bool wordMustBeReal =
true);
380 nonvirtual
size_t FindFirstWordEndAfterPosition (
size_t position,
bool wordMustBeReal =
true);
384 nonvirtual
size_t FindFirstWordStartAfterPosition (
size_t position);
392 struct SearchParameters {
393 SearchParameters (
const Led_tString& searchString = LED_TCHAR_OF (
""),
bool wrap =
true,
bool wholeWord =
false,
bool caseSensative =
false);
395 Led_tString fMatchString;
397 bool fWholeWordSearch;
398 bool fCaseSensativeSearch;
402 eUseSearchParameters = kBadIndex
409 virtual size_t Find (
const SearchParameters& params,
size_t searchFrom,
size_t searchTo = eUseSearchParameters);
413 nonvirtual
void DoAboutToUpdateCalls (
const UpdateInfo& updateInfo, Marker*
const* markersBegin, Marker*
const* markersEnd);
414 nonvirtual
void DoDidUpdateCalls (
const UpdateInfo& updateInfo, Marker*
const* markersBegin, Marker*
const* markersEnd)
noexcept;
420 virtual TextStore* PeekAtTextStore ()
const override;
430 nonvirtual
void Invariant ()
const;
432#if qStroika_Foundation_Debug_AssertionsChecked
434 virtual void Invariant_ ()
const;
461 class TextStore::SimpleUpdater :
public Foundation::Memory::UseBlockAllocationIfAppropriate<SimpleUpdater> {
463 SimpleUpdater (TextStore& ts,
const UpdateInfo& updateInfo);
464 SimpleUpdater (TextStore& ts,
size_t from,
size_t to,
bool realContentUpdate =
true);
468 nonvirtual
void Cancel ();
471 TextStore& fTextStore;
472 InlineBufferMarkerSink fMarkerSink;
473 UpdateInfo fUpdateInfo;
487 template <
typename T>
488 class MarkerOfATypeMarkerSink :
public TextStore::MarkerSink {
490 MarkerOfATypeMarkerSink ();
492 virtual void Append (Marker* m)
override;
503 template <
typename T>
504 class MarkersOfATypeMarkerSink2Vector :
public TextStore::MarkerSink {
506 MarkersOfATypeMarkerSink2Vector ();
508 virtual void Append (Marker* m)
override;
519 template <
typename T>
520 class MarkersOfATypeMarkerSink2SmallStackBuffer :
public TextStore::MarkerSink {
522 MarkersOfATypeMarkerSink2SmallStackBuffer ();
524 virtual void Append (Marker* m)
override;
526 Foundation::Memory::InlineBuffer<T*> fResult;
536#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 ...