xref: /MusicPlayer2/scintilla/src/UniqueString.h (revision 8af74909132ed5e696cb05b6689ae4baf14c1c96)
1*8af74909SZhong Yang // Scintilla source code edit control
2*8af74909SZhong Yang /** @file UniqueString.h
3*8af74909SZhong Yang  ** Define UniqueString, a unique_ptr based string type for storage in containers
4*8af74909SZhong Yang  ** and an allocator for UniqueString.
5*8af74909SZhong Yang  ** Define UniqueStringSet which holds a set of strings, used to avoid holding many copies
6*8af74909SZhong Yang  ** of font names.
7*8af74909SZhong Yang  **/
8*8af74909SZhong Yang // Copyright 2017 by Neil Hodgson <[email protected]>
9*8af74909SZhong Yang // The License.txt file describes the conditions under which this software may be distributed.
10*8af74909SZhong Yang 
11*8af74909SZhong Yang #ifndef UNIQUESTRING_H
12*8af74909SZhong Yang #define UNIQUESTRING_H
13*8af74909SZhong Yang 
14*8af74909SZhong Yang namespace Scintilla {
15*8af74909SZhong Yang 
IsNullOrEmpty(const char * text)16*8af74909SZhong Yang constexpr bool IsNullOrEmpty(const char *text) noexcept {
17*8af74909SZhong Yang 	return text == nullptr || *text == '\0';
18*8af74909SZhong Yang }
19*8af74909SZhong Yang 
20*8af74909SZhong Yang using UniqueString = std::unique_ptr<const char[]>;
21*8af74909SZhong Yang 
22*8af74909SZhong Yang /// Equivalent to strdup but produces a std::unique_ptr<const char[]> allocation to go
23*8af74909SZhong Yang /// into collections.
24*8af74909SZhong Yang UniqueString UniqueStringCopy(const char *text);
25*8af74909SZhong Yang 
26*8af74909SZhong Yang // A set of strings that always returns the same pointer for each string.
27*8af74909SZhong Yang 
28*8af74909SZhong Yang class UniqueStringSet {
29*8af74909SZhong Yang private:
30*8af74909SZhong Yang 	std::vector<UniqueString> strings;
31*8af74909SZhong Yang public:
32*8af74909SZhong Yang 	UniqueStringSet() noexcept;
33*8af74909SZhong Yang 	// UniqueStringSet objects can not be copied.
34*8af74909SZhong Yang 	UniqueStringSet(const UniqueStringSet &) = delete;
35*8af74909SZhong Yang 	UniqueStringSet &operator=(const UniqueStringSet &) = delete;
36*8af74909SZhong Yang 	// UniqueStringSet objects can be moved.
37*8af74909SZhong Yang 	UniqueStringSet(UniqueStringSet &&) = default;
38*8af74909SZhong Yang 	UniqueStringSet &operator=(UniqueStringSet &&) = default;
39*8af74909SZhong Yang 	~UniqueStringSet();
40*8af74909SZhong Yang 	void Clear() noexcept;
41*8af74909SZhong Yang 	const char *Save(const char *text);
42*8af74909SZhong Yang };
43*8af74909SZhong Yang 
44*8af74909SZhong Yang }
45*8af74909SZhong Yang 
46*8af74909SZhong Yang #endif
47