piece.h 4.0 KB
Newer Older
D
dzhwinter 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13
//  Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserve.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
Y
Yi Wang 已提交
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
/*
  Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserve.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/

#pragma once

L
liaogang 已提交
32
#include <ostream>
L
liaogang 已提交
33
#include <string>
Y
Yi Wang 已提交
34 35

namespace paddle {
36
namespace string {
Y
Yi Wang 已提交
37

38
// Piece points into a std::string object but doesn't own the
Y
Yi Wang 已提交
39
// string.  It is for efficient access to strings.  Like Go's string
40
// type.  Not that Piece doesn't mutate the underlying string,
Y
Yi Wang 已提交
41
// so it is thread-safe given that the underlying string doesn't
42
// change.  Because Piece contains a little data members, and
Y
Yi Wang 已提交
43
// its syntax is simple as it doesn't own/manage the string, it is
44 45
// cheap to construct Pieces and pass them around.
class Piece {
46
 public:
Y
Yi Wang 已提交
47 48 49
  static const size_t npos = static_cast<size_t>(-1);

  // We provide non-explicit singleton constructors so users can
50
  // pass in a "const char*" or a "string" wherever a "Piece"
L
liaogang 已提交
51
  // is expected.  These constructors ensure that if data_ is NULL,
Y
Yi Wang 已提交
52
  // size_ is 0.
53 54
  Piece();
  Piece(const char* d, size_t n);
Y
Yi Wang 已提交
55 56
  Piece(const char* d);         // NOLINT: accept C string into Piece.
  Piece(const std::string& s);  // NOLINT: accept C++ string into Piece.
Y
Yi Wang 已提交
57 58

  const char* data() const { return data_; }
Y
Yi Wang 已提交
59
  size_t len() const { return size_; }
Y
Yi Wang 已提交
60

Y
Yi Wang 已提交
61
  char operator[](size_t n) const;
Y
Yi Wang 已提交
62

63
  // Piece doesn't own the string, so both iterator and const
Y
Yi Wang 已提交
64 65 66 67 68 69 70 71 72
  // iterator are const char* indeed.
  typedef const char* const_iterator;
  typedef const char* iterator;
  iterator begin() const { return data_; }
  iterator end() const { return data_ + size_; }

  // Return a string that contains the copy of the referenced data.
  std::string ToString() const { return std::string(data_, size_); }

73
 private:
Y
Yi Wang 已提交
74 75 76 77 78 79
  const char* data_;
  size_t size_;

  // Intentionally copyable
};

80
int Compare(Piece a, Piece b);
Y
Yi Wang 已提交
81

82 83 84 85 86 87
bool operator==(Piece x, Piece y);
bool operator!=(Piece x, Piece y);
bool operator<(Piece x, Piece y);
bool operator>(Piece x, Piece y);
bool operator<=(Piece x, Piece y);
bool operator>=(Piece x, Piece y);
Y
Yi Wang 已提交
88

89 90
bool HasPrefix(Piece s, Piece prefix);
bool HasSuffix(Piece s, Piece suffix);
Y
Yi Wang 已提交
91

92 93
Piece SkipPrefix(Piece s, size_t n);
Piece SkipSuffix(Piece s, size_t n);
Y
Yi Wang 已提交
94 95

// Skip the prefix (or suffix) if it matches with the string.
96 97
Piece TrimPrefix(Piece s, Piece prefix);
Piece TrimSuffix(Piece s, Piece suffix);
Y
Yi Wang 已提交
98

Y
Yi Wang 已提交
99 100
// Returns if s contains sub.  Any s except for empty s contains an
// empty sub.
101
bool Contains(Piece s, Piece sub);
Y
Yi Wang 已提交
102

Y
Yi Wang 已提交
103 104 105
// Return the first occurrence of sub in s, or npos.  If both s and
// sub is empty, it returns npos; otherwise, if only sub is empty, it
// returns 0.
106
size_t Index(Piece s, Piece sub);
Y
Yi Wang 已提交
107 108

// Return the first occurrence of c in s[pos:end], or npos.
109
size_t Find(Piece s, char c, size_t pos);
Y
Yi Wang 已提交
110 111

// Search range is [0..pos] inclusive.  If pos == npos, search everything.
112
size_t RFind(Piece s, char c, size_t pos);
Y
Yi Wang 已提交
113

114
Piece SubStr(Piece s, size_t pos, size_t n);
Y
Yi Wang 已提交
115

116 117
// allow Piece to be logged
std::ostream& operator<<(std::ostream& o, Piece piece);
Y
Yi Wang 已提交
118

119
}  // namespace string
Y
Yi Wang 已提交
120
}  // namespace paddle