stringpiece.cpp revision b0ac937921a2c196d8b9da665135bf6ba01a1ccf
1b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// Copyright (C) 2009, 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"
12b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
13b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_NAMESPACE_BEGIN
14b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
15b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruStringPiece::StringPiece(const char* str)
16b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    : ptr_(str), length_((str == NULL) ? 0 : static_cast<int32_t>(uprv_strlen(str))) { }
17b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
18b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruStringPiece::StringPiece(const StringPiece& x, int32_t pos) {
19b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  if (pos < 0) {
20b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    pos = 0;
21b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  } else if (pos > x.length_) {
22b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    pos = x.length_;
23b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  }
24b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  ptr_ = x.ptr_ + pos;
25b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  length_ = x.length_ - pos;
26b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
27b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
28b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruStringPiece::StringPiece(const StringPiece& x, int32_t pos, int32_t len) {
29b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  if (pos < 0) {
30b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    pos = 0;
31b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  } else if (pos > x.length_) {
32b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    pos = x.length_;
33b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  }
34b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  if (len < 0) {
35b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    len = 0;
36b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  } else if (len > x.length_ - pos) {
37b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    len = x.length_ - pos;
38b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  }
39b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  ptr_ = x.ptr_ + pos;
40b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  length_ = len;
41b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
42b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
43b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/* Microsft Visual Studios <= 8.0 complains about redefinition of this
44b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * static const class variable. However, the C++ standard states that this
45b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * definition is correct. Perhaps there is a bug in the Microsoft compiler.
46b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * This is not an issue on any other compilers (that we know of) including
47b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Visual Studios 9.0.
48b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Cygwin with MSVC 9.0 also complains here about redefinition.
49b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */
50b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#if (!defined(_MSC_VER) || (_MSC_VER >= 1500)) && !defined(CYGWINMSVC)
51b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruconst int32_t StringPiece::npos;
52b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#endif
53b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
54b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_NAMESPACE_END
55