xref: /aosp_15_r20/external/cronet/base/memory/raw_span.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2023 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_MEMORY_RAW_SPAN_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_MEMORY_RAW_SPAN_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h"
9*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker namespace base {
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker // raw_span<T> is a type that provides the spatial safety of span<T> along
14*6777b538SAndroid Build Coastguard Worker // with the temporal safety of raw_ptr<T>. This is intended to be a safer
15*6777b538SAndroid Build Coastguard Worker // replacement for classes that store pointer + size fields. As is the case
16*6777b538SAndroid Build Coastguard Worker // with raw_ptr<>, raw_span<> should be used for class members only, with
17*6777b538SAndroid Build Coastguard Worker // ordinary span<> used for function arguments and the like. Note that
18*6777b538SAndroid Build Coastguard Worker // raw_span<> will implicitly convert to span<> for ease of use in these
19*6777b538SAndroid Build Coastguard Worker // cases.
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker template <typename T, RawPtrTraits Traits = RawPtrTraits::kEmpty>
22*6777b538SAndroid Build Coastguard Worker using raw_span =
23*6777b538SAndroid Build Coastguard Worker     span<T, dynamic_extent, raw_ptr<T, Traits | AllowPtrArithmetic>>;
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker template <typename T>
ExtractAsDanglingSpan(raw_span<T> & arg)26*6777b538SAndroid Build Coastguard Worker span<T> ExtractAsDanglingSpan(raw_span<T>& arg) {
27*6777b538SAndroid Build Coastguard Worker   span<T> result = std::exchange(arg, raw_span<T>());
28*6777b538SAndroid Build Coastguard Worker   return result;
29*6777b538SAndroid Build Coastguard Worker }
30*6777b538SAndroid Build Coastguard Worker 
31*6777b538SAndroid Build Coastguard Worker }  // namespace base
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker #endif  // BASE_MEMORY_RAW_SPAN_H_
34