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