4#ifndef _Stroika_Framework_Led_ChunkedArrayTextStore_h_
5#define _Stroika_Framework_Led_ChunkedArrayTextStore_h_ 1
7#include "Stroika/Frameworks/StroikaPreComp.h"
19#include "Stroika/Foundation/Cache/LRUCache.h"
21#include "Stroika/Frameworks/Led/TextStore.h"
23namespace Stroika::Frameworks::Led {
32#ifndef qStroika_Frameworks_Led_KeepChunkedArrayStatistics
33#define qStroika_Frameworks_Led_KeepChunkedArrayStatistics qStroika_Foundation_Debug_AssertionsChecked
43#ifndef qStroika_Frameworks_Led_UseLRUCacheForRecentlyLookedUpMarkers
45#define qStroika_Frameworks_Led_UseLRUCacheForRecentlyLookedUpMarkers 0
73 class ChunkedArrayTextStore :
public TextStore {
75 using inherited = TextStore;
78 ChunkedArrayTextStore ();
79 virtual ~ChunkedArrayTextStore ();
82 virtual TextStore* ConstructNewTextStore ()
const override;
85 virtual void AddMarkerOwner (MarkerOwner* owner)
override;
86 virtual void RemoveMarkerOwner (MarkerOwner* owner)
override;
89 virtual size_t GetLength () const noexcept override;
90 virtual
void CopyOut (
size_t from,
size_t count, Led_tChar* buffer) const noexcept override;
91 virtual
void ReplaceWithoutUpdate (
size_t from,
size_t to, const Led_tChar* withWhat,
size_t withWhatCount) override;
94 virtual
void AddMarker (Marker* marker,
size_t lhs,
size_t length, MarkerOwner* owner) override;
95 virtual
void RemoveMarkers (Marker* const markerArray[],
size_t markerCount) override;
96 virtual
void PreRemoveMarker (Marker* marker) override;
97 virtual
void SetMarkerRange (Marker* m,
size_t start,
size_t end) noexcept override;
98 virtual
void CollectAllMarkersInRangeInto (
size_t from,
size_t to, const MarkerOwner* owner, MarkerSink& output) const override;
100#if qStroika_Frameworks_Led_UseLRUCacheForRecentlyLookedUpMarkers
102 struct CollectLookupCacheElt;
105 nonvirtual
void CollectAllMarkersInRangeInto_Helper_MO (
size_t from,
size_t to,
const MarkerOwner* owner, MarkerSink& output
106#
if qStroika_Frameworks_Led_UseLRUCacheForRecentlyLookedUpMarkers
108 CollectLookupCacheElt* fillingCache = NULL
114 class ChunkAndOffset {
116 ChunkAndOffset (
size_t chunk,
size_t offset);
123 nonvirtual
void AddMarker1 (Marker* marker, Marker* insideMarker,
bool canAddHackMarkers);
125 nonvirtual
void PossiblyAddHackMarkers (Marker* insideMarker);
126 nonvirtual
void RemoveMarker1 (Marker* marker);
127 nonvirtual Marker* AddHackMarkerHelper_ (Marker* insideMarker,
size_t start,
size_t length);
128 nonvirtual
void LoseIfUselessHackMarker (Marker* potentiallyUselessHackMarker);
131 nonvirtual
void InsertAfter_ (
const Led_tChar* what,
size_t howMany,
size_t after);
132 nonvirtual
void DeleteAfter_ (
size_t howMany,
size_t after);
133 nonvirtual TextChunk* AtomicAddChunk (
size_t atArrayPos);
136 nonvirtual ChunkAndOffset FindChunkIndex (
size_t charPos)
const;
144 nonvirtual ChunkAndOffset FindChunkIndex_ (
size_t charPos)
const;
152 mutable size_t fCachedChunkIndex{0};
153 mutable size_t fCachedChunkIndexesOffset{0};
155 nonvirtual
void InvalCachedChunkIndexes ();
158 nonvirtual
void AdjustMarkersForInsertAfter (
size_t after,
size_t howMany);
159 nonvirtual
void AdjustMarkersForInsertAfter1 (
size_t after,
size_t howMany, Marker* startAt);
160 nonvirtual
void AdjustMarkersForDeleteAfter (
size_t after,
size_t howMany);
161 nonvirtual
void AdjustMarkersForDeleteAfter1 (
size_t after,
size_t howMany, Marker* startAt);
164 static bool AllHackMarkers (
const Marker* m);
165 static bool AllSubMarkersAreHackMarkerTrees (
const Marker* m);
169 vector<TextChunk*> fTextChunks;
171#if qStroika_Foundation_Debug_AssertionsChecked
173 virtual void Invariant_ ()
const override;
174 nonvirtual
void WalkSubTreeAndCheckInvariants (
const Marker* m)
const;
185#include "ChunkedArrayTextStore.inl"