piece.h 3.4 KB
Newer Older
Y
Yi Wang 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*
  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 已提交
19
#include <ostream>
L
liaogang 已提交
20
#include <string>
Y
Yi Wang 已提交
21 22

namespace paddle {
23
namespace string {
Y
Yi Wang 已提交
24

25
// Piece points into a std::string object but doesn't own the
Y
Yi Wang 已提交
26
// string.  It is for efficient access to strings.  Like Go's string
27
// type.  Not that Piece doesn't mutate the underlying string,
Y
Yi Wang 已提交
28
// so it is thread-safe given that the underlying string doesn't
29
// change.  Because Piece contains a little data members, and
Y
Yi Wang 已提交
30
// its syntax is simple as it doesn't own/manage the string, it is
31 32
// cheap to construct Pieces and pass them around.
class Piece {
33
 public:
Y
Yi Wang 已提交
34 35 36
  static const size_t npos = static_cast<size_t>(-1);

  // We provide non-explicit singleton constructors so users can
37
  // pass in a "const char*" or a "string" wherever a "Piece"
L
liaogang 已提交
38
  // is expected.  These constructors ensure that if data_ is NULL,
Y
Yi Wang 已提交
39
  // size_ is 0.
40 41
  Piece();
  Piece(const char* d, size_t n);
Y
Yi Wang 已提交
42 43
  Piece(const char* d);         // NOLINT: accept C string into Piece.
  Piece(const std::string& s);  // NOLINT: accept C++ string into Piece.
Y
Yi Wang 已提交
44 45

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

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

50
  // Piece doesn't own the string, so both iterator and const
Y
Yi Wang 已提交
51 52 53 54 55 56 57 58 59
  // 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_); }

60
 private:
Y
Yi Wang 已提交
61 62 63 64 65 66
  const char* data_;
  size_t size_;

  // Intentionally copyable
};

67
int Compare(Piece a, Piece b);
Y
Yi Wang 已提交
68

69 70 71 72 73 74
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 已提交
75

76 77
bool HasPrefix(Piece s, Piece prefix);
bool HasSuffix(Piece s, Piece suffix);
Y
Yi Wang 已提交
78

79 80
Piece SkipPrefix(Piece s, size_t n);
Piece SkipSuffix(Piece s, size_t n);
Y
Yi Wang 已提交
81 82

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

Y
Yi Wang 已提交
86 87
// Returns if s contains sub.  Any s except for empty s contains an
// empty sub.
88
bool Contains(Piece s, Piece sub);
Y
Yi Wang 已提交
89

Y
Yi Wang 已提交
90 91 92
// 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.
93
size_t Index(Piece s, Piece sub);
Y
Yi Wang 已提交
94 95

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

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

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

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

106
}  // namespace string
Y
Yi Wang 已提交
107
}  // namespace paddle