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 Yangconstexpr 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