xref: /MusicPlayer2/scintilla/src/UniqueString.cxx (revision 8af74909132ed5e696cb05b6689ae4baf14c1c96)
1*8af74909SZhong Yang // Scintilla source code edit control
2*8af74909SZhong Yang /** @file UniqueString.cxx
3*8af74909SZhong Yang  ** Define an allocator for UniqueString.
4*8af74909SZhong Yang  **/
5*8af74909SZhong Yang // Copyright 2017 by Neil Hodgson <[email protected]>
6*8af74909SZhong Yang // The License.txt file describes the conditions under which this software may be distributed.
7*8af74909SZhong Yang 
8*8af74909SZhong Yang #include <string_view>
9*8af74909SZhong Yang #include <vector>
10*8af74909SZhong Yang #include <algorithm>
11*8af74909SZhong Yang #include <memory>
12*8af74909SZhong Yang 
13*8af74909SZhong Yang #include "UniqueString.h"
14*8af74909SZhong Yang 
15*8af74909SZhong Yang namespace Scintilla {
16*8af74909SZhong Yang 
17*8af74909SZhong Yang /// Equivalent to strdup but produces a std::unique_ptr<const char[]> allocation to go
18*8af74909SZhong Yang /// into collections.
UniqueStringCopy(const char * text)19*8af74909SZhong Yang UniqueString UniqueStringCopy(const char *text) {
20*8af74909SZhong Yang 	if (!text) {
21*8af74909SZhong Yang 		return UniqueString();
22*8af74909SZhong Yang 	}
23*8af74909SZhong Yang 	const std::string_view sv(text);
24*8af74909SZhong Yang 	std::unique_ptr<char[]> upcNew = std::make_unique<char[]>(sv.length() + 1);
25*8af74909SZhong Yang 	sv.copy(upcNew.get(), sv.length());
26*8af74909SZhong Yang 	return UniqueString(upcNew.release());
27*8af74909SZhong Yang }
28*8af74909SZhong Yang 
29*8af74909SZhong Yang // A set of strings that always returns the same pointer for each string.
30*8af74909SZhong Yang 
31*8af74909SZhong Yang UniqueStringSet::UniqueStringSet() noexcept = default;
32*8af74909SZhong Yang 
~UniqueStringSet()33*8af74909SZhong Yang UniqueStringSet::~UniqueStringSet() {
34*8af74909SZhong Yang 	strings.clear();
35*8af74909SZhong Yang }
36*8af74909SZhong Yang 
Clear()37*8af74909SZhong Yang void UniqueStringSet::Clear() noexcept {
38*8af74909SZhong Yang 	strings.clear();
39*8af74909SZhong Yang }
40*8af74909SZhong Yang 
Save(const char * text)41*8af74909SZhong Yang const char *UniqueStringSet::Save(const char *text) {
42*8af74909SZhong Yang 	if (!text)
43*8af74909SZhong Yang 		return nullptr;
44*8af74909SZhong Yang 
45*8af74909SZhong Yang 	const std::string_view sv(text);
46*8af74909SZhong Yang 	for (const UniqueString &us : strings) {
47*8af74909SZhong Yang 		if (sv == us.get()) {
48*8af74909SZhong Yang 			return us.get();
49*8af74909SZhong Yang 		}
50*8af74909SZhong Yang 	}
51*8af74909SZhong Yang 
52*8af74909SZhong Yang 	strings.push_back(UniqueStringCopy(text));
53*8af74909SZhong Yang 	return strings.back().get();
54*8af74909SZhong Yang }
55*8af74909SZhong Yang 
56*8af74909SZhong Yang }
57