xref: /MusicPlayer2/scintilla/src/RunStyles.h (revision 8af74909132ed5e696cb05b6689ae4baf14c1c96)
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