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 YangUniqueString 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 YangUniqueStringSet::~UniqueStringSet() { 34*8af74909SZhong Yang strings.clear(); 35*8af74909SZhong Yang } 36*8af74909SZhong Yang Clear()37*8af74909SZhong Yangvoid UniqueStringSet::Clear() noexcept { 38*8af74909SZhong Yang strings.clear(); 39*8af74909SZhong Yang } 40*8af74909SZhong Yang Save(const char * text)41*8af74909SZhong Yangconst 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