12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/* 22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2010 The Android Open Source Project 32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License. 62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at 72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software 112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and 142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License. 152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */ 16d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro 17578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "stringpiece.h" 18d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro 19cf7f19135f0e273f7b0136315633c2abfc715343Ian Rogers#include <ostream> 200e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro#include <utility> 21d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro 226b604a1b0289e5e7211c2e5f8c4f395f51de7c3dIan Rogers#include "logging.h" 236b604a1b0289e5e7211c2e5f8c4f395f51de7c3dIan Rogers 240e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapironamespace art { 25d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro 266b604a1b0289e5e7211c2e5f8c4f395f51de7c3dIan Rogers#if !defined(NDEBUG) 276b604a1b0289e5e7211c2e5f8c4f395f51de7c3dIan Rogerschar StringPiece::operator[](size_type i) const { 286b604a1b0289e5e7211c2e5f8c4f395f51de7c3dIan Rogers CHECK_LT(i, length_); 296b604a1b0289e5e7211c2e5f8c4f395f51de7c3dIan Rogers return ptr_[i]; 306b604a1b0289e5e7211c2e5f8c4f395f51de7c3dIan Rogers} 316b604a1b0289e5e7211c2e5f8c4f395f51de7c3dIan Rogers#endif 326b604a1b0289e5e7211c2e5f8c4f395f51de7c3dIan Rogers 33d4e48fdd5f8baad270a82120a912106b98074501Carl Shapirovoid StringPiece::CopyToString(std::string* target) const { 34d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro target->assign(ptr_, length_); 35d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro} 36d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro 376b604a1b0289e5e7211c2e5f8c4f395f51de7c3dIan RogersStringPiece::size_type StringPiece::copy(char* buf, size_type n, size_type pos) const { 386b604a1b0289e5e7211c2e5f8c4f395f51de7c3dIan Rogers size_type ret = std::min(length_ - pos, n); 39d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro memcpy(buf, ptr_ + pos, ret); 40d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro return ret; 41d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro} 42d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro 436cc18456b6d0d1348ad1d64116b7ab78108ff814Brian CarlstromStringPiece::size_type StringPiece::find(const StringPiece& s, size_type pos) const { 446b604a1b0289e5e7211c2e5f8c4f395f51de7c3dIan Rogers if (length_ == 0 || pos > static_cast<size_type>(length_)) { 45d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro return npos; 466b604a1b0289e5e7211c2e5f8c4f395f51de7c3dIan Rogers } 476b604a1b0289e5e7211c2e5f8c4f395f51de7c3dIan Rogers const char* result = std::search(ptr_ + pos, ptr_ + length_, s.ptr_, s.ptr_ + s.length_); 48d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro const size_type xpos = result - ptr_; 496b604a1b0289e5e7211c2e5f8c4f395f51de7c3dIan Rogers return xpos + s.length_ <= length_ ? xpos : npos; 50d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro} 51d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro 52d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiroint StringPiece::compare(const StringPiece& x) const { 53d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro int r = memcmp(ptr_, x.ptr_, std::min(length_, x.length_)); 54d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro if (r == 0) { 55d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro if (length_ < x.length_) r = -1; 56d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro else if (length_ > x.length_) r = +1; 57d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro } 58d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro return r; 59d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro} 60d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro 616cc18456b6d0d1348ad1d64116b7ab78108ff814Brian CarlstromStringPiece::size_type StringPiece::find(char c, size_type pos) const { 626b604a1b0289e5e7211c2e5f8c4f395f51de7c3dIan Rogers if (length_ == 0 || pos >= length_) { 63d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro return npos; 64d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro } 65d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro const char* result = std::find(ptr_ + pos, ptr_ + length_, c); 66d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro return result != ptr_ + length_ ? result - ptr_ : npos; 67d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro} 68d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro 696cc18456b6d0d1348ad1d64116b7ab78108ff814Brian CarlstromStringPiece::size_type StringPiece::rfind(const StringPiece& s, size_type pos) const { 70d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro if (length_ < s.length_) return npos; 71d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro const size_t ulen = length_; 72d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro if (s.length_ == 0) return std::min(ulen, pos); 73d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro 74d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro const char* last = ptr_ + std::min(ulen - s.length_, pos) + s.length_; 75d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro const char* result = std::find_end(ptr_, last, s.ptr_, s.ptr_ + s.length_); 76d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro return result != last ? result - ptr_ : npos; 77d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro} 78d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro 796cc18456b6d0d1348ad1d64116b7ab78108ff814Brian CarlstromStringPiece::size_type StringPiece::rfind(char c, size_type pos) const { 806b604a1b0289e5e7211c2e5f8c4f395f51de7c3dIan Rogers if (length_ == 0) return npos; 81d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro for (int i = std::min(pos, static_cast<size_type>(length_ - 1)); 82d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro i >= 0; --i) { 83d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro if (ptr_[i] == c) { 84d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro return i; 85d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro } 86d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro } 87d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro return npos; 88d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro} 89d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro 90d4e48fdd5f8baad270a82120a912106b98074501Carl ShapiroStringPiece StringPiece::substr(size_type pos, size_type n) const { 91d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro if (pos > static_cast<size_type>(length_)) pos = length_; 92d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro if (n > length_ - pos) n = length_ - pos; 93d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro return StringPiece(ptr_ + pos, n); 94d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro} 95d4e48fdd5f8baad270a82120a912106b98074501Carl Shapiro 9611d1b0c31ddd710d26068da8e0e4621002205b4bElliott Hughesstd::ostream& operator<<(std::ostream& o, const StringPiece& piece) { 970e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro o.write(piece.data(), piece.size()); 980e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro return o; 990e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro} 1001f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes 1011f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes} // namespace art 102