StringPiece.h revision 90959887e9a61ff83097b2789f8b3243ad817dec
16f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/* 26f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Copyright (C) 2015 The Android Open Source Project 36f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 46f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 56f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * you may not use this file except in compliance with the License. 66f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * You may obtain a copy of the License at 76f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 86f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 96f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Unless required by applicable law or agreed to in writing, software 116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * See the License for the specific language governing permissions and 146f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * limitations under the License. 156f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 166f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 176f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#ifndef AAPT_STRING_PIECE_H 186f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#define AAPT_STRING_PIECE_H 196f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 206f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <ostream> 216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <string> 226f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <utils/String8.h> 236f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <utils/Unicode.h> 246f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskinamespace aapt { 266f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/** 286f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Read only wrapper around basic C strings. 296f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Prevents excessive copying. 306f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 316f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * WARNING: When creating from std::basic_string<>, moving the original 326f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * std::basic_string<> will invalidate the data held in a BasicStringPiece<>. 336f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * BasicStringPiece<> should only be used transitively. 346f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 356f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename TChar> 366f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiclass BasicStringPiece { 376f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskipublic: 386f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski using const_iterator = const TChar*; 396f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 406f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski BasicStringPiece(); 416f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski BasicStringPiece(const BasicStringPiece<TChar>& str); 426f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski BasicStringPiece(const std::basic_string<TChar>& str); 436f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski BasicStringPiece(const TChar* str); 446f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski BasicStringPiece(const TChar* str, size_t len); 456f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 466f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski BasicStringPiece<TChar>& operator=(const BasicStringPiece<TChar>& rhs); 476f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski BasicStringPiece<TChar>& assign(const TChar* str, size_t len); 486f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 496f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski BasicStringPiece<TChar> substr(size_t start, size_t len) const; 506f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski BasicStringPiece<TChar> substr(BasicStringPiece<TChar>::const_iterator begin, 516f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski BasicStringPiece<TChar>::const_iterator end) const; 526f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 536f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski const TChar* data() const; 546f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski size_t length() const; 556f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski size_t size() const; 566f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski bool empty() const; 576f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski std::basic_string<TChar> toString() const; 586f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 596f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski int compare(const BasicStringPiece<TChar>& rhs) const; 606f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski bool operator<(const BasicStringPiece<TChar>& rhs) const; 616f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski bool operator>(const BasicStringPiece<TChar>& rhs) const; 626f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski bool operator==(const BasicStringPiece<TChar>& rhs) const; 636f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski bool operator!=(const BasicStringPiece<TChar>& rhs) const; 646f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 656f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski const_iterator begin() const; 666f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski const_iterator end() const; 676f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 686f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiprivate: 696f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski const TChar* mData; 706f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski size_t mLength; 716f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 726f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 736f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiusing StringPiece = BasicStringPiece<char>; 746f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiusing StringPiece16 = BasicStringPiece<char16_t>; 756f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 766f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski// 776f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski// BasicStringPiece implementation. 786f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski// 796f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 806f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename TChar> 816f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline BasicStringPiece<TChar>::BasicStringPiece() : mData(nullptr) , mLength(0) { 826f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 836f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 846f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename TChar> 856f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline BasicStringPiece<TChar>::BasicStringPiece(const BasicStringPiece<TChar>& str) : 866f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski mData(str.mData), mLength(str.mLength) { 876f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 886f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 896f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename TChar> 906f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline BasicStringPiece<TChar>::BasicStringPiece(const std::basic_string<TChar>& str) : 916f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski mData(str.data()), mLength(str.length()) { 926f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 936f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 946f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <> 956f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline BasicStringPiece<char>::BasicStringPiece(const char* str) : 966f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski mData(str), mLength(str != nullptr ? strlen(str) : 0) { 976f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 986f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 996f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <> 1006f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline BasicStringPiece<char16_t>::BasicStringPiece(const char16_t* str) : 1016f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski mData(str), mLength(str != nullptr ? strlen16(str) : 0) { 1026f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 1036f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1046f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename TChar> 1056f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline BasicStringPiece<TChar>::BasicStringPiece(const TChar* str, size_t len) : 1066f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski mData(str), mLength(len) { 1076f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 1086f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1096f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename TChar> 1106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline BasicStringPiece<TChar>& BasicStringPiece<TChar>::operator=( 1116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski const BasicStringPiece<TChar>& rhs) { 1126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski mData = rhs.mData; 1136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski mLength = rhs.mLength; 1146f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return *this; 1156f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 1166f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1176f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename TChar> 1186f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline BasicStringPiece<TChar>& BasicStringPiece<TChar>::assign(const TChar* str, size_t len) { 1196f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski mData = str; 1206f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski mLength = len; 1216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return *this; 1226f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 1236f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1246f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename TChar> 1266f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline BasicStringPiece<TChar> BasicStringPiece<TChar>::substr(size_t start, size_t len) const { 1276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski if (start + len > mLength) { 1286f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return BasicStringPiece<TChar>(); 1296f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski } 1306f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return BasicStringPiece<TChar>(mData + start, len); 1316f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 1326f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1336f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename TChar> 1346f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline BasicStringPiece<TChar> BasicStringPiece<TChar>::substr( 1356f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski BasicStringPiece<TChar>::const_iterator begin, 1366f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski BasicStringPiece<TChar>::const_iterator end) const { 1376f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return BasicStringPiece<TChar>(begin, end - begin); 1386f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 1396f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1406f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename TChar> 1416f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline const TChar* BasicStringPiece<TChar>::data() const { 1426f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return mData; 1436f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 1446f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1456f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename TChar> 1466f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline size_t BasicStringPiece<TChar>::length() const { 1476f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return mLength; 1486f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 1496f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1506f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename TChar> 1516f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline size_t BasicStringPiece<TChar>::size() const { 1526f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return mLength; 1536f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 1546f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1556f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename TChar> 1566f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline bool BasicStringPiece<TChar>::empty() const { 1576f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return mLength == 0; 1586f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 1596f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1606f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename TChar> 1616f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline std::basic_string<TChar> BasicStringPiece<TChar>::toString() const { 1626f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return std::basic_string<TChar>(mData, mLength); 1636f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 1646f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1656f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <> 1666f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline int BasicStringPiece<char>::compare(const BasicStringPiece<char>& rhs) const { 1676f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski const char nullStr = '\0'; 1686f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski const char* b1 = mData != nullptr ? mData : &nullStr; 1696f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski const char* e1 = b1 + mLength; 1706f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski const char* b2 = rhs.mData != nullptr ? rhs.mData : &nullStr; 1716f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski const char* e2 = b2 + rhs.mLength; 1726f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1736f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski while (b1 < e1 && b2 < e2) { 1746f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski const int d = static_cast<int>(*b1++) - static_cast<int>(*b2++); 1756f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski if (d) { 1766f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return d; 1776f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski } 1786f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski } 1796f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return static_cast<int>(mLength - rhs.mLength); 1806f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 1816f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1826f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline ::std::ostream& operator<<(::std::ostream& out, const BasicStringPiece<char16_t>& str) { 1836f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski android::String8 utf8(str.data(), str.size()); 1846f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return out.write(utf8.string(), utf8.size()); 1856f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 1866f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1876f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1886f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <> 1896f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline int BasicStringPiece<char16_t>::compare(const BasicStringPiece<char16_t>& rhs) const { 1906f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski const char16_t nullStr = u'\0'; 1916f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski const char16_t* b1 = mData != nullptr ? mData : &nullStr; 1926f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski const char16_t* b2 = rhs.mData != nullptr ? rhs.mData : &nullStr; 1936f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return strzcmp16(b1, mLength, b2, rhs.mLength); 1946f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 1956f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1966f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename TChar> 1976f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline bool BasicStringPiece<TChar>::operator<(const BasicStringPiece<TChar>& rhs) const { 1986f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return compare(rhs) < 0; 1996f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 2006f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2016f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename TChar> 2026f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline bool BasicStringPiece<TChar>::operator>(const BasicStringPiece<TChar>& rhs) const { 2036f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return compare(rhs) > 0; 2046f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 2056f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2066f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename TChar> 2076f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline bool BasicStringPiece<TChar>::operator==(const BasicStringPiece<TChar>& rhs) const { 2086f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return compare(rhs) == 0; 2096f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 2106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename TChar> 2126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline bool BasicStringPiece<TChar>::operator!=(const BasicStringPiece<TChar>& rhs) const { 2136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return compare(rhs) != 0; 2146f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 2156f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2166f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename TChar> 2176f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline typename BasicStringPiece<TChar>::const_iterator BasicStringPiece<TChar>::begin() const { 2186f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return mData; 2196f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 2206f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskitemplate <typename TChar> 2226f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline typename BasicStringPiece<TChar>::const_iterator BasicStringPiece<TChar>::end() const { 2236f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return mData + mLength; 2246f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 2256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2266f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline ::std::ostream& operator<<(::std::ostream& out, const BasicStringPiece<char>& str) { 2276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return out.write(str.data(), str.size()); 2286f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 2296f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 2306f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} // namespace aapt 2316f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 23290959887e9a61ff83097b2789f8b3243ad817decAdam Lesinskiinline ::std::ostream& operator<<(::std::ostream& out, const std::u16string& str) { 23390959887e9a61ff83097b2789f8b3243ad817decAdam Lesinski android::String8 utf8(str.data(), str.size()); 23490959887e9a61ff83097b2789f8b3243ad817decAdam Lesinski return out.write(utf8.string(), utf8.size()); 23590959887e9a61ff83097b2789f8b3243ad817decAdam Lesinski} 23690959887e9a61ff83097b2789f8b3243ad817decAdam Lesinski 2376f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#endif // AAPT_STRING_PIECE_H 238