16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Copyright (C) 2009-2013, International Business Machines
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Corporation and others. All Rights Reserved.
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Copyright 2001 and onwards Google Inc.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Author: Sanjay Ghemawat
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// This code is a contribution of Google code, and the style used here is
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// a compromise between the original Google code and the ICU coding guidelines.
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// For example, data types are ICU-ified (size_t,int->int32_t),
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// and API comments doxygen-ified, but function names and behavior are
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// as in the original, if possible.
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Assertion-style error handling, not available in ICU, was changed to
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// parameter "pinning" similar to UnicodeString.
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// In addition, this is only a partial port of the original Google code,
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// limited to what was needed so far. The (nearly) complete original code
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// is in the ICU svn repository at icuhtml/trunk/design/strings/contrib
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// (see ICU ticket 6765, r25517).
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef __STRINGPIECE_H__
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define __STRINGPIECE_H__
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \file
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \brief C++ API: StringPiece: Read-only byte string wrapper class.
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uobject.h"
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/std_string.h"
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Arghh!  I wish C++ literals were "string".
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * A string-like object that points to a sized piece of memory.
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * We provide non-explicit singleton constructors so users can pass
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * in a "const char*" or a "string" wherever a "StringPiece" is
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * expected.
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Functions or methods may use const StringPiece& parameters to accept either
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * a "const char*" or a "string" value that will be implicitly converted to
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * a StringPiece.
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Systematic usage of StringPiece is encouraged as it will reduce unnecessary
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * conversions from "const char*" to "string" and back again.
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.2
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass U_COMMON_API StringPiece : public UMemory {
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org private:
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  const char*   ptr_;
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t       length_;
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public:
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Default constructor, creates an empty StringPiece.
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.2
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  StringPiece() : ptr_(NULL), length_(0) { }
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Constructs from a NUL-terminated const char * pointer.
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param str a NUL-terminated const char * pointer
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.2
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  StringPiece(const char* str);
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_HAVE_STD_STRING
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Constructs from a std::string.
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.2
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  StringPiece(const std::string& str)
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    : ptr_(str.data()), length_(static_cast<int32_t>(str.size())) { }
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Constructs from a const char * pointer and a specified length.
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param offset a const char * pointer (need not be terminated)
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param len the length of the string; must be non-negative
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.2
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  StringPiece(const char* offset, int32_t len) : ptr_(offset), length_(len) { }
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Substring of another StringPiece.
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param x the other StringPiece
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param pos start position in x; must be non-negative and <= x.length().
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.2
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  StringPiece(const StringPiece& x, int32_t pos);
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Substring of another StringPiece.
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param x the other StringPiece
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param pos start position in x; must be non-negative and <= x.length().
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param len length of the substring;
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *            must be non-negative and will be pinned to at most x.length() - pos.
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.2
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  StringPiece(const StringPiece& x, int32_t pos, int32_t len);
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Returns the string pointer. May be NULL if it is empty.
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * data() may return a pointer to a buffer with embedded NULs, and the
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * returned buffer may or may not be null terminated.  Therefore it is
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * typically a mistake to pass data() to a routine that expects a NUL
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * terminated string.
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return the string pointer
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.2
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  const char* data() const { return ptr_; }
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Returns the string length. Same as length().
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return the string length
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.2
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t size() const { return length_; }
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Returns the string length. Same as size().
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return the string length
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.2
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t length() const { return length_; }
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Returns whether the string is empty.
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return TRUE if the string is empty
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.2
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UBool empty() const { return length_ == 0; }
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Sets to an empty string.
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.2
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void clear() { ptr_ = NULL; length_ = 0; }
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Reset the stringpiece to refer to new data.
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param xdata pointer the new string data.  Need not be nul terminated.
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param len the length of the new data
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.8
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void set(const char* xdata, int32_t len) { ptr_ = xdata; length_ = len; }
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Reset the stringpiece to refer to new data.
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param str a pointer to a NUL-terminated string.
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.8
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void set(const char* str);
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Removes the first n string units.
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param n prefix length, must be non-negative and <=length()
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.2
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void remove_prefix(int32_t n) {
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (n >= 0) {
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (n > length_) {
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        n = length_;
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      }
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      ptr_ += n;
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      length_ -= n;
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Removes the last n string units.
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param n suffix length, must be non-negative and <=length()
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.2
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void remove_suffix(int32_t n) {
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (n >= 0) {
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (n <= length_) {
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length_ -= n;
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      } else {
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length_ = 0;
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      }
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Maximum integer, used as a default value for substring methods.
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.2
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  static const int32_t npos; // = 0x7fffffff;
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Returns a substring of this StringPiece.
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param pos start position; must be non-negative and <= length().
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param len length of the substring;
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *            must be non-negative and will be pinned to at most length() - pos.
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return the substring StringPiece
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.2
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  StringPiece substr(int32_t pos, int32_t len = npos) const {
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return StringPiece(*this, pos, len);
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Global operator == for StringPiece
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param x The first StringPiece to compare.
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param y The second StringPiece to compare.
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return TRUE if the string data is equal
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_EXPORT UBool U_EXPORT2
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgoperator==(const StringPiece& x, const StringPiece& y);
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Global operator != for StringPiece
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param x The first StringPiece to compare.
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param y The second StringPiece to compare.
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return TRUE if the string data is not equal
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool operator!=(const StringPiece& x, const StringPiece& y) {
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return !(x == y);
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif  // __STRINGPIECE_H__
225