5#ifndef CORE_FXCRT_SPAN_H_
6#define CORE_FXCRT_SPAN_H_
15#include "core/fxcrt/check.h"
16#include "core/fxcrt/compiler_specific.h"
17#include "core/fxcrt/unowned_ptr_exclusion.h"
48template <
typename T, size_t N>
54template <
typename From,
typename To>
62template <
typename Container>
64 std::is_integral<
decltype(
std::declval<Container>().size())>;
66template <
typename From,
typename To>
190template <
typename T, size_t Extent,
typename InternalPtr>
202 constexpr span()
noexcept =
default;
211 constexpr span(T (&array)[N])
noexcept :
span(array, N) {
212 static_assert(Extent == dynamic_extent || Extent == N);
216 constexpr span(
std::array<T, N>& array)
noexcept :
span(array.data(), N) {
217 static_assert(Extent == dynamic_extent || Extent == N);
221 constexpr span(
const std::array<std::remove_cv_t<T>, N>& array)
noexcept
222 :
span(array.data(), N) {
223 static_assert(Extent == dynamic_extent || Extent == N);
230#if defined(ADDRESS_SANITIZER) && defined(PDF_USE_PARTITION_ALLOC)
236 template <
typename Container,
238 constexpr span(Container& container)
239 :
span(container.data(), container.size()) {}
245 span(
const Container& container) :
span(container.data(), container.size()) {}
247 constexpr span(
const span& other)
noexcept =
default;
251 template <
typename U,
256 :
span(other.data(), other.size()) {}
259 if (
this != &other) {
268 template <size_t Count>
273 static_assert(Extent == dynamic_extent || Count <= Extent);
277 CHECK(count <= size_);
282 template <size_t Count>
287 static_assert(Extent == dynamic_extent || Count <= Extent);
291 CHECK(count <= size_);
293 span(
static_cast<T*>(data_) + (size_ - count), count));
296 template <size_t Offset, size_t Count = dynamic_extent>
301 static_assert(Extent == dynamic_extent || Count == dynamic_extent ||
302 Offset + Count <= Extent);
303 return subspan(Offset, Count);
305 const span subspan(size_t pos, size_t count = dynamic_extent)
const {
307 CHECK(count == dynamic_extent || count <= size_ - pos);
310 count == dynamic_extent ? size_ - pos : count));
316 constexpr bool empty()
const noexcept {
return size_ == 0; }
320 CHECK(index < size_);
324 constexpr T&
front()
const noexcept {
329 constexpr T&
back()
const noexcept {
334 constexpr T*
data()
const noexcept {
return static_cast<T*>(data_); }
337 constexpr iterator begin()
const noexcept {
return static_cast<T*>(data_); }
360 template <
typename U>
363 InternalPtr data_ =
nullptr;
373template <
typename T, size_t N>
375 return span<T>(array);
378template <
typename T, size_t N>
380 return span<T>(array);
383template <
typename Container,
384 typename T =
typename Container::value_type,
387 return span<T>(container);
392 typename T =
typename std::add_const<
typename Container::value_type>::type,
395 return span<T>(container);
399template <
typename T, size_t N,
typename P>
403 make_span(
reinterpret_cast<
const uint8_t*>(s.data()), s.size_bytes()));
413 make_span(
reinterpret_cast<uint8_t*>(s.data()), s.size_bytes()));
416template <
typename T, size_t N,
typename P>
420 make_span(
reinterpret_cast<
const char*>(s.data()), s.size_bytes()));
430 make_span(
reinterpret_cast<
char*>(s.data()), s.size_bytes()));
447 const T& single_object)
noexcept {
448 return as_bytes(span_from_ref(single_object));
452 return as_writable_bytes(span_from_ref(single_object));
462 return as_bytes(make_span(arg));
466 return as_bytes(make_span(arg));
476 return as_writable_bytes(make_span(arg));
constexpr span(T(&array)[N]) noexcept
constexpr reverse_iterator rend() const noexcept
constexpr reverse_iterator rbegin() const noexcept
constexpr const_reverse_iterator crend() const noexcept
std::reverse_iterator< iterator > reverse_iterator
const span first(size_t count) const
typename std::remove_cv< T >::type value_type
span & operator=(const span &other) noexcept
constexpr const_iterator cbegin() const noexcept
constexpr const_iterator cend() const noexcept
constexpr const_reverse_iterator crbegin() const noexcept
const span last(size_t count) const
constexpr bool empty() const noexcept
constexpr size_t size() const noexcept
constexpr span(Container &container)
friend constexpr span< U > make_span(U *data, size_t size) noexcept
std::reverse_iterator< const_iterator > const_reverse_iterator
const span subspan(size_t pos, size_t count=dynamic_extent) const
constexpr iterator begin() const noexcept
constexpr size_t size_bytes() const noexcept
constexpr span() noexcept=default
span(const Container &container)
constexpr span(std::array< T, N > &array) noexcept
constexpr T & back() const noexcept
constexpr span(const std::array< std::remove_cv_t< T >, N > &array) noexcept
constexpr T * data() const noexcept
constexpr T & front() const noexcept
constexpr span(const span &other) noexcept=default
UNSAFE_BUFFER_USAGE constexpr span(T *data, size_t size) noexcept
constexpr span(const span< U, M, R > &other)
T & operator[](size_t index) const noexcept
constexpr iterator end() const noexcept
#define UNSAFE_BUFFERS(...)
#define UNSAFE_BUFFER_USAGE
void CRYPT_MD5Finish(CRYPT_md5_context *context, pdfium::span< uint8_t, 16 > digest)
#define P(a, b, c, d, k, s, t)
void CRYPT_MD5Generate(pdfium::span< const uint8_t > data, pdfium::span< uint8_t, 16 > digest)
void CRYPT_ArcFourCryptBlock(pdfium::span< uint8_t > data, pdfium::span< const uint8_t > key)
void CRYPT_ArcFourSetup(CRYPT_rc4_context *context, pdfium::span< const uint8_t > key)
void CRYPT_MD5Update(CRYPT_md5_context *context, pdfium::span< const uint8_t > data)
void CRYPT_ArcFourCrypt(CRYPT_rc4_context *context, pdfium::span< uint8_t > data)
CRYPT_md5_context CRYPT_MD5Start()
void CRYPT_AESEncrypt(CRYPT_aes_context *ctx, pdfium::span< uint8_t > dest, pdfium::span< const uint8_t > src)
void CRYPT_AESSetIV(CRYPT_aes_context *ctx, const uint8_t *iv)
void CRYPT_AESDecrypt(CRYPT_aes_context *ctx, uint8_t *dest, const uint8_t *src, uint32_t size)
void CRYPT_AESSetKey(CRYPT_aes_context *ctx, const uint8_t *key, uint32_t keylen)
std::is_integral< decltype(std::declval< Container >().size())> ContainerHasIntegralSize
IsSpanImpl< typename std::decay< T >::type > IsSpan
std::is_convertible< From *, To * > IsLegalSpanConversion
IsStdArrayImpl< typename std::decay< T >::type > IsStdArray
constexpr span< T > make_span(T(&array)[N]) noexcept
span< char > as_writable_chars(span< T, N, P > s) noexcept
span< const uint8_t > as_bytes(span< T, N, P > s) noexcept
constexpr size_t dynamic_extent
static constexpr span< T > span_from_ref(T &single_object) noexcept
static constexpr span< const uint8_t > byte_span_from_ref(const T &single_object) noexcept
UNSAFE_BUFFER_USAGE constexpr span< T > make_span(T *data, size_t size) noexcept
span< const uint8_t > as_byte_span(T &&arg)
span< const char > as_chars(span< T, N, P > s) noexcept
span< const uint8_t > as_byte_span(const T &arg)
UNOWNED_PTR_EXCLUSION T * DefaultSpanInternalPtr
span< uint8_t > as_writable_bytes(span< T, N, P > s) noexcept
constexpr span< T > make_span(std::array< T, N > &array) noexcept
constexpr span< T > make_span(Container &container)
constexpr span< uint8_t > as_writable_byte_span(T &&arg)
static constexpr span< uint8_t > byte_span_from_ref(T &single_object) noexcept
constexpr span< T > make_span(const Container &container)
std::array< uint32_t, kMaxNb > iv
std::array< uint32_t, kSchedSize > invkeysched
static constexpr int kMaxNr
static constexpr int kSchedSize
static constexpr int kMaxNb
std::array< uint32_t, kSchedSize > keysched
std::array< uint32_t, 4 > state
std::array< uint32_t, 2 > total
std::array< int32_t, kPermutationLength > m
static constexpr int32_t kPermutationLength
#define UNOWNED_PTR_EXCLUSION