150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Copyright (C) 2009-2010, International Business Machines
2b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// Corporation and others. All Rights Reserved.
3b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//
4b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// Copyright 2004 and onwards Google Inc.
5b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//
6b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// Author: wilsonh@google.com (Wilson Hsieh)
7b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//
8b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
9b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/utypes.h"
10b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/stringpiece.h"
11b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "cstring.h"
1250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "cmemory.h"
13b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
14b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_NAMESPACE_BEGIN
15b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
16b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruStringPiece::StringPiece(const char* str)
17b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    : ptr_(str), length_((str == NULL) ? 0 : static_cast<int32_t>(uprv_strlen(str))) { }
18b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
19b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruStringPiece::StringPiece(const StringPiece& x, int32_t pos) {
20b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  if (pos < 0) {
21b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    pos = 0;
22b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  } else if (pos > x.length_) {
23b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    pos = x.length_;
24b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  }
25b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  ptr_ = x.ptr_ + pos;
26b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  length_ = x.length_ - pos;
27b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
28b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
29b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruStringPiece::StringPiece(const StringPiece& x, int32_t pos, int32_t len) {
30b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  if (pos < 0) {
31b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    pos = 0;
32b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  } else if (pos > x.length_) {
33b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    pos = x.length_;
34b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  }
35b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  if (len < 0) {
36b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    len = 0;
37b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  } else if (len > x.length_ - pos) {
38b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    len = x.length_ - pos;
39b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  }
40b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  ptr_ = x.ptr_ + pos;
41b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  length_ = len;
42b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
43b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
4450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid StringPiece::set(const char* str) {
4550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  ptr_ = str;
4650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  if (str != NULL)
4750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    length_ = static_cast<int32_t>(uprv_strlen(str));
4850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  else
4950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    length_ = 0;
5050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
5150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
5250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_EXPORT UBool U_EXPORT2
5350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehooperator==(const StringPiece& x, const StringPiece& y) {
5450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  int32_t len = x.size();
5550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  if (len != y.size()) {
5650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return false;
5750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  }
5827f654740f2a26ad62a5c155af9199af9e69b889claireho  if (len == 0) {
5927f654740f2a26ad62a5c155af9199af9e69b889claireho    return true;
6027f654740f2a26ad62a5c155af9199af9e69b889claireho  }
6150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  const char* p = x.data();
6250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  const char* p2 = y.data();
6350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  // Test last byte in case strings share large common prefix
6427f654740f2a26ad62a5c155af9199af9e69b889claireho  --len;
6527f654740f2a26ad62a5c155af9199af9e69b889claireho  if (p[len] != p2[len]) return false;
6650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  // At this point we can, but don't have to, ignore the last byte.
6727f654740f2a26ad62a5c155af9199af9e69b889claireho  return uprv_memcmp(p, p2, len) == 0;
6850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
6950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
7050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
71b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/* Microsft Visual Studios <= 8.0 complains about redefinition of this
72b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * static const class variable. However, the C++ standard states that this
73b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * definition is correct. Perhaps there is a bug in the Microsoft compiler.
74b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * This is not an issue on any other compilers (that we know of) including
75b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Visual Studios 9.0.
76b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Cygwin with MSVC 9.0 also complains here about redefinition.
77b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */
7827f654740f2a26ad62a5c155af9199af9e69b889claireho#if (!defined(_MSC_VER) || (_MSC_VER > 1500)) && !defined(CYGWINMSVC)
79b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruconst int32_t StringPiece::npos;
80b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#endif
81b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
82b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_NAMESPACE_END
83