5namespace Stroika::Frameworks::Led {
12 inline Partition::PartitionMarker::PartitionMarker (Partition& owner, PartitionMarker* insertAfterMe)
14 , fPrevious (insertAfterMe)
15 , fNext (insertAfterMe == nullptr ? nullptr : insertAfterMe->fNext)
17 if (insertAfterMe ==
nullptr) {
18 owner.fPartitionMarkerFirst =
this;
21 Assert (insertAfterMe->fNext == fNext);
22 insertAfterMe->fNext =
this;
23 PartitionMarker* following = fNext;
24 if (following !=
nullptr) {
25 Assert (following->fPrevious == insertAfterMe);
26 following->fPrevious =
this;
29 if (fNext ==
nullptr) {
30 owner.fPartitionMarkerLast =
this;
40 inline Partition& Partition::PartitionMarker::GetOwner ()
const
44 return *(
dynamic_cast<Partition*
> (inherited::GetOwner ()));
46 inline Partition::PartitionMarker* Partition::PartitionMarker::GetPrevious ()
const
50 inline Partition::PartitionMarker* Partition::PartitionMarker::GetNext ()
const
54 inline void Partition::Invariant ()
const
56#if qStroika_Foundation_Debug_AssertionsChecked and qStroika_Frameworks_Led_HeavyDebugging
66 inline size_t Partition::GetEnd ()
const
68 return (fTextStore.GetEnd ());
74 inline void Partition::CopyOut (
size_t from,
size_t byteCount, Led_tChar* buffer)
const
76 GetTextStore ().CopyOut (from, byteCount, buffer);
78 inline Partition::PartitionMarker* Partition::GetFirstPartitionMarker ()
const
81 return fPartitionMarkerFirst;
83 inline Partition::PartitionMarker* Partition::GetLastPartitionMarker ()
const
86 return fPartitionMarkerLast;
93 inline void Partition::AddPartitionWatcher (PartitionWatcher* watcher)
95 fPartitionWatchers.push_back (watcher);
102 inline void Partition::RemovePartitionWatcher (PartitionWatcher* watcher)
104 vector<PartitionWatcher*>::iterator it = find (fPartitionWatchers.begin (), fPartitionWatchers.end (), watcher);
105 Assert (it != fPartitionWatchers.end ());
106 if (it != fPartitionWatchers.end ()) {
107 fPartitionWatchers.erase (it);
110 inline void Partition::DoAboutToSplitCalls (PartitionMarker* pm,
size_t at, vector<void*>* infos)
const noexcept
112 for (
auto it = fPartitionWatchers.begin (); it != fPartitionWatchers.end (); ++it) {
114 (*it)->AboutToSplit (pm, at, &info);
115 infos->push_back (info);
118 inline void Partition::DoDidSplitCalls (
const vector<void*>& infos)
const noexcept
120 Assert (infos.size () == fPartitionWatchers.size ());
121 vector<void*>::const_iterator infoIt = infos.begin ();
122 for (
auto it = fPartitionWatchers.begin (); it != fPartitionWatchers.end (); ++it) {
123 (*it)->DidSplit (*infoIt);
127 inline void Partition::DoAboutToCoaleceCalls (PartitionMarker* pm, vector<void*>* infos)
const noexcept
129 for (
auto it = fPartitionWatchers.begin (); it != fPartitionWatchers.end (); ++it) {
131 (*it)->AboutToCoalece (pm, &info);
132 infos->push_back (info);
135 inline void Partition::DoDidCoaleceCalls (
const vector<void*>& infos)
const noexcept
137 Assert (infos.size () == fPartitionWatchers.size ());
138 vector<void*>::const_iterator infoIt = infos.begin ();
139 for (
auto it = fPartitionWatchers.begin (); it != fPartitionWatchers.end (); ++it) {
140 (*it)->DidCoalece (*infoIt);
145#if qStroika_Frameworks_Led_SupportGDI
147 inline PartitioningTextImager::PartitionPtr PartitioningTextImager::GetPartition ()
const
151 inline Partition::PartitionMarker* PartitioningTextImager::GetFirstPartitionMarker ()
const
153 Require (fPartition.get () !=
nullptr);
154 return fPartition->GetFirstPartitionMarker ();
162 inline Partition::PartitionMarker* PartitioningTextImager::GetPartitionMarkerContainingPosition (
size_t charPosition)
const
164 return fPartition->GetPartitionMarkerContainingPosition (charPosition);
170 inline size_t PartitioningTextImager::GetStartOfPartitionContainingPosition (
size_t charPosition)
const
172 return GetPartitionMarkerContainingPosition (charPosition)->GetStart ();
179 inline size_t PartitioningTextImager::GetEndOfPartitionContainingPosition (
size_t charPosition)
const
181 return GetPartitionMarkerContainingPosition (charPosition)->GetEnd ();
183 inline void PartitioningTextImager::Invariant ()
const
185#if qStroika_Foundation_Debug_AssertionsChecked and qStroika_Frameworks_Led_HeavyDebugging
190#if qCacheTextMeasurementsForPM
192 inline void PartitioningTextImager::MeasureTextCache::ClearAll ()
196 inline PartitioningTextImager::MeasureTextCache::CacheElt
197 PartitioningTextImager::MeasureTextCache::LookupValue (PartitionMarker* pm,
size_t rowStart,
198 const function<CacheElt (PartitionMarker*,
size_t)>& valueFetcher)
201 using CacheElt = PartitioningTextImager::MeasureTextCache::CacheElt;
202 return fCache.LookupValue (CacheElt::COMPARE_ITEM (pm, rowStart),
203 [valueFetcher] (
const CacheElt::COMPARE_ITEM& c) {
return valueFetcher (c.fPM, c.fRowStartingAt); });
207 inline PartitioningTextImager::MeasureTextCache::CacheElt::CacheElt ()
208 : fValidFor (nullptr, 0)
209 , fMeasurementsCache (0)
212 inline PartitioningTextImager::MeasureTextCache::CacheElt::CacheElt (
const COMPARE_ITEM& ci)
214 , fMeasurementsCache (0)
#define RequireNotNull(p)
#define EnsureMember(p, c)