| 237 | } |
| 238 | |
| 239 | bool ToTitle(TUtf16String& text, size_t pos, size_t count) { |
| 240 | if (!text) { |
| 241 | return false; |
| 242 | } |
| 243 | |
| 244 | pos = pos < text.size() ? pos : text.size(); |
| 245 | count = count < text.size() - pos ? count : text.size() - pos; |
| 246 | |
| 247 | const auto toLower = [](const wchar32 s) { return ToLower(s); }; |
| 248 | |
| 249 | auto* p = const_cast<wchar16*>(text.data() + pos); |
| 250 | const auto* pe = text.data() + pos + count; |
| 251 | |
| 252 | const auto firstSymbol = ReadSymbol(p, pe); |
| 253 | if (firstSymbol == ToTitle(firstSymbol)) { |
| 254 | p = SkipSymbol(p, pe); |
| 255 | if (ModifySequence<true>(p, pe, toLower)) { |
| 256 | DetachAndFixPointers(text, p, pe); |
| 257 | ModifySequence<false>(p, pe, toLower); |
| 258 | return true; |
| 259 | } |
| 260 | } else { |
| 261 | DetachAndFixPointers(text, p, pe); |
| 262 | WriteSymbol(ToTitle(ReadSymbol(p, pe)), p); // also moves `p` forward |
| 263 | ModifySequence<false>(p, pe, toLower); |
| 264 | return true; |
| 265 | } |
| 266 | |
| 267 | return false; |
| 268 | } |
| 269 | |
| 270 | bool ToTitle(TUtf32String& text, size_t pos, size_t count) { |
| 271 | if (!text) { |