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 qKeepChunkedArrayStatistics
33#define qKeepChunkedArrayStatistics qStroika_Foundation_Debug_AssertionsChecked
46#ifndef qSkrunchDataSizeByImposingLimits
47#define qSkrunchDataSizeByImposingLimits 1
57#ifndef qUseLRUCacheForRecentlyLookedUpMarkers
59#define qUseLRUCacheForRecentlyLookedUpMarkers 0
87 class ChunkedArrayTextStore :
public TextStore {
89 using inherited = TextStore;
92 ChunkedArrayTextStore ();
93 virtual ~ChunkedArrayTextStore ();
96 virtual TextStore* ConstructNewTextStore ()
const override;
99 virtual void AddMarkerOwner (MarkerOwner* owner)
override;
100 virtual void RemoveMarkerOwner (MarkerOwner* owner)
override;
103 virtual size_t GetLength () const noexcept override;
104 virtual
void CopyOut (
size_t from,
size_t count, Led_tChar* buffer) const noexcept override;
105 virtual
void ReplaceWithoutUpdate (
size_t from,
size_t to, const Led_tChar* withWhat,
size_t withWhatCount) override;
108 virtual
void AddMarker (Marker* marker,
size_t lhs,
size_t length, MarkerOwner* owner) override;
109 virtual
void RemoveMarkers (Marker* const markerArray[],
size_t markerCount) override;
110 virtual
void PreRemoveMarker (Marker* marker) override;
111 virtual
void SetMarkerRange (Marker* m,
size_t start,
size_t end) noexcept override;
112 virtual
void CollectAllMarkersInRangeInto (
size_t from,
size_t to, const MarkerOwner* owner, MarkerSink& output) const override;
114#if qUseLRUCacheForRecentlyLookedUpMarkers
116 struct CollectLookupCacheElt;
119 nonvirtual
void CollectAllMarkersInRangeInto_Helper_MO (
size_t from,
size_t to,
const MarkerOwner* owner, MarkerSink& output
120#
if qUseLRUCacheForRecentlyLookedUpMarkers
122 CollectLookupCacheElt* fillingCache = NULL
128 class ChunkAndOffset {
130 ChunkAndOffset (
size_t chunk,
size_t offset);
137 nonvirtual
void AddMarker1 (Marker* marker, Marker* insideMarker,
bool canAddHackMarkers);
139 nonvirtual
void PossiblyAddHackMarkers (Marker* insideMarker);
140 nonvirtual
void RemoveMarker1 (Marker* marker);
141 nonvirtual Marker* AddHackMarkerHelper_ (Marker* insideMarker,
size_t start,
size_t length);
142 nonvirtual
void LoseIfUselessHackMarker (Marker* potentiallyUselessHackMarker);
145 nonvirtual
void InsertAfter_ (
const Led_tChar* what,
size_t howMany,
size_t after);
146 nonvirtual
void DeleteAfter_ (
size_t howMany,
size_t after);
147 nonvirtual TextChunk* AtomicAddChunk (
size_t atArrayPos);
150 nonvirtual ChunkAndOffset FindChunkIndex (
size_t charPos)
const;
158 nonvirtual ChunkAndOffset FindChunkIndex_ (
size_t charPos)
const;
166 mutable size_t fCachedChunkIndex{0};
167 mutable size_t fCachedChunkIndexesOffset{0};
169 nonvirtual
void InvalCachedChunkIndexes ();
172 nonvirtual
void AdjustMarkersForInsertAfter (
size_t after,
size_t howMany);
173 nonvirtual
void AdjustMarkersForInsertAfter1 (
size_t after,
size_t howMany, Marker* startAt);
174 nonvirtual
void AdjustMarkersForDeleteAfter (
size_t after,
size_t howMany);
175 nonvirtual
void AdjustMarkersForDeleteAfter1 (
size_t after,
size_t howMany, Marker* startAt);
178 static bool AllHackMarkers (
const Marker* m);
179 static bool AllSubMarkersAreHackMarkerTrees (
const Marker* m);
183 vector<TextChunk*> fTextChunks;
185#if qStroika_Foundation_Debug_AssertionsChecked
187 virtual void Invariant_ ()
const override;
188 nonvirtual
void WalkSubTreeAndCheckInvariants (
const Marker* m)
const;
199#include "ChunkedArrayTextStore.inl"