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