1*8af74909SZhong Yang /** @file RunStyles.h 2*8af74909SZhong Yang ** Data structure used to store sparse styles. 3*8af74909SZhong Yang **/ 4*8af74909SZhong Yang // Copyright 1998-2007 by Neil Hodgson <[email protected]> 5*8af74909SZhong Yang // The License.txt file describes the conditions under which this software may be distributed. 6*8af74909SZhong Yang 7*8af74909SZhong Yang /// Styling buffer using one element for each run rather than using 8*8af74909SZhong Yang /// a filled buffer. 9*8af74909SZhong Yang 10*8af74909SZhong Yang #ifndef RUNSTYLES_H 11*8af74909SZhong Yang #define RUNSTYLES_H 12*8af74909SZhong Yang 13*8af74909SZhong Yang namespace Scintilla { 14*8af74909SZhong Yang 15*8af74909SZhong Yang // Return for RunStyles::FillRange reports if anything was changed and the 16*8af74909SZhong Yang // range that was changed. This may be trimmed from the requested range 17*8af74909SZhong Yang // when some of the requested range already had the requested value. 18*8af74909SZhong Yang template <typename DISTANCE> 19*8af74909SZhong Yang struct FillResult { 20*8af74909SZhong Yang bool changed; 21*8af74909SZhong Yang DISTANCE position; 22*8af74909SZhong Yang DISTANCE fillLength; 23*8af74909SZhong Yang }; 24*8af74909SZhong Yang 25*8af74909SZhong Yang template <typename DISTANCE, typename STYLE> 26*8af74909SZhong Yang class RunStyles { 27*8af74909SZhong Yang private: 28*8af74909SZhong Yang std::unique_ptr<Partitioning<DISTANCE>> starts; 29*8af74909SZhong Yang std::unique_ptr<SplitVector<STYLE>> styles; 30*8af74909SZhong Yang DISTANCE RunFromPosition(DISTANCE position) const noexcept; 31*8af74909SZhong Yang DISTANCE SplitRun(DISTANCE position); 32*8af74909SZhong Yang void RemoveRun(DISTANCE run); 33*8af74909SZhong Yang void RemoveRunIfEmpty(DISTANCE run); 34*8af74909SZhong Yang void RemoveRunIfSameAsPrevious(DISTANCE run); 35*8af74909SZhong Yang public: 36*8af74909SZhong Yang RunStyles(); 37*8af74909SZhong Yang // Deleted so RunStyles objects can not be copied. 38*8af74909SZhong Yang RunStyles(const RunStyles &) = delete; 39*8af74909SZhong Yang RunStyles(RunStyles &&) = delete; 40*8af74909SZhong Yang void operator=(const RunStyles &) = delete; 41*8af74909SZhong Yang void operator=(RunStyles &&) = delete; 42*8af74909SZhong Yang ~RunStyles(); 43*8af74909SZhong Yang DISTANCE Length() const noexcept; 44*8af74909SZhong Yang STYLE ValueAt(DISTANCE position) const noexcept; 45*8af74909SZhong Yang DISTANCE FindNextChange(DISTANCE position, DISTANCE end) const noexcept; 46*8af74909SZhong Yang DISTANCE StartRun(DISTANCE position) const noexcept; 47*8af74909SZhong Yang DISTANCE EndRun(DISTANCE position) const noexcept; 48*8af74909SZhong Yang // Returns changed=true if some values may have changed 49*8af74909SZhong Yang FillResult<DISTANCE> FillRange(DISTANCE position, STYLE value, DISTANCE fillLength); 50*8af74909SZhong Yang void SetValueAt(DISTANCE position, STYLE value); 51*8af74909SZhong Yang void InsertSpace(DISTANCE position, DISTANCE insertLength); 52*8af74909SZhong Yang void DeleteAll(); 53*8af74909SZhong Yang void DeleteRange(DISTANCE position, DISTANCE deleteLength); 54*8af74909SZhong Yang DISTANCE Runs() const noexcept; 55*8af74909SZhong Yang bool AllSame() const noexcept; 56*8af74909SZhong Yang bool AllSameAs(STYLE value) const noexcept; 57*8af74909SZhong Yang DISTANCE Find(STYLE value, DISTANCE start) const noexcept; 58*8af74909SZhong Yang 59*8af74909SZhong Yang void Check() const; 60*8af74909SZhong Yang }; 61*8af74909SZhong Yang 62*8af74909SZhong Yang } 63*8af74909SZhong Yang 64*8af74909SZhong Yang #endif 65