grpc
third_party
boringssl-with-bazel
src
include
openssl
boringssl-with-bazel/src/include/openssl/span.h
Go to the documentation of this file.
1
/* Copyright (c) 2017, Google Inc.
2
*
3
* Permission to use, copy, modify, and/or distribute this software for any
4
* purpose with or without fee is hereby granted, provided that the above
5
* copyright notice and this permission notice appear in all copies.
6
*
7
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
14
15
#ifndef OPENSSL_HEADER_SSL_SPAN_H
16
#define OPENSSL_HEADER_SSL_SPAN_H
17
18
#include <
openssl/base.h
>
19
20
#if !defined(BORINGSSL_NO_CXX)
21
22
extern
"C++"
{
23
24
#include <stdlib.h>
25
26
#include <algorithm>
27
#include <type_traits>
28
29
BSSL_NAMESPACE_BEGIN
30
31
template
<
typename
T>
32
class
Span
;
33
34
namespace
internal
{
35
template
<
typename
T>
36
class
SpanBase
{
37
// Put comparison operator implementations into a base class with const T, so
38
// they can be used with any type that implicitly converts into a Span.
39
static_assert(
std::is_const<T>::value
,
40
"Span<T> must be derived from SpanBase<const T>"
);
41
42
friend
bool
operator==
(
Span<T>
lhs,
Span<T>
rhs) {
43
// MSVC issues warning C4996 because std::equal is unsafe. The pragma to
44
// suppress the warning mysteriously has no effect, hence this
45
// implementation. See
46
// https://msdn.microsoft.com/en-us/library/aa985974.aspx.
47
if
(lhs.
size
() != rhs.
size
()) {
48
return
false
;
49
}
50
for
(
T
*l = lhs.
begin
(), *
r
= rhs.
begin
(); l != lhs.
end
() &&
r
!= rhs.
end
();
51
++l, ++
r
) {
52
if
(*l != *
r
) {
53
return
false
;
54
}
55
}
56
return
true
;
57
}
58
59
friend
bool
operator!=
(
Span<T>
lhs,
Span<T>
rhs) {
return
!(lhs == rhs); }
60
};
61
}
// namespace internal
62
63
// A Span<T> is a non-owning reference to a contiguous array of objects of type
64
// |T|. Conceptually, a Span is a simple a pointer to |T| and a count of
65
// elements accessible via that pointer. The elements referenced by the Span can
66
// be mutated if |T| is mutable.
67
//
68
// A Span can be constructed from container types implementing |data()| and
69
// |size()| methods. If |T| is constant, construction from a container type is
70
// implicit. This allows writing methods that accept data from some unspecified
71
// container type:
72
//
73
// // Foo views data referenced by v.
74
// void Foo(bssl::Span<const uint8_t> v) { ... }
75
//
76
// std::vector<uint8_t> vec;
77
// Foo(vec);
78
//
79
// For mutable Spans, conversion is explicit:
80
//
81
// // FooMutate mutates data referenced by v.
82
// void FooMutate(bssl::Span<uint8_t> v) { ... }
83
//
84
// FooMutate(bssl::Span<uint8_t>(vec));
85
//
86
// You can also use the |MakeSpan| and |MakeConstSpan| factory methods to
87
// construct Spans in order to deduce the type of the Span automatically.
88
//
89
// FooMutate(bssl::MakeSpan(vec));
90
//
91
// Note that Spans have value type sematics. They are cheap to construct and
92
// copy, and should be passed by value whenever a method would otherwise accept
93
// a reference or pointer to a container or array.
94
template
<
typename
T>
95
class
Span
:
private
internal::SpanBase
<const T> {
96
private
:
97
static
const
size_t
npos
=
static_cast<
size_t
>
(-1);
98
99
public
:
100
constexpr
Span
() :
Span
(nullptr, 0) {}
101
constexpr
Span
(
T
*
ptr
,
size_t
len
) :
data_
(
ptr
),
size_
(
len
) {}
102
103
template
<
size_t
N>
104
constexpr
Span
(
T
(&
array
)[
N
]) :
Span
(
array
,
N
) {}
105
106
template
<
107
typename
C
,
108
// TODO(davidben): Switch everything to std::enable_if_t when we remove
109
// support for MSVC 2015. Although we could write our own enable_if_t and
110
// MSVC 2015 has std::enable_if_t anyway, MSVC 2015's SFINAE
111
// implementation is problematic and does not work below unless we write
112
// the ::type at use.
113
//
114
// TODO(davidben): Move this and the identical copy below into an
115
// EnableIfContainer alias when we drop MSVC 2015 support. MSVC 2015's
116
// SFINAE support cannot handle type aliases.
117
typename
=
typename
std::enable_if<
118
std::is_convertible<decltype(std::declval<C>().data()),
T
*>::
value
&&
119
std::is_integral<decltype(std::declval<C>().size())>::
value
>::
type
,
120
typename
=
typename
std::enable_if<
std::is_const<T>::value
,
C
>::
type
>
121
Span
(
const
C
&
container
) :
data_
(
container
.data()),
size_
(
container
.size()) {}
122
123
template
<
124
typename
C
,
125
typename
=
typename
std::enable_if<
126
std::is_convertible<decltype(std::declval<C>().data()),
T
*>::
value
&&
127
std::is_integral<decltype(std::declval<C>().size())>::
value
>::
type
,
128
typename
=
typename
std::enable_if<!
std::is_const<T>::value
,
C
>::
type
>
129
explicit
Span
(
C
&
container
)
130
:
data_
(
container
.data()),
size_
(
container
.size()) {}
131
132
T
*
data
()
const
{
return
data_
; }
133
size_t
size
()
const
{
return
size_
; }
134
bool
empty
()
const
{
return
size_
== 0; }
135
136
T
*
begin
()
const
{
return
data_
; }
137
const
T
*
cbegin
()
const
{
return
data_
; }
138
T
*
end
()
const
{
return
data_
+
size_
; }
139
const
T
*
cend
()
const
{
return
end
(); }
140
141
T
&
front
()
const
{
142
if
(
size_
== 0) {
143
abort();
144
}
145
return
data_
[0];
146
}
147
T
&
back
()
const
{
148
if
(
size_
== 0) {
149
abort();
150
}
151
return
data_
[
size_
- 1];
152
}
153
154
T
&
operator[]
(
size_t
i
)
const
{
155
if
(
i
>=
size_
) {
156
abort();
157
}
158
return
data_
[
i
];
159
}
160
T
&
at
(
size_t
i
)
const
{
return
(*
this
)[
i
]; }
161
162
Span
subspan
(
size_t
pos
= 0,
size_t
len
=
npos
)
const
{
163
if
(
pos
>
size_
) {
164
// absl::Span throws an exception here. Note std::span and Chromium
165
// base::span additionally forbid pos + len being out of range, with a
166
// special case at npos/dynamic_extent, while absl::Span::subspan clips
167
// the span. For now, we align with absl::Span in case we switch to it in
168
// the future.
169
abort();
170
}
171
return
Span
(
data_
+
pos
,
std::min
(
size_
-
pos
,
len
));
172
}
173
174
Span
first
(
size_t
len
) {
175
if
(
len
>
size_
) {
176
abort();
177
}
178
return
Span
(
data_
,
len
);
179
}
180
181
Span
last
(
size_t
len
) {
182
if
(
len
>
size_
) {
183
abort();
184
}
185
return
Span
(
data_
+
size_
-
len
,
len
);
186
}
187
188
private
:
189
T
*
data_
;
190
size_t
size_
;
191
};
192
193
template
<
typename
T>
194
const
size_t
Span<T>::npos
;
195
196
template
<
typename
T>
197
Span<T>
MakeSpan
(
T
*
ptr
,
size_t
size
) {
198
return
Span<T>
(
ptr
,
size
);
199
}
200
201
template
<
typename
C>
202
auto
MakeSpan
(
C
&
c
) -> decltype(
MakeSpan
(
c
.data(),
c
.size())) {
203
return
MakeSpan
(
c
.data(),
c
.size());
204
}
205
206
template
<
typename
T>
207
Span<const T>
MakeConstSpan
(
T
*
ptr
,
size_t
size
) {
208
return
Span<const T>
(
ptr
,
size
);
209
}
210
211
template
<
typename
C>
212
auto
MakeConstSpan
(
const
C
&
c
) -> decltype(
MakeConstSpan
(
c
.data(),
c
.size())) {
213
return
MakeConstSpan
(
c
.data(),
c
.size());
214
}
215
216
BSSL_NAMESPACE_END
217
218
}
// extern C++
219
220
#endif // !defined(BORINGSSL_NO_CXX)
221
222
#endif // OPENSSL_HEADER_SSL_SPAN_H
ptr
char * ptr
Definition:
abseil-cpp/absl/base/internal/low_level_alloc_test.cc:45
Span::subspan
Span subspan(size_t pos=0, size_t len=npos) const
Definition:
boringssl-with-bazel/src/include/openssl/span.h:162
Span::size
size_t size() const
Definition:
boringssl-with-bazel/src/include/openssl/span.h:133
Span::last
Span last(size_t len)
Definition:
boringssl-with-bazel/src/include/openssl/span.h:181
pos
int pos
Definition:
libuv/docs/code/tty-gravity/main.c:11
internal::SpanBase::operator!=
friend bool operator!=(Span< T > lhs, Span< T > rhs)
Definition:
boringssl-with-bazel/src/include/openssl/span.h:59
internal::SpanBase::operator==
friend bool operator==(Span< T > lhs, Span< T > rhs)
Definition:
boringssl-with-bazel/src/include/openssl/span.h:42
C
#define C(x)
Definition:
abseil-cpp/absl/hash/internal/city_test.cc:49
Span::at
T & at(size_t i) const
Definition:
boringssl-with-bazel/src/include/openssl/span.h:160
Span::end
T * end() const
Definition:
boringssl-with-bazel/src/include/openssl/span.h:138
Span::cbegin
const T * cbegin() const
Definition:
boringssl-with-bazel/src/include/openssl/span.h:137
Span::Span
constexpr Span(T *ptr, size_t len)
Definition:
boringssl-with-bazel/src/include/openssl/span.h:101
Span::back
T & back() const
Definition:
boringssl-with-bazel/src/include/openssl/span.h:147
Span::Span
constexpr Span(T(&array)[N])
Definition:
boringssl-with-bazel/src/include/openssl/span.h:104
Span::npos
static const size_t npos
Definition:
boringssl-with-bazel/src/include/openssl/span.h:97
MakeConstSpan
Span< const T > MakeConstSpan(T *ptr, size_t size)
Definition:
boringssl-with-bazel/src/include/openssl/span.h:207
T
#define T(upbtypeconst, upbtype, ctype, default_value)
base.h
Span::Span
Span(C &container)
Definition:
boringssl-with-bazel/src/include/openssl/span.h:129
Span::cend
const T * cend() const
Definition:
boringssl-with-bazel/src/include/openssl/span.h:139
c
void c(T a)
Definition:
miscompile_with_no_unique_address_test.cc:40
Span::size_
size_t size_
Definition:
boringssl-with-bazel/src/include/openssl/span.h:190
array
Definition:
undname.c:101
Span::empty
bool empty() const
Definition:
boringssl-with-bazel/src/include/openssl/span.h:134
BSSL_NAMESPACE_END
#define BSSL_NAMESPACE_END
Definition:
base.h:480
Span::front
T & front() const
Definition:
boringssl-with-bazel/src/include/openssl/span.h:141
MakeSpan
Span< T > MakeSpan(T *ptr, size_t size)
Definition:
boringssl-with-bazel/src/include/openssl/span.h:197
Span::Span
constexpr Span()
Definition:
boringssl-with-bazel/src/include/openssl/span.h:100
Span::first
Span first(size_t len)
Definition:
boringssl-with-bazel/src/include/openssl/span.h:174
min
#define min(a, b)
Definition:
qsort.h:83
Span
Definition:
boringssl-with-bazel/src/include/openssl/span.h:32
Span::operator[]
T & operator[](size_t i) const
Definition:
boringssl-with-bazel/src/include/openssl/span.h:154
internal::SpanBase
Definition:
boringssl-with-bazel/src/include/openssl/span.h:36
value
const char * value
Definition:
hpack_parser_table.cc:165
Span::begin
T * begin() const
Definition:
boringssl-with-bazel/src/include/openssl/span.h:136
BSSL_NAMESPACE_BEGIN
Definition:
trust_token_test.cc:45
N
#define N
Definition:
sync_test.cc:37
Span::Span
Span(const C &container)
Definition:
boringssl-with-bazel/src/include/openssl/span.h:121
fix_build_deps.r
r
Definition:
fix_build_deps.py:491
internal
Definition:
benchmark/test/output_test_helper.cc:20
Span::data
T * data() const
Definition:
boringssl-with-bazel/src/include/openssl/span.h:132
asyncio_get_stats.type
type
Definition:
asyncio_get_stats.py:37
len
int len
Definition:
abseil-cpp/absl/base/internal/low_level_alloc_test.cc:46
size
voidpf void uLong size
Definition:
bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
Span::data_
T * data_
Definition:
boringssl-with-bazel/src/include/openssl/span.h:189
container
static struct async_container * container
Definition:
benchmark-million-async.c:33
i
uint64_t i
Definition:
abseil-cpp/absl/container/btree_benchmark.cc:230
grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:14