13af6ab5fSopenharmony_ci/** 23af6ab5fSopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd. 33af6ab5fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 43af6ab5fSopenharmony_ci * you may not use this file except in compliance with the License. 53af6ab5fSopenharmony_ci * You may obtain a copy of the License at 63af6ab5fSopenharmony_ci * 73af6ab5fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 83af6ab5fSopenharmony_ci * 93af6ab5fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 103af6ab5fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 113af6ab5fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 123af6ab5fSopenharmony_ci * See the License for the specific language governing permissions and 133af6ab5fSopenharmony_ci * limitations under the License. 143af6ab5fSopenharmony_ci */ 153af6ab5fSopenharmony_ci 163af6ab5fSopenharmony_ci#include "ustring.h" 173af6ab5fSopenharmony_ci 183af6ab5fSopenharmony_ci#include <iterator> 193af6ab5fSopenharmony_ci 203af6ab5fSopenharmony_cinamespace ark::es2panda::util { 213af6ab5fSopenharmony_ci 223af6ab5fSopenharmony_cistd::string StringView::Mutf8() const noexcept 233af6ab5fSopenharmony_ci{ 243af6ab5fSopenharmony_ci std::string mutf8; 253af6ab5fSopenharmony_ci mutf8.reserve(sv_.size()); 263af6ab5fSopenharmony_ci 273af6ab5fSopenharmony_ci Iterator iter(*this); 283af6ab5fSopenharmony_ci 293af6ab5fSopenharmony_ci while (iter.HasNext()) { 303af6ab5fSopenharmony_ci Mutf8Encode(&mutf8, iter.Next()); 313af6ab5fSopenharmony_ci } 323af6ab5fSopenharmony_ci 333af6ab5fSopenharmony_ci return mutf8; 343af6ab5fSopenharmony_ci} 353af6ab5fSopenharmony_ci 363af6ab5fSopenharmony_cichar32_t StringView::DecodeSurrogates(char32_t high, char32_t low) 373af6ab5fSopenharmony_ci{ 383af6ab5fSopenharmony_ci constexpr auto OFFSET = 10U; 393af6ab5fSopenharmony_ci char32_t result = (high - Constants::SURROGATE_HIGH_MIN) << OFFSET; 403af6ab5fSopenharmony_ci result += low - Constants::SURROGATE_LOW_MAX; 413af6ab5fSopenharmony_ci result += Constants::CELESTIAL_OFFSET; 423af6ab5fSopenharmony_ci return result; 433af6ab5fSopenharmony_ci} 443af6ab5fSopenharmony_ci 453af6ab5fSopenharmony_cistd::tuple<char32_t, char32_t> StringView::EncodeSurrogate(char32_t cp) 463af6ab5fSopenharmony_ci{ 473af6ab5fSopenharmony_ci constexpr auto OFFSET = 10U; 483af6ab5fSopenharmony_ci char32_t cu1 = ((cp - Constants::CELESTIAL_OFFSET) >> OFFSET) | Constants::SURROGATE_HIGH_MIN; 493af6ab5fSopenharmony_ci char32_t cu2 = (cp & Constants::SURROGATE_LOW_MARKER) | Constants::SURROGATE_HIGH_MAX; 503af6ab5fSopenharmony_ci 513af6ab5fSopenharmony_ci return {cu1, cu2}; 523af6ab5fSopenharmony_ci} 533af6ab5fSopenharmony_ci 543af6ab5fSopenharmony_civoid StringView::Iterator::SkipCp() 553af6ab5fSopenharmony_ci{ 563af6ab5fSopenharmony_ci if (!HasNext()) { 573af6ab5fSopenharmony_ci return; 583af6ab5fSopenharmony_ci } 593af6ab5fSopenharmony_ci 603af6ab5fSopenharmony_ci char32_t cu0 = static_cast<uint8_t>(*iter_++); 613af6ab5fSopenharmony_ci 623af6ab5fSopenharmony_ci if (cu0 < Constants::UTF8_1BYTE_LIMIT) { 633af6ab5fSopenharmony_ci return; 643af6ab5fSopenharmony_ci } 653af6ab5fSopenharmony_ci 663af6ab5fSopenharmony_ci if ((cu0 & Constants::UTF8_3BYTE_HEADER) == Constants::UTF8_2BYTE_HEADER) { 673af6ab5fSopenharmony_ci iter_ += 1U; 683af6ab5fSopenharmony_ci return; 693af6ab5fSopenharmony_ci } 703af6ab5fSopenharmony_ci 713af6ab5fSopenharmony_ci if ((cu0 & Constants::UTF8_4BYTE_HEADER) == Constants::UTF8_3BYTE_HEADER) { 723af6ab5fSopenharmony_ci iter_ += 2U; 733af6ab5fSopenharmony_ci return; 743af6ab5fSopenharmony_ci } 753af6ab5fSopenharmony_ci 763af6ab5fSopenharmony_ci if (((cu0 & Constants::UTF8_DECODE_4BYTE_MASK) == Constants::UTF8_4BYTE_HEADER) && 773af6ab5fSopenharmony_ci (cu0 <= Constants::UTF8_DECODE_4BYTE_LIMIT)) { 783af6ab5fSopenharmony_ci iter_ += 3U; 793af6ab5fSopenharmony_ci return; 803af6ab5fSopenharmony_ci } 813af6ab5fSopenharmony_ci} 823af6ab5fSopenharmony_ci 833af6ab5fSopenharmony_cibool StringView::IsConvertibleToChar() const 843af6ab5fSopenharmony_ci{ 853af6ab5fSopenharmony_ci Iterator it(*this); 863af6ab5fSopenharmony_ci size_t size = 0; 873af6ab5fSopenharmony_ci char32_t ch = it.PeekCp(&size); 883af6ab5fSopenharmony_ci return size == Length() && ch != Iterator::INVALID_CP; 893af6ab5fSopenharmony_ci} 903af6ab5fSopenharmony_ci 913af6ab5fSopenharmony_ci} // namespace ark::es2panda::util 923af6ab5fSopenharmony_ci 933af6ab5fSopenharmony_ci// NOLINTNEXTLINE(cert-dcl58-cpp) 943af6ab5fSopenharmony_cinamespace std { 953af6ab5fSopenharmony_ci 963af6ab5fSopenharmony_ciostream &operator<<(ostream &os, const ark::es2panda::util::StringView &us) 973af6ab5fSopenharmony_ci{ 983af6ab5fSopenharmony_ci os << us.Utf8(); 993af6ab5fSopenharmony_ci return os; 1003af6ab5fSopenharmony_ci} 1013af6ab5fSopenharmony_ci 1023af6ab5fSopenharmony_ci} // namespace std 103