Coverage Report

Created: 2026-10-09 06:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/proc/self/cwd/common/internal/byte_string.h
Line
Count
Source
1
// Copyright 2024 Google LLC
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
//     https://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14
15
#ifndef THIRD_PARTY_CEL_CPP_COMMON_INTERNAL_BYTE_STRING_H_
16
#define THIRD_PARTY_CEL_CPP_COMMON_INTERNAL_BYTE_STRING_H_
17
18
#include <cstddef>
19
#include <cstdint>
20
#include <cstring>
21
#include <optional>
22
#include <ostream>
23
#include <string>
24
#include <utility>
25
26
#include "absl/base/attributes.h"
27
#include "absl/base/nullability.h"
28
#include "absl/functional/overload.h"
29
#include "absl/log/absl_check.h"
30
#include "absl/strings/cord.h"
31
#include "absl/strings/match.h"
32
#include "absl/strings/string_view.h"
33
#include "absl/types/optional.h"
34
#include "google/protobuf/arena.h"
35
36
namespace cel {
37
38
class BytesValueInputStream;
39
class BytesValueOutputStream;
40
class StringValue;
41
42
namespace common_internal {
43
44
class [[nodiscard]] ByteString;
45
46
struct ByteStringTestFriend;
47
48
enum class ByteStringKind : unsigned int {
49
  kSmall = 0,
50
  kMedium,
51
  kLarge,
52
};
53
54
0
inline std::ostream& operator<<(std::ostream& out, ByteStringKind kind) {
55
0
  switch (kind) {
56
0
    case ByteStringKind::kSmall:
57
0
      return out << "SMALL";
58
0
    case ByteStringKind::kMedium:
59
0
      return out << "MEDIUM";
60
0
    case ByteStringKind::kLarge:
61
0
      return out << "LARGE";
62
0
  }
63
0
}
64
65
// Representation of small strings in ByteString, which are stored in place.
66
struct SmallByteStringRep final {
67
#ifdef _MSC_VER
68
#pragma pack(push, 1)
69
#endif
70
  struct ABSL_ATTRIBUTE_PACKED {
71
    std::uint8_t kind : 2;
72
    std::uint8_t size : 6;
73
  };
74
#ifdef _MSC_VER
75
#pragma pack(pop)
76
#endif
77
  char data[23];
78
};
79
80
inline constexpr size_t kSmallByteStringCapacity =
81
    sizeof(SmallByteStringRep::data);
82
83
inline constexpr size_t kMediumByteStringSizeBits = sizeof(size_t) * 8 - 2;
84
inline constexpr size_t kMediumByteStringMaxSize =
85
    (size_t{1} << kMediumByteStringSizeBits) - 1;
86
87
inline constexpr size_t kLargeByteStringMaxSize =
88
    (size_t{1} << kMediumByteStringSizeBits) - 1;
89
90
inline constexpr size_t kByteStringViewSizeBits = sizeof(size_t) * 8 - 1;
91
inline constexpr size_t kByteStringViewMaxSize =
92
    (size_t{1} << kByteStringViewSizeBits) - 1;
93
94
// Representation of medium strings in ByteString. These are either owned by an
95
// arena or managed by a reference count. This is encoded in `owner` following
96
// the same semantics as `cel::Owner`.
97
struct MediumByteStringRep final {
98
#ifdef _MSC_VER
99
#pragma pack(push, 1)
100
#endif
101
  struct ABSL_ATTRIBUTE_PACKED {
102
    size_t kind : 2;
103
    size_t size : kMediumByteStringSizeBits;
104
  };
105
#ifdef _MSC_VER
106
#pragma pack(pop)
107
#endif
108
  const char* absl_nullability_unknown data;
109
  google::protobuf::Arena* absl_nullable arena;
110
};
111
112
// Representation of large strings in ByteString. These are stored as
113
// a pointer to `absl::Cord`.
114
struct LargeByteStringRep final {
115
#ifdef _MSC_VER
116
#pragma pack(push, 1)
117
#endif
118
  struct ABSL_ATTRIBUTE_PACKED {
119
    size_t kind : 2;
120
    size_t offset : kMediumByteStringSizeBits / 2;
121
    size_t size : kMediumByteStringSizeBits / 2;
122
  };
123
#ifdef _MSC_VER
124
#pragma pack(pop)
125
#endif
126
  const absl::Cord* absl_nullability_unknown data;
127
  google::protobuf::Arena* absl_nullable arena;
128
};
129
130
// Representation of ByteString.
131
union ByteStringRep final {
132
#ifdef _MSC_VER
133
#pragma pack(push, 1)
134
#endif
135
  struct ABSL_ATTRIBUTE_PACKED {
136
    ByteStringKind kind : 2;
137
  } header;
138
#ifdef _MSC_VER
139
#pragma pack(pop)
140
#endif
141
  SmallByteStringRep small;
142
  MediumByteStringRep medium;
143
  LargeByteStringRep large;
144
};
145
146
// Returns a `absl::string_view` from `ByteString`, using `arena` to make memory
147
// allocations if necessary. `stable` indicates whether `cel::Value` is in a
148
// location where it will not be moved, so that inline string/bytes storage can
149
// be referenced.
150
absl::string_view LegacyByteString(const ByteString& string, bool stable,
151
                                   google::protobuf::Arena* absl_nonnull arena);
152
153
// `ByteString` is a vocabulary type capable of representing copy-on-write
154
// strings efficiently for arenas and reference counting. The contents of the
155
// byte string are owned by an arena or managed by a reference count. All byte
156
// strings have an associated allocator specified at construction, once the byte
157
// string is constructed the allocator will not and cannot change. Copying and
158
// moving between different allocators is supported and dealt with
159
// transparently by copying.
160
class [[nodiscard]] ByteString final {
161
 public:
162
  static ByteString From(const char* absl_nullable value,
163
                         google::protobuf::Arena* absl_nonnull arena
164
0
                             ABSL_ATTRIBUTE_LIFETIME_BOUND) {
165
0
    return From(absl::NullSafeStringView(value), arena);
166
0
  }
167
  static ByteString From(absl::string_view value,
168
                         google::protobuf::Arena* absl_nonnull arena
169
                             ABSL_ATTRIBUTE_LIFETIME_BOUND);
170
  static ByteString From(absl::Cord value, google::protobuf::Arena* absl_nonnull arena
171
                                               ABSL_ATTRIBUTE_LIFETIME_BOUND);
172
  static ByteString From(std::string&& value,
173
                         google::protobuf::Arena* absl_nonnull arena
174
                             ABSL_ATTRIBUTE_LIFETIME_BOUND);
175
176
  static ByteString Wrap(absl::string_view value,
177
                         google::protobuf::Arena* absl_nullable arena
178
478k
                             ABSL_ATTRIBUTE_LIFETIME_BOUND) {
179
478k
    ByteString result(UninitializedTag{});
180
478k
    result.SetMedium(arena, value);
181
478k
    return result;
182
478k
  }
183
  static ByteString Wrap(
184
      const absl::Cord* absl_nonnull value ABSL_ATTRIBUTE_LIFETIME_BOUND,
185
0
      google::protobuf::Arena* absl_nullable arena ABSL_ATTRIBUTE_LIFETIME_BOUND) {
186
0
    return Wrap(value, 0, value->size(), arena);
187
0
  }
188
  static ByteString Wrap(
189
      const absl::Cord* absl_nonnull value ABSL_ATTRIBUTE_LIFETIME_BOUND,
190
      size_t offset, size_t size,
191
0
      google::protobuf::Arena* absl_nullable arena ABSL_ATTRIBUTE_LIFETIME_BOUND) {
192
0
    ByteString result(UninitializedTag{});
193
0
    result.SetLarge(arena, value, offset, size);
194
0
    return result;
195
0
  }
196
  static ByteString Wrap(std::nullptr_t, google::protobuf::Arena*) = delete;
197
  static ByteString Wrap(std::nullptr_t, size_t, size_t,
198
                         google::protobuf::Arena*) = delete;
199
  static ByteString Wrap(std::string&& value, google::protobuf::Arena*) = delete;
200
201
453k
  static ByteString WrapUnsafe(absl::string_view value) {
202
453k
    return Wrap(value, static_cast<google::protobuf::Arena*>(nullptr));
203
453k
  }
204
0
  static ByteString WrapUnsafe(const absl::Cord* absl_nonnull value) {
205
0
    return WrapUnsafe(value, 0, value->size());
206
0
  }
207
  static ByteString WrapUnsafe(const absl::Cord* absl_nonnull value,
208
0
                               size_t offset, size_t size) {
209
0
    return Wrap(value, offset, size, static_cast<google::protobuf::Arena*>(nullptr));
210
0
  }
211
  static ByteString WrapUnsafe(std::nullptr_t) = delete;
212
  static ByteString WrapUnsafe(std::nullptr_t, size_t, size_t) = delete;
213
214
  static ByteString Concat(const ByteString& lhs, const ByteString& rhs,
215
                           google::protobuf::Arena* absl_nonnull arena);
216
217
21.3k
  ByteString() noexcept { SetSmallEmpty(); }
218
219
  ByteString(const ByteString&) = default;
220
  ByteString(ByteString&&) = default;
221
  ByteString& operator=(const ByteString&) = default;
222
  ByteString& operator=(ByteString&&) = default;
223
224
9.33k
  bool empty() const {
225
9.33k
    switch (GetKind()) {
226
9.03k
      case ByteStringKind::kSmall:
227
9.03k
        return rep_.small.size == 0;
228
301
      case ByteStringKind::kMedium:
229
301
        return rep_.medium.size == 0;
230
0
      case ByteStringKind::kLarge:
231
0
        return rep_.large.size == 0;
232
9.33k
    }
233
9.33k
  }
234
235
6.71k
  size_t size() const {
236
6.71k
    switch (GetKind()) {
237
6.61k
      case ByteStringKind::kSmall:
238
6.61k
        return rep_.small.size;
239
97
      case ByteStringKind::kMedium:
240
97
        return rep_.medium.size;
241
0
      case ByteStringKind::kLarge:
242
0
        return rep_.large.size;
243
6.71k
    }
244
6.71k
  }
245
246
0
  size_t max_size() const { return kByteStringViewMaxSize; }
247
248
  absl::optional<absl::string_view> TryFlat() const
249
      ABSL_ATTRIBUTE_LIFETIME_BOUND;
250
251
  bool Equals(absl::string_view rhs) const;
252
  bool Equals(const absl::Cord& rhs) const;
253
  bool Equals(const ByteString& rhs) const;
254
255
  int Compare(absl::string_view rhs) const;
256
  int Compare(const absl::Cord& rhs) const;
257
  int Compare(const ByteString& rhs) const;
258
259
  bool StartsWith(absl::string_view rhs) const;
260
  bool StartsWith(const absl::Cord& rhs) const;
261
  bool StartsWith(const ByteString& rhs) const;
262
263
  bool EndsWith(absl::string_view rhs) const;
264
  bool EndsWith(const absl::Cord& rhs) const;
265
  bool EndsWith(const ByteString& rhs) const;
266
267
  // Finds the first occurrence of `needle` in this object, starting at byte
268
  // position `pos`. Returns `absl::nullopt` if `needle` is not found.
269
  // Note: Positions are byte-based, not code point based as in
270
  // `cel::StringValue`.
271
  absl::optional<size_t> Find(absl::string_view needle, size_t pos = 0) const;
272
  absl::optional<size_t> Find(const absl::Cord& needle, size_t pos = 0) const;
273
  absl::optional<size_t> Find(const ByteString& needle, size_t pos = 0) const;
274
275
  // Returns a new `ByteString` that is a substring of this object, starting at
276
  // byte position `pos` and with a length of `npos` bytes.
277
  // Note: Positions are byte-based, not code point based as in
278
  // `cel::StringValue`.
279
  ByteString Substring(size_t pos, size_t npos) const;
280
0
  ByteString Substring(size_t pos) const {
281
0
    ABSL_DCHECK_LE(pos, size());
282
0
    return Substring(pos, size());
283
0
  }
284
285
  void RemovePrefix(size_t n);
286
287
  void RemoveSuffix(size_t n);
288
289
  std::string ToString() const;
290
291
  void CopyToString(std::string* absl_nonnull out) const;
292
293
  void AppendToString(std::string* absl_nonnull out) const;
294
295
  absl::Cord ToCord() const;
296
297
  void CopyToCord(absl::Cord* absl_nonnull out) const;
298
299
  void AppendToCord(absl::Cord* absl_nonnull out) const;
300
301
  absl::string_view ToStringView(
302
      std::string* absl_nonnull scratch
303
          ABSL_ATTRIBUTE_LIFETIME_BOUND) const ABSL_ATTRIBUTE_LIFETIME_BOUND;
304
305
  // Returns the arena which owns the underling data for this byte string.
306
  // Returns null when the data is not owned by an arena.
307
0
  google::protobuf::Arena* absl_nullable GetArena() const {
308
0
    switch (GetKind()) {
309
0
      case ByteStringKind::kSmall:
310
0
        return nullptr;
311
0
      case ByteStringKind::kMedium:
312
0
        return GetMediumArena();
313
0
      case ByteStringKind::kLarge:
314
0
        return GetLargeArena();
315
0
    }
316
0
  }
317
318
  ByteString Clone(google::protobuf::Arena* absl_nonnull arena) const;
319
320
  template <typename Visitor>
321
235k
  decltype(auto) Visit(Visitor&& visitor) const {
322
235k
    if (auto string_view = AsStringView(); string_view) {
323
235k
      return std::forward<Visitor>(visitor)(*string_view);
324
235k
    }
325
0
    return std::forward<Visitor>(visitor)(GetLarge());
326
235k
  }
decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::common_internal::ByteString::Equals(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::Equals(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::{lambda(absl::lts_20260526::Cord const&)#1}> >(absl::lts_20260526::Overload<cel::common_internal::ByteString::Equals(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::Equals(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::{lambda(absl::lts_20260526::Cord const&)#1}>&&) const
Line
Count
Source
321
120k
  decltype(auto) Visit(Visitor&& visitor) const {
322
120k
    if (auto string_view = AsStringView(); string_view) {
323
120k
      return std::forward<Visitor>(visitor)(*string_view);
324
120k
    }
325
0
    return std::forward<Visitor>(visitor)(GetLarge());
326
120k
  }
Unexecuted instantiation: decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::common_internal::ByteString::Equals(absl::lts_20260526::Cord const&) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::Equals(absl::lts_20260526::Cord const&) const::{lambda(absl::lts_20260526::Cord const&)#1}> >(absl::lts_20260526::Overload<cel::common_internal::ByteString::Equals(absl::lts_20260526::Cord const&) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::Equals(absl::lts_20260526::Cord const&) const::{lambda(absl::lts_20260526::Cord const&)#1}>&&) const
decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::common_internal::ByteString::Equals(cel::common_internal::ByteString const&) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::Equals(cel::common_internal::ByteString const&) const::{lambda(absl::lts_20260526::Cord const&)#1}> >(absl::lts_20260526::Overload<cel::common_internal::ByteString::Equals(cel::common_internal::ByteString const&) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::Equals(cel::common_internal::ByteString const&) const::{lambda(absl::lts_20260526::Cord const&)#1}>&&) const
Line
Count
Source
321
33.9k
  decltype(auto) Visit(Visitor&& visitor) const {
322
33.9k
    if (auto string_view = AsStringView(); string_view) {
323
33.9k
      return std::forward<Visitor>(visitor)(*string_view);
324
33.9k
    }
325
0
    return std::forward<Visitor>(visitor)(GetLarge());
326
33.9k
  }
decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::common_internal::ByteString::Compare(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::Compare(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::{lambda(absl::lts_20260526::Cord const&)#1}> >(absl::lts_20260526::Overload<cel::common_internal::ByteString::Compare(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::Compare(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::{lambda(absl::lts_20260526::Cord const&)#1}>&&) const
Line
Count
Source
321
4.79k
  decltype(auto) Visit(Visitor&& visitor) const {
322
4.79k
    if (auto string_view = AsStringView(); string_view) {
323
4.79k
      return std::forward<Visitor>(visitor)(*string_view);
324
4.79k
    }
325
0
    return std::forward<Visitor>(visitor)(GetLarge());
326
4.79k
  }
Unexecuted instantiation: decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::common_internal::ByteString::Compare(absl::lts_20260526::Cord const&) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::Compare(absl::lts_20260526::Cord const&) const::{lambda(absl::lts_20260526::Cord const&)#1}> >(absl::lts_20260526::Overload<cel::common_internal::ByteString::Compare(absl::lts_20260526::Cord const&) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::Compare(absl::lts_20260526::Cord const&) const::{lambda(absl::lts_20260526::Cord const&)#1}>&&) const
decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::common_internal::ByteString::Compare(cel::common_internal::ByteString const&) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::Compare(cel::common_internal::ByteString const&) const::{lambda(absl::lts_20260526::Cord const&)#1}> >(absl::lts_20260526::Overload<cel::common_internal::ByteString::Compare(cel::common_internal::ByteString const&) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::Compare(cel::common_internal::ByteString const&) const::{lambda(absl::lts_20260526::Cord const&)#1}>&&) const
Line
Count
Source
321
4.79k
  decltype(auto) Visit(Visitor&& visitor) const {
322
4.79k
    if (auto string_view = AsStringView(); string_view) {
323
4.79k
      return std::forward<Visitor>(visitor)(*string_view);
324
4.79k
    }
325
0
    return std::forward<Visitor>(visitor)(GetLarge());
326
4.79k
  }
decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::common_internal::ByteString::StartsWith(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::StartsWith(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::{lambda(absl::lts_20260526::Cord const&)#1}> >(absl::lts_20260526::Overload<cel::common_internal::ByteString::StartsWith(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::StartsWith(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::{lambda(absl::lts_20260526::Cord const&)#1}>&&) const
Line
Count
Source
321
1.18k
  decltype(auto) Visit(Visitor&& visitor) const {
322
1.18k
    if (auto string_view = AsStringView(); string_view) {
323
1.18k
      return std::forward<Visitor>(visitor)(*string_view);
324
1.18k
    }
325
0
    return std::forward<Visitor>(visitor)(GetLarge());
326
1.18k
  }
Unexecuted instantiation: decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::common_internal::ByteString::StartsWith(absl::lts_20260526::Cord const&) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::StartsWith(absl::lts_20260526::Cord const&) const::{lambda(absl::lts_20260526::Cord const&)#1}> >(absl::lts_20260526::Overload<cel::common_internal::ByteString::StartsWith(absl::lts_20260526::Cord const&) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::StartsWith(absl::lts_20260526::Cord const&) const::{lambda(absl::lts_20260526::Cord const&)#1}>&&) const
decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::common_internal::ByteString::StartsWith(cel::common_internal::ByteString const&) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::StartsWith(cel::common_internal::ByteString const&) const::{lambda(absl::lts_20260526::Cord const&)#1}> >(absl::lts_20260526::Overload<cel::common_internal::ByteString::StartsWith(cel::common_internal::ByteString const&) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::StartsWith(cel::common_internal::ByteString const&) const::{lambda(absl::lts_20260526::Cord const&)#1}>&&) const
Line
Count
Source
321
1.18k
  decltype(auto) Visit(Visitor&& visitor) const {
322
1.18k
    if (auto string_view = AsStringView(); string_view) {
323
1.18k
      return std::forward<Visitor>(visitor)(*string_view);
324
1.18k
    }
325
0
    return std::forward<Visitor>(visitor)(GetLarge());
326
1.18k
  }
decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::common_internal::ByteString::EndsWith(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::EndsWith(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::{lambda(absl::lts_20260526::Cord const&)#1}> >(absl::lts_20260526::Overload<cel::common_internal::ByteString::EndsWith(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::EndsWith(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::{lambda(absl::lts_20260526::Cord const&)#1}>&&) const
Line
Count
Source
321
1.45k
  decltype(auto) Visit(Visitor&& visitor) const {
322
1.45k
    if (auto string_view = AsStringView(); string_view) {
323
1.45k
      return std::forward<Visitor>(visitor)(*string_view);
324
1.45k
    }
325
0
    return std::forward<Visitor>(visitor)(GetLarge());
326
1.45k
  }
Unexecuted instantiation: decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::common_internal::ByteString::EndsWith(absl::lts_20260526::Cord const&) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::EndsWith(absl::lts_20260526::Cord const&) const::{lambda(absl::lts_20260526::Cord const&)#1}> >(absl::lts_20260526::Overload<cel::common_internal::ByteString::EndsWith(absl::lts_20260526::Cord const&) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::EndsWith(absl::lts_20260526::Cord const&) const::{lambda(absl::lts_20260526::Cord const&)#1}>&&) const
decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::common_internal::ByteString::EndsWith(cel::common_internal::ByteString const&) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::EndsWith(cel::common_internal::ByteString const&) const::{lambda(absl::lts_20260526::Cord const&)#1}> >(absl::lts_20260526::Overload<cel::common_internal::ByteString::EndsWith(cel::common_internal::ByteString const&) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::EndsWith(cel::common_internal::ByteString const&) const::{lambda(absl::lts_20260526::Cord const&)#1}>&&) const
Line
Count
Source
321
1.45k
  decltype(auto) Visit(Visitor&& visitor) const {
322
1.45k
    if (auto string_view = AsStringView(); string_view) {
323
1.45k
      return std::forward<Visitor>(visitor)(*string_view);
324
1.45k
    }
325
0
    return std::forward<Visitor>(visitor)(GetLarge());
326
1.45k
  }
Unexecuted instantiation: decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::common_internal::ByteString::Find(cel::common_internal::ByteString const&, unsigned long) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::Find(cel::common_internal::ByteString const&, unsigned long) const::{lambda(absl::lts_20260526::Cord const&)#1}> >(absl::lts_20260526::Overload<cel::common_internal::ByteString::Find(cel::common_internal::ByteString const&, unsigned long) const::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::ByteString::Find(cel::common_internal::ByteString const&, unsigned long) const::{lambda(absl::lts_20260526::Cord const&)#1}>&&) const
Unexecuted instantiation: regex_match_step.cc:decltype(auto) cel::common_internal::ByteString::Visit<google::api::expr::runtime::(anonymous namespace)::MatchesVisitor>(google::api::expr::runtime::(anonymous namespace)::MatchesVisitor&&) const
type_conversion_functions.cc:decltype(auto) cel::common_internal::ByteString::Visit<cel::(anonymous namespace)::RegisterStringConversionFunctions(cel::FunctionRegistry&, cel::RuntimeOptions const&)::$_0::operator()(cel::BytesValue const&, cel::Function::InvokeContext const&) const::{lambda(auto:1 const&)#1}>(cel::(anonymous namespace)::RegisterStringConversionFunctions(cel::FunctionRegistry&, cel::RuntimeOptions const&)::$_0::operator()(cel::BytesValue const&, cel::Function::InvokeContext const&) const::{lambda(auto:1 const&)#1}&&) const
Line
Count
Source
321
2.38k
  decltype(auto) Visit(Visitor&& visitor) const {
322
2.38k
    if (auto string_view = AsStringView(); string_view) {
323
2.38k
      return std::forward<Visitor>(visitor)(*string_view);
324
2.38k
    }
325
0
    return std::forward<Visitor>(visitor)(GetLarge());
326
2.38k
  }
Unexecuted instantiation: bytes_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::(anonymous namespace)::BytesDebugString<cel::BytesValue>(cel::BytesValue const&)::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::(anonymous namespace)::BytesDebugString<cel::BytesValue>(cel::BytesValue const&)::{lambda(absl::lts_20260526::Cord const&)#1}> >(absl::lts_20260526::Overload<cel::(anonymous namespace)::BytesDebugString<cel::BytesValue>(cel::BytesValue const&)::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::(anonymous namespace)::BytesDebugString<cel::BytesValue>(cel::BytesValue const&)::{lambda(absl::lts_20260526::Cord const&)#1}>&&) const
bytes_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<cel::BytesValue::ConvertToJson(google::protobuf::DescriptorPool const*, google::protobuf::MessageFactory*, google::protobuf::Message*) const::$_0>(cel::BytesValue::ConvertToJson(google::protobuf::DescriptorPool const*, google::protobuf::MessageFactory*, google::protobuf::Message*) const::$_0&&) const
Line
Count
Source
321
2.50k
  decltype(auto) Visit(Visitor&& visitor) const {
322
2.50k
    if (auto string_view = AsStringView(); string_view) {
323
2.50k
      return std::forward<Visitor>(visitor)(*string_view);
324
2.50k
    }
325
0
    return std::forward<Visitor>(visitor)(GetLarge());
326
2.50k
  }
bytes_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<cel::BytesValue::Equal(cel::Value const&, google::protobuf::DescriptorPool const*, google::protobuf::MessageFactory*, google::protobuf::Arena*, cel::Value*) const::$_0>(cel::BytesValue::Equal(cel::Value const&, google::protobuf::DescriptorPool const*, google::protobuf::MessageFactory*, google::protobuf::Arena*, cel::Value*) const::$_0&&) const
Line
Count
Source
321
1.05k
  decltype(auto) Visit(Visitor&& visitor) const {
322
1.05k
    if (auto string_view = AsStringView(); string_view) {
323
1.05k
      return std::forward<Visitor>(visitor)(*string_view);
324
1.05k
    }
325
0
    return std::forward<Visitor>(visitor)(GetLarge());
326
1.05k
  }
bytes_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<cel::BytesValue::Equal(cel::Value const&, google::protobuf::DescriptorPool const*, google::protobuf::MessageFactory*, google::protobuf::Arena*, cel::Value*) const::$_0::operator()<std::__1::basic_string_view<char, std::__1::char_traits<char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&) const::{lambda(auto:1 const&)#1}>(cel::BytesValue::Equal(cel::Value const&, google::protobuf::DescriptorPool const*, google::protobuf::MessageFactory*, google::protobuf::Arena*, cel::Value*) const::$_0::operator()<std::__1::basic_string_view<char, std::__1::char_traits<char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&) const::{lambda(auto:1 const&)#1}&&) const
Line
Count
Source
321
1.05k
  decltype(auto) Visit(Visitor&& visitor) const {
322
1.05k
    if (auto string_view = AsStringView(); string_view) {
323
1.05k
      return std::forward<Visitor>(visitor)(*string_view);
324
1.05k
    }
325
0
    return std::forward<Visitor>(visitor)(GetLarge());
326
1.05k
  }
Unexecuted instantiation: bytes_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<cel::BytesValue::Equal(cel::Value const&, google::protobuf::DescriptorPool const*, google::protobuf::MessageFactory*, google::protobuf::Arena*, cel::Value*) const::$_0::operator()<absl::lts_20260526::Cord>(absl::lts_20260526::Cord const&) const::{lambda(auto:1 const&)#1}>(cel::BytesValue::Equal(cel::Value const&, google::protobuf::DescriptorPool const*, google::protobuf::MessageFactory*, google::protobuf::Arena*, cel::Value*) const::$_0::operator()<absl::lts_20260526::Cord>(absl::lts_20260526::Cord const&) const::{lambda(auto:1 const&)#1}&&) const
string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<cel::StringValue::Size() const::$_0>(cel::StringValue::Size() const::$_0&&) const
Line
Count
Source
321
610
  decltype(auto) Visit(Visitor&& visitor) const {
322
610
    if (auto string_view = AsStringView(); string_view) {
323
610
      return std::forward<Visitor>(visitor)(*string_view);
324
610
    }
325
0
    return std::forward<Visitor>(visitor)(GetLarge());
326
610
  }
string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::StringValue::Contains(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::$_0, cel::StringValue::Contains(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::$_1> >(absl::lts_20260526::Overload<cel::StringValue::Contains(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::$_0, cel::StringValue::Contains(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::$_1>&&) const
Line
Count
Source
321
2.07k
  decltype(auto) Visit(Visitor&& visitor) const {
322
2.07k
    if (auto string_view = AsStringView(); string_view) {
323
2.07k
      return std::forward<Visitor>(visitor)(*string_view);
324
2.07k
    }
325
0
    return std::forward<Visitor>(visitor)(GetLarge());
326
2.07k
  }
Unexecuted instantiation: string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::StringValue::Contains(absl::lts_20260526::Cord const&) const::$_0, cel::StringValue::Contains(absl::lts_20260526::Cord const&) const::$_1> >(absl::lts_20260526::Overload<cel::StringValue::Contains(absl::lts_20260526::Cord const&) const::$_0, cel::StringValue::Contains(absl::lts_20260526::Cord const&) const::$_1>&&) const
string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::StringValue::Contains(cel::StringValue const&) const::$_0, cel::StringValue::Contains(cel::StringValue const&) const::$_1> >(absl::lts_20260526::Overload<cel::StringValue::Contains(cel::StringValue const&) const::$_0, cel::StringValue::Contains(cel::StringValue const&) const::$_1>&&) const
Line
Count
Source
321
2.07k
  decltype(auto) Visit(Visitor&& visitor) const {
322
2.07k
    if (auto string_view = AsStringView(); string_view) {
323
2.07k
      return std::forward<Visitor>(visitor)(*string_view);
324
2.07k
    }
325
0
    return std::forward<Visitor>(visitor)(GetLarge());
326
2.07k
  }
Unexecuted instantiation: string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::StringValue::IndexOf(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::$_0, cel::StringValue::IndexOf(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::$_1> >(absl::lts_20260526::Overload<cel::StringValue::IndexOf(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::$_0, cel::StringValue::IndexOf(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::$_1>&&) const
Unexecuted instantiation: string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::StringValue::IndexOf(absl::lts_20260526::Cord const&) const::$_0, cel::StringValue::IndexOf(absl::lts_20260526::Cord const&) const::$_1> >(absl::lts_20260526::Overload<cel::StringValue::IndexOf(absl::lts_20260526::Cord const&) const::$_0, cel::StringValue::IndexOf(absl::lts_20260526::Cord const&) const::$_1>&&) const
Unexecuted instantiation: string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::StringValue::IndexOf(cel::StringValue const&) const::$_0, cel::StringValue::IndexOf(cel::StringValue const&) const::$_1> >(absl::lts_20260526::Overload<cel::StringValue::IndexOf(cel::StringValue const&) const::$_0, cel::StringValue::IndexOf(cel::StringValue const&) const::$_1>&&) const
Unexecuted instantiation: string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::StringValue::IndexOf(std::__1::basic_string_view<char, std::__1::char_traits<char> >, long) const::$_0, cel::StringValue::IndexOf(std::__1::basic_string_view<char, std::__1::char_traits<char> >, long) const::$_1> >(absl::lts_20260526::Overload<cel::StringValue::IndexOf(std::__1::basic_string_view<char, std::__1::char_traits<char> >, long) const::$_0, cel::StringValue::IndexOf(std::__1::basic_string_view<char, std::__1::char_traits<char> >, long) const::$_1>&&) const
Unexecuted instantiation: string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::StringValue::IndexOf(absl::lts_20260526::Cord const&, long) const::$_0, cel::StringValue::IndexOf(absl::lts_20260526::Cord const&, long) const::$_1> >(absl::lts_20260526::Overload<cel::StringValue::IndexOf(absl::lts_20260526::Cord const&, long) const::$_0, cel::StringValue::IndexOf(absl::lts_20260526::Cord const&, long) const::$_1>&&) const
Unexecuted instantiation: string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::StringValue::IndexOf(cel::StringValue const&, long) const::$_0, cel::StringValue::IndexOf(cel::StringValue const&, long) const::$_1> >(absl::lts_20260526::Overload<cel::StringValue::IndexOf(cel::StringValue const&, long) const::$_0, cel::StringValue::IndexOf(cel::StringValue const&, long) const::$_1>&&) const
Unexecuted instantiation: string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::StringValue::LastIndexOf(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::$_0, cel::StringValue::LastIndexOf(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::$_1> >(absl::lts_20260526::Overload<cel::StringValue::LastIndexOf(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::$_0, cel::StringValue::LastIndexOf(std::__1::basic_string_view<char, std::__1::char_traits<char> >) const::$_1>&&) const
Unexecuted instantiation: string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::StringValue::LastIndexOf(absl::lts_20260526::Cord const&) const::$_0, cel::StringValue::LastIndexOf(absl::lts_20260526::Cord const&) const::$_1> >(absl::lts_20260526::Overload<cel::StringValue::LastIndexOf(absl::lts_20260526::Cord const&) const::$_0, cel::StringValue::LastIndexOf(absl::lts_20260526::Cord const&) const::$_1>&&) const
Unexecuted instantiation: string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::StringValue::LastIndexOf(cel::StringValue const&) const::$_0, cel::StringValue::LastIndexOf(cel::StringValue const&) const::$_1> >(absl::lts_20260526::Overload<cel::StringValue::LastIndexOf(cel::StringValue const&) const::$_0, cel::StringValue::LastIndexOf(cel::StringValue const&) const::$_1>&&) const
Unexecuted instantiation: string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::StringValue::LastIndexOf(std::__1::basic_string_view<char, std::__1::char_traits<char> >, long) const::$_0, cel::StringValue::LastIndexOf(std::__1::basic_string_view<char, std::__1::char_traits<char> >, long) const::$_1> >(absl::lts_20260526::Overload<cel::StringValue::LastIndexOf(std::__1::basic_string_view<char, std::__1::char_traits<char> >, long) const::$_0, cel::StringValue::LastIndexOf(std::__1::basic_string_view<char, std::__1::char_traits<char> >, long) const::$_1>&&) const
Unexecuted instantiation: string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::StringValue::LastIndexOf(absl::lts_20260526::Cord const&, long) const::$_0, cel::StringValue::LastIndexOf(absl::lts_20260526::Cord const&, long) const::$_1> >(absl::lts_20260526::Overload<cel::StringValue::LastIndexOf(absl::lts_20260526::Cord const&, long) const::$_0, cel::StringValue::LastIndexOf(absl::lts_20260526::Cord const&, long) const::$_1>&&) const
Unexecuted instantiation: string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::StringValue::LastIndexOf(cel::StringValue const&, long) const::$_0, cel::StringValue::LastIndexOf(cel::StringValue const&, long) const::$_1> >(absl::lts_20260526::Overload<cel::StringValue::LastIndexOf(cel::StringValue const&, long) const::$_0, cel::StringValue::LastIndexOf(cel::StringValue const&, long) const::$_1>&&) const
Unexecuted instantiation: string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::StringValue::Quote(google::protobuf::Arena*) const::$_0, cel::StringValue::Quote(google::protobuf::Arena*) const::$_1> >(absl::lts_20260526::Overload<cel::StringValue::Quote(google::protobuf::Arena*) const::$_0, cel::StringValue::Quote(google::protobuf::Arena*) const::$_1>&&) const
Unexecuted instantiation: string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::StringValue::Reverse(google::protobuf::Arena*) const::$_0, cel::StringValue::Reverse(google::protobuf::Arena*) const::$_1> >(absl::lts_20260526::Overload<cel::StringValue::Reverse(google::protobuf::Arena*) const::$_0, cel::StringValue::Reverse(google::protobuf::Arena*) const::$_1>&&) const
Unexecuted instantiation: string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::StringValue::Split(cel::StringValue const&, long, google::protobuf::Arena*, cel::Value*) const::$_0, cel::StringValue::Split(cel::StringValue const&, long, google::protobuf::Arena*, cel::Value*) const::$_1> >(absl::lts_20260526::Overload<cel::StringValue::Split(cel::StringValue const&, long, google::protobuf::Arena*, cel::Value*) const::$_0, cel::StringValue::Split(cel::StringValue const&, long, google::protobuf::Arena*, cel::Value*) const::$_1>&&) const
Unexecuted instantiation: string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::StringValue::Replace(cel::StringValue const&, cel::StringValue const&, long, google::protobuf::Arena*, cel::Value*) const::$_0, cel::StringValue::Replace(cel::StringValue const&, cel::StringValue const&, long, google::protobuf::Arena*, cel::Value*) const::$_1> >(absl::lts_20260526::Overload<cel::StringValue::Replace(cel::StringValue const&, cel::StringValue const&, long, google::protobuf::Arena*, cel::Value*) const::$_0, cel::StringValue::Replace(cel::StringValue const&, cel::StringValue const&, long, google::protobuf::Arena*, cel::Value*) const::$_1>&&) const
Unexecuted instantiation: string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::StringValue::CharAt(long, google::protobuf::Arena*) const::$_0, cel::StringValue::CharAt(long, google::protobuf::Arena*) const::$_1> >(absl::lts_20260526::Overload<cel::StringValue::CharAt(long, google::protobuf::Arena*) const::$_0, cel::StringValue::CharAt(long, google::protobuf::Arena*) const::$_1>&&) const
string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::(anonymous namespace)::StringDebugString<cel::StringValue>(cel::StringValue const&)::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::(anonymous namespace)::StringDebugString<cel::StringValue>(cel::StringValue const&)::{lambda(absl::lts_20260526::Cord const&)#1}> >(absl::lts_20260526::Overload<cel::(anonymous namespace)::StringDebugString<cel::StringValue>(cel::StringValue const&)::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::(anonymous namespace)::StringDebugString<cel::StringValue>(cel::StringValue const&)::{lambda(absl::lts_20260526::Cord const&)#1}>&&) const
Line
Count
Source
321
47.0k
  decltype(auto) Visit(Visitor&& visitor) const {
322
47.0k
    if (auto string_view = AsStringView(); string_view) {
323
47.0k
      return std::forward<Visitor>(visitor)(*string_view);
324
47.0k
    }
325
0
    return std::forward<Visitor>(visitor)(GetLarge());
326
47.0k
  }
string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<cel::StringValue::ConvertToJson(google::protobuf::DescriptorPool const*, google::protobuf::MessageFactory*, google::protobuf::Message*) const::$_0>(cel::StringValue::ConvertToJson(google::protobuf::DescriptorPool const*, google::protobuf::MessageFactory*, google::protobuf::Message*) const::$_0&&) const
Line
Count
Source
321
2.53k
  decltype(auto) Visit(Visitor&& visitor) const {
322
2.53k
    if (auto string_view = AsStringView(); string_view) {
323
2.53k
      return std::forward<Visitor>(visitor)(*string_view);
324
2.53k
    }
325
0
    return std::forward<Visitor>(visitor)(GetLarge());
326
2.53k
  }
string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<cel::StringValue::Equal(cel::Value const&, google::protobuf::DescriptorPool const*, google::protobuf::MessageFactory*, google::protobuf::Arena*, cel::Value*) const::$_0>(cel::StringValue::Equal(cel::Value const&, google::protobuf::DescriptorPool const*, google::protobuf::MessageFactory*, google::protobuf::Arena*, cel::Value*) const::$_0&&) const
Line
Count
Source
321
2.37k
  decltype(auto) Visit(Visitor&& visitor) const {
322
2.37k
    if (auto string_view = AsStringView(); string_view) {
323
2.37k
      return std::forward<Visitor>(visitor)(*string_view);
324
2.37k
    }
325
0
    return std::forward<Visitor>(visitor)(GetLarge());
326
2.37k
  }
string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<cel::StringValue::Equal(cel::Value const&, google::protobuf::DescriptorPool const*, google::protobuf::MessageFactory*, google::protobuf::Arena*, cel::Value*) const::$_0::operator()<std::__1::basic_string_view<char, std::__1::char_traits<char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&) const::{lambda(auto:1 const&)#1}>(cel::StringValue::Equal(cel::Value const&, google::protobuf::DescriptorPool const*, google::protobuf::MessageFactory*, google::protobuf::Arena*, cel::Value*) const::$_0::operator()<std::__1::basic_string_view<char, std::__1::char_traits<char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&) const::{lambda(auto:1 const&)#1}&&) const
Line
Count
Source
321
2.37k
  decltype(auto) Visit(Visitor&& visitor) const {
322
2.37k
    if (auto string_view = AsStringView(); string_view) {
323
2.37k
      return std::forward<Visitor>(visitor)(*string_view);
324
2.37k
    }
325
0
    return std::forward<Visitor>(visitor)(GetLarge());
326
2.37k
  }
Unexecuted instantiation: string_value.cc:decltype(auto) cel::common_internal::ByteString::Visit<cel::StringValue::Equal(cel::Value const&, google::protobuf::DescriptorPool const*, google::protobuf::MessageFactory*, google::protobuf::Arena*, cel::Value*) const::$_0::operator()<absl::lts_20260526::Cord>(absl::lts_20260526::Cord const&) const::{lambda(auto:1 const&)#1}>(cel::StringValue::Equal(cel::Value const&, google::protobuf::DescriptorPool const*, google::protobuf::MessageFactory*, google::protobuf::Arena*, cel::Value*) const::$_0::operator()<absl::lts_20260526::Cord>(absl::lts_20260526::Cord const&) const::{lambda(auto:1 const&)#1}&&) const
Unexecuted instantiation: struct_value_builder.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::common_internal::(anonymous namespace)::MessageValueBuilderImpl::SetSingularField(google::protobuf::FieldDescriptor const*, cel::Value)::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::(anonymous namespace)::MessageValueBuilderImpl::SetSingularField(google::protobuf::FieldDescriptor const*, cel::Value)::{lambda(absl::lts_20260526::Cord const&)#1}> >(absl::lts_20260526::Overload<cel::common_internal::(anonymous namespace)::MessageValueBuilderImpl::SetSingularField(google::protobuf::FieldDescriptor const*, cel::Value)::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#1}, cel::common_internal::(anonymous namespace)::MessageValueBuilderImpl::SetSingularField(google::protobuf::FieldDescriptor const*, cel::Value)::{lambda(absl::lts_20260526::Cord const&)#1}>&&) const
Unexecuted instantiation: struct_value_builder.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::common_internal::(anonymous namespace)::MessageValueBuilderImpl::SetSingularField(google::protobuf::FieldDescriptor const*, cel::Value)::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#2}, cel::common_internal::(anonymous namespace)::MessageValueBuilderImpl::SetSingularField(google::protobuf::FieldDescriptor const*, cel::Value)::{lambda(absl::lts_20260526::Cord const&)#2}> >(absl::lts_20260526::Overload<cel::common_internal::(anonymous namespace)::MessageValueBuilderImpl::SetSingularField(google::protobuf::FieldDescriptor const*, cel::Value)::{lambda(std::__1::basic_string_view<char, std::__1::char_traits<char> >)#2}, cel::common_internal::(anonymous namespace)::MessageValueBuilderImpl::SetSingularField(google::protobuf::FieldDescriptor const*, cel::Value)::{lambda(absl::lts_20260526::Cord const&)#2}>&&) const
Unexecuted instantiation: value.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::StringValue::StringValue(cel::BytesValue const&)::$_0, cel::StringValue::$_0(cel::BytesValue const&)::$_1> >(absl::lts_20260526::Overload<cel::StringValue::StringValue(cel::BytesValue const&)::$_0, cel::StringValue::$_0(cel::BytesValue const&)::$_1>&&) const
Unexecuted instantiation: byte_string.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::common_internal::ByteString::Find(std::__1::basic_string_view<char, std::__1::char_traits<char> >, unsigned long) const::$_0, cel::common_internal::ByteString::Find(std::__1::basic_string_view<char, std::__1::char_traits<char> >, unsigned long) const::$_1> >(absl::lts_20260526::Overload<cel::common_internal::ByteString::Find(std::__1::basic_string_view<char, std::__1::char_traits<char> >, unsigned long) const::$_0, cel::common_internal::ByteString::Find(std::__1::basic_string_view<char, std::__1::char_traits<char> >, unsigned long) const::$_1>&&) const
Unexecuted instantiation: byte_string.cc:decltype(auto) cel::common_internal::ByteString::Visit<absl::lts_20260526::Overload<cel::common_internal::ByteString::Find(absl::lts_20260526::Cord const&, unsigned long) const::$_0, cel::common_internal::ByteString::Find(absl::lts_20260526::Cord const&, unsigned long) const::$_1> >(absl::lts_20260526::Overload<cel::common_internal::ByteString::Find(absl::lts_20260526::Cord const&, unsigned long) const::$_0, cel::common_internal::ByteString::Find(absl::lts_20260526::Cord const&, unsigned long) const::$_1>&&) const
327
328
0
  friend void swap(ByteString& lhs, ByteString& rhs) noexcept {
329
0
    using std::swap;
330
0
    swap(lhs.rep_, rhs.rep_);
331
0
  }
332
333
  template <typename H>
334
313k
  friend H AbslHashValue(H state, const ByteString& byte_string) {
335
313k
    if (auto string_view = byte_string.AsStringView(); string_view) {
336
313k
      return H::combine(std::move(state), *string_view);
337
313k
    }
338
0
    return H::combine(std::move(state), byte_string.GetLarge());
339
313k
  }
340
341
 private:
342
  friend class ByteStringView;
343
  friend struct ByteStringTestFriend;
344
  friend class cel::BytesValueInputStream;
345
  friend class cel::BytesValueOutputStream;
346
  friend class cel::StringValue;
347
  friend absl::string_view LegacyByteString(const ByteString& string,
348
                                            bool stable,
349
                                            google::protobuf::Arena* absl_nonnull arena);
350
351
  struct UninitializedTag {
352
    explicit UninitializedTag() = default;
353
  };
354
355
495k
  explicit ByteString(UninitializedTag) {}
356
357
808k
  constexpr ByteStringKind GetKind() const { return rep_.header.kind; }
358
359
625k
  absl::string_view GetSmall() const {
360
625k
    ABSL_DCHECK_EQ(GetKind(), ByteStringKind::kSmall);
361
625k
    return GetSmall(rep_.small);
362
625k
  }
363
364
625k
  static absl::string_view GetSmall(const SmallByteStringRep& rep) {
365
625k
    return absl::string_view(rep.data, rep.size);
366
625k
  }
367
368
160k
  absl::string_view GetMedium() const {
369
160k
    ABSL_DCHECK_EQ(GetKind(), ByteStringKind::kMedium);
370
160k
    return GetMedium(rep_.medium);
371
160k
  }
372
373
160k
  static absl::string_view GetMedium(const MediumByteStringRep& rep) {
374
160k
    return absl::string_view(rep.data, rep.size);
375
160k
  }
376
377
70
  google::protobuf::Arena* absl_nullable GetMediumArena() const {
378
70
    ABSL_DCHECK_EQ(GetKind(), ByteStringKind::kMedium);
379
70
    return GetMediumArena(rep_.medium);
380
70
  }
381
382
  static google::protobuf::Arena* absl_nullable GetMediumArena(
383
70
      const MediumByteStringRep& rep) {
384
70
    return rep.arena;
385
70
  }
386
387
  static absl::Cord GetLarge(
388
0
      const LargeByteStringRep& rep ABSL_ATTRIBUTE_LIFETIME_BOUND) {
389
0
    return rep.data->Subcord(rep.offset, rep.size);
390
0
  }
391
392
0
  absl::Cord GetLarge() const ABSL_ATTRIBUTE_LIFETIME_BOUND {
393
0
    ABSL_DCHECK_EQ(GetKind(), ByteStringKind::kLarge);
394
0
    return GetLarge(rep_.large);
395
0
  }
396
397
0
  google::protobuf::Arena* absl_nullable GetLargeArena() const {
398
0
    ABSL_DCHECK_EQ(GetKind(), ByteStringKind::kLarge);
399
0
    return GetLargeArena(rep_.large);
400
0
  }
401
402
  static google::protobuf::Arena* absl_nullable GetLargeArena(
403
0
      const LargeByteStringRep& rep ABSL_ATTRIBUTE_LIFETIME_BOUND) {
404
0
    return rep.arena;
405
0
  }
406
407
21.3k
  void SetSmallEmpty() {
408
21.3k
    rep_.header.kind = ByteStringKind::kSmall;
409
21.3k
    rep_.small.size = 0;
410
21.3k
  }
411
412
12.5k
  void SetSmall(absl::string_view string) {
413
12.5k
    ABSL_DCHECK_LE(string.size(), kSmallByteStringCapacity);
414
12.5k
    rep_.header.kind = ByteStringKind::kSmall;
415
12.5k
    rep_.small.size = string.size();
416
12.5k
    if (!string.empty()) {
417
10.8k
      std::memcpy(rep_.small.data, string.data(), rep_.small.size);
418
10.8k
    }
419
12.5k
  }
420
421
0
  void SetSmall(const absl::Cord& cord) {
422
0
    ABSL_DCHECK_LE(cord.size(), kSmallByteStringCapacity);
423
0
    rep_.header.kind = ByteStringKind::kSmall;
424
0
    rep_.small.size = cord.size();
425
0
    CopyCordToArray(cord, rep_.small.data);
426
0
  }
427
428
479k
  void SetMedium(google::protobuf::Arena* absl_nullable arena, absl::string_view string) {
429
479k
    rep_.header.kind = ByteStringKind::kMedium;
430
479k
    rep_.medium.size = string.size();
431
479k
    rep_.medium.data = string.data();
432
479k
    rep_.medium.arena = arena;
433
479k
  }
434
435
  void SetMedium(google::protobuf::Arena* absl_nullable arena,
436
0
                 const std::string* absl_nonnull string) {
437
0
    SetMedium(arena, absl::string_view(*string));
438
0
  }
439
440
  void SetLarge(google::protobuf::Arena* absl_nullable arena,
441
                const absl::Cord* absl_nonnull cord, size_t offset = 0,
442
                size_t size = static_cast<size_t>(-1)) {
443
    ABSL_DCHECK_LE(offset, cord->size());
444
    ABSL_DCHECK_LE(offset, kLargeByteStringMaxSize);
445
    rep_.header.kind = ByteStringKind::kLarge;
446
    rep_.large.offset = offset;
447
    if (size == static_cast<size_t>(-1)) {
448
      size = cord->size() - offset;
449
    }
450
    ABSL_DCHECK_LE(size, cord->size() - offset);
451
    ABSL_DCHECK_LE(size, kLargeByteStringMaxSize);
452
    rep_.large.size = size;
453
    rep_.large.data = cord;
454
    rep_.large.arena = arena;
455
  }
456
457
0
  static void CopyCordToArray(const absl::Cord& cord, char* data) {
458
0
    for (absl::string_view chunk : cord.Chunks()) {
459
0
      std::memcpy(data, chunk.data(), chunk.size());
460
0
      data += chunk.size();
461
0
    }
462
0
  }
463
464
  static void CopyCordToArray(const absl::Cord& cord, size_t offset,
465
                              size_t size, char* data);
466
467
  static void AppendCordToString(const absl::Cord& cord, size_t offset,
468
                                 size_t size, std::string& data);
469
470
  void CopyToArray(char* absl_nonnull out) const;
471
472
548k
  std::optional<absl::string_view> AsStringView() const {
473
548k
    switch (GetKind()) {
474
451k
      case ByteStringKind::kSmall:
475
451k
        return GetSmall();
476
97.3k
      case ByteStringKind::kMedium:
477
97.3k
        return GetMedium();
478
0
      case ByteStringKind::kLarge:
479
0
        return std::nullopt;
480
548k
    }
481
548k
  }
482
483
  ByteStringRep rep_;
484
};
485
486
120k
inline bool ByteString::Equals(absl::string_view rhs) const {
487
120k
  return Visit(absl::Overload(
488
120k
      [&rhs](absl::string_view lhs) -> bool { return lhs == rhs; },
489
120k
      [&rhs](const absl::Cord& lhs) -> bool { return lhs == rhs; }));
490
120k
}
491
492
0
inline bool ByteString::Equals(const absl::Cord& rhs) const {
493
0
  return Visit(absl::Overload(
494
0
      [&rhs](absl::string_view lhs) -> bool { return lhs == rhs; },
495
0
      [&rhs](const absl::Cord& lhs) -> bool { return lhs == rhs; }));
496
0
}
497
498
33.9k
inline bool ByteString::Equals(const ByteString& rhs) const {
499
33.9k
  return rhs.Visit(absl::Overload(
500
33.9k
      [this](absl::string_view rhs) -> bool { return Equals(rhs); },
501
33.9k
      [this](const absl::Cord& rhs) -> bool { return Equals(rhs); }));
502
33.9k
}
503
504
4.79k
inline int ByteString::Compare(absl::string_view rhs) const {
505
4.79k
  return Visit(absl::Overload(
506
4.79k
      [&rhs](absl::string_view lhs) -> int { return lhs.compare(rhs); },
507
4.79k
      [&rhs](const absl::Cord& lhs) -> int { return lhs.Compare(rhs); }));
508
4.79k
}
509
510
0
inline int ByteString::Compare(const absl::Cord& rhs) const {
511
0
  return Visit(absl::Overload(
512
0
      [&rhs](absl::string_view lhs) -> int { return -rhs.Compare(lhs); },
513
0
      [&rhs](const absl::Cord& lhs) -> int { return lhs.Compare(rhs); }));
514
0
}
515
516
4.79k
inline int ByteString::Compare(const ByteString& rhs) const {
517
4.79k
  return rhs.Visit(absl::Overload(
518
4.79k
      [this](absl::string_view rhs) -> int { return Compare(rhs); },
519
4.79k
      [this](const absl::Cord& rhs) -> int { return Compare(rhs); }));
520
4.79k
}
521
522
1.18k
inline bool ByteString::StartsWith(absl::string_view rhs) const {
523
1.18k
  return Visit(absl::Overload(
524
1.18k
      [&rhs](absl::string_view lhs) -> bool {
525
1.18k
        return absl::StartsWith(lhs, rhs);
526
1.18k
      },
527
1.18k
      [&rhs](const absl::Cord& lhs) -> bool { return lhs.StartsWith(rhs); }));
528
1.18k
}
529
530
0
inline bool ByteString::StartsWith(const absl::Cord& rhs) const {
531
0
  return Visit(absl::Overload(
532
0
      [&rhs](absl::string_view lhs) -> bool {
533
0
        return lhs.size() >= rhs.size() && lhs.substr(0, rhs.size()) == rhs;
534
0
      },
535
0
      [&rhs](const absl::Cord& lhs) -> bool { return lhs.StartsWith(rhs); }));
536
0
}
537
538
1.18k
inline bool ByteString::StartsWith(const ByteString& rhs) const {
539
1.18k
  return rhs.Visit(absl::Overload(
540
1.18k
      [this](absl::string_view rhs) -> bool { return StartsWith(rhs); },
541
1.18k
      [this](const absl::Cord& rhs) -> bool { return StartsWith(rhs); }));
542
1.18k
}
543
544
1.45k
inline bool ByteString::EndsWith(absl::string_view rhs) const {
545
1.45k
  return Visit(absl::Overload(
546
1.45k
      [&rhs](absl::string_view lhs) -> bool {
547
1.45k
        return absl::EndsWith(lhs, rhs);
548
1.45k
      },
549
1.45k
      [&rhs](const absl::Cord& lhs) -> bool { return lhs.EndsWith(rhs); }));
550
1.45k
}
551
552
0
inline bool ByteString::EndsWith(const absl::Cord& rhs) const {
553
0
  return Visit(absl::Overload(
554
0
      [&rhs](absl::string_view lhs) -> bool {
555
0
        return lhs.size() >= rhs.size() &&
556
0
               lhs.substr(lhs.size() - rhs.size()) == rhs;
557
0
      },
558
0
      [&rhs](const absl::Cord& lhs) -> bool { return lhs.EndsWith(rhs); }));
559
0
}
560
561
1.45k
inline bool ByteString::EndsWith(const ByteString& rhs) const {
562
1.45k
  return rhs.Visit(absl::Overload(
563
1.45k
      [this](absl::string_view rhs) -> bool { return EndsWith(rhs); },
564
1.45k
      [this](const absl::Cord& rhs) -> bool { return EndsWith(rhs); }));
565
1.45k
}
566
567
inline absl::optional<size_t> ByteString::Find(const ByteString& needle,
568
0
                                               size_t pos) const {
569
0
  return needle.Visit(absl::Overload(
570
0
      [this, pos](absl::string_view rhs) -> absl::optional<size_t> {
571
0
        return Find(rhs, pos);
572
0
      },
573
0
      [this, pos](const absl::Cord& rhs) -> absl::optional<size_t> {
574
0
        return Find(rhs, pos);
575
0
      }));
576
0
}
577
578
32.8k
inline bool operator==(const ByteString& lhs, const ByteString& rhs) {
579
32.8k
  return lhs.Equals(rhs);
580
32.8k
}
581
582
0
inline bool operator==(const ByteString& lhs, absl::string_view rhs) {
583
0
  return lhs.Equals(rhs);
584
0
}
585
586
0
inline bool operator==(absl::string_view lhs, const ByteString& rhs) {
587
0
  return rhs.Equals(lhs);
588
0
}
589
590
0
inline bool operator==(const ByteString& lhs, const absl::Cord& rhs) {
591
0
  return lhs.Equals(rhs);
592
0
}
593
594
0
inline bool operator==(const absl::Cord& lhs, const ByteString& rhs) {
595
0
  return rhs.Equals(lhs);
596
0
}
597
598
0
inline bool operator!=(const ByteString& lhs, const ByteString& rhs) {
599
0
  return !operator==(lhs, rhs);
600
0
}
601
602
0
inline bool operator!=(const ByteString& lhs, absl::string_view rhs) {
603
0
  return !operator==(lhs, rhs);
604
0
}
605
606
0
inline bool operator!=(absl::string_view lhs, const ByteString& rhs) {
607
0
  return !operator==(lhs, rhs);
608
0
}
609
610
0
inline bool operator!=(const ByteString& lhs, const absl::Cord& rhs) {
611
0
  return !operator==(lhs, rhs);
612
0
}
613
614
0
inline bool operator!=(const absl::Cord& lhs, const ByteString& rhs) {
615
0
  return !operator==(lhs, rhs);
616
0
}
617
618
0
inline bool operator<(const ByteString& lhs, const ByteString& rhs) {
619
0
  return lhs.Compare(rhs) < 0;
620
0
}
621
622
0
inline bool operator<(const ByteString& lhs, absl::string_view rhs) {
623
0
  return lhs.Compare(rhs) < 0;
624
0
}
625
626
0
inline bool operator<(absl::string_view lhs, const ByteString& rhs) {
627
0
  return -rhs.Compare(lhs) < 0;
628
0
}
629
630
0
inline bool operator<(const ByteString& lhs, const absl::Cord& rhs) {
631
0
  return lhs.Compare(rhs) < 0;
632
0
}
633
634
0
inline bool operator<(const absl::Cord& lhs, const ByteString& rhs) {
635
0
  return -rhs.Compare(lhs) < 0;
636
0
}
637
638
0
inline bool operator<=(const ByteString& lhs, const ByteString& rhs) {
639
0
  return lhs.Compare(rhs) <= 0;
640
0
}
641
642
0
inline bool operator<=(const ByteString& lhs, absl::string_view rhs) {
643
0
  return lhs.Compare(rhs) <= 0;
644
0
}
645
646
0
inline bool operator<=(absl::string_view lhs, const ByteString& rhs) {
647
0
  return -rhs.Compare(lhs) <= 0;
648
0
}
649
650
0
inline bool operator<=(const ByteString& lhs, const absl::Cord& rhs) {
651
0
  return lhs.Compare(rhs) <= 0;
652
0
}
653
654
0
inline bool operator<=(const absl::Cord& lhs, const ByteString& rhs) {
655
0
  return -rhs.Compare(lhs) <= 0;
656
0
}
657
658
0
inline bool operator>(const ByteString& lhs, const ByteString& rhs) {
659
0
  return lhs.Compare(rhs) > 0;
660
0
}
661
662
0
inline bool operator>(const ByteString& lhs, absl::string_view rhs) {
663
0
  return lhs.Compare(rhs) > 0;
664
0
}
665
666
0
inline bool operator>(absl::string_view lhs, const ByteString& rhs) {
667
0
  return -rhs.Compare(lhs) > 0;
668
0
}
669
670
0
inline bool operator>(const ByteString& lhs, const absl::Cord& rhs) {
671
0
  return lhs.Compare(rhs) > 0;
672
0
}
673
674
0
inline bool operator>(const absl::Cord& lhs, const ByteString& rhs) {
675
0
  return -rhs.Compare(lhs) > 0;
676
0
}
677
678
0
inline bool operator>=(const ByteString& lhs, const ByteString& rhs) {
679
0
  return lhs.Compare(rhs) >= 0;
680
0
}
681
682
0
inline bool operator>=(const ByteString& lhs, absl::string_view rhs) {
683
0
  return lhs.Compare(rhs) >= 0;
684
0
}
685
686
0
inline bool operator>=(absl::string_view lhs, const ByteString& rhs) {
687
0
  return -rhs.Compare(lhs) >= 0;
688
0
}
689
690
0
inline bool operator>=(const ByteString& lhs, const absl::Cord& rhs) {
691
0
  return lhs.Compare(rhs) >= 0;
692
0
}
693
694
0
inline bool operator>=(const absl::Cord& lhs, const ByteString& rhs) {
695
0
  return -rhs.Compare(lhs) >= 0;
696
0
}
697
698
}  // namespace common_internal
699
700
}  // namespace cel
701
702
#endif  // THIRD_PARTY_CEL_CPP_COMMON_INTERNAL_BYTE_STRING_H_