101 ArrayRef<std::pair<llvm::Constant *, llvm::Constant *>> KeysAndObjects,
108 bool SortKeysByUTF16 =
true) {
109 Opts =
static_cast<uint64_t
>(O);
110 uint64_t
const NumElements = KeysAndObjects.size();
113 Elements.reserve(NumElements);
117 std::iota(ElementIndicies.begin(), ElementIndicies.end(), 0);
142 KeysUTF8.reserve(NumElements);
144 for (
size_t I = 0; I < NumElements; ++I) {
149 StringRef KS = SL->getString()->getString();
150 KeysUTF8.push_back(KS);
151 if (!SortKeysByUTF16)
154 Dst.resize(KS.size());
155 const llvm::UTF8 *SrcPtr =
156 reinterpret_cast<const llvm::UTF8 *
>(KS.data());
157 llvm::UTF16 *DstPtr = Dst.data();
158 llvm::ConvertUTF8toUTF16(&SrcPtr, SrcPtr + KS.size(), &DstPtr,
159 DstPtr + Dst.size(), llvm::strictConversion);
161 Dst.truncate(DstPtr - Dst.data());
165 llvm::stable_sort(ElementIndicies, [O, SortKeysByUTF16, &KeysUTF8,
166 &KeysUTF16](
size_t LI,
size_t RI) {
177 return KeysUTF8[LI] < KeysUTF8[RI];
179 llvm_unreachable(
"Unexpected `NSDictionaryBuilder::Options given");
183 for (
auto &Idx : ElementIndicies) {
184 Elements.push_back(KeysAndObjects[Idx]);