blob: c2684c46875b7792216832fe9302a67e5a0afb03 [file] [log] [blame]
// Copyright 2026 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CORE_FXCRT_CFX_READ_ONLY_CONTAINER_STREAM_H_
#define CORE_FXCRT_CFX_READ_ONLY_CONTAINER_STREAM_H_
#include <stdint.h>
#include <memory>
#include <utility>
#include "build/build_config.h"
#include "core/fxcrt/bytestring.h"
#include "core/fxcrt/cfx_read_only_span_stream.h"
#include "core/fxcrt/data_vector.h"
#include "core/fxcrt/fixed_size_data_vector.h"
#include "core/fxcrt/mapped_data_bytes.h"
#include "core/fxcrt/retain_ptr.h"
#include "core/fxcrt/span.h"
template <typename Container>
concept HasSpanMethod = requires(const Container& t) {
{ t.span() };
};
template <typename Container>
concept HasPtrSpanMethod = requires(const Container& t) {
{ t->span() };
};
template <typename Container>
class CFX_ReadOnlyContainerStream final : public CFX_ReadOnlySpanStream {
public:
CONSTRUCT_VIA_MAKE_RETAIN;
private:
explicit CFX_ReadOnlyContainerStream(Container data)
requires(HasPtrSpanMethod<Container>)
: CFX_ReadOnlySpanStream(pdfium::as_bytes(data->span())),
data_(std::move(data)) {}
explicit CFX_ReadOnlyContainerStream(Container data)
requires(HasSpanMethod<Container>)
: CFX_ReadOnlySpanStream(pdfium::as_bytes(data.span())),
data_(std::move(data)) {}
explicit CFX_ReadOnlyContainerStream(Container data)
requires(!HasSpanMethod<Container> && !HasPtrSpanMethod<Container>)
: CFX_ReadOnlySpanStream(pdfium::as_byte_span(data)),
data_(std::move(data)) {}
~CFX_ReadOnlyContainerStream() override {
// Clear superclass's span before deleting container.
span_ = {};
}
const Container data_;
};
extern template class CFX_ReadOnlyContainerStream<DataVector<uint8_t>>;
extern template class CFX_ReadOnlyContainerStream<FixedSizeDataVector<uint8_t>>;
extern template class CFX_ReadOnlyContainerStream<ByteString>;
using CFX_ReadOnlyDataVectorStream =
CFX_ReadOnlyContainerStream<DataVector<uint8_t>>;
using CFX_ReadOnlyFixedSizeDataVectorStream =
CFX_ReadOnlyContainerStream<FixedSizeDataVector<uint8_t>>;
using CFX_ReadOnlyByteStringStream = CFX_ReadOnlyContainerStream<ByteString>;
#if BUILDFLAG(IS_POSIX)
extern template class CFX_ReadOnlyContainerStream<
std::unique_ptr<MappedDataBytes>>;
using CFX_ReadOnlyMappedDataBytesStream =
CFX_ReadOnlyContainerStream<std::unique_ptr<MappedDataBytes>>;
#endif // BUILDFLAG(IS_POSIX)
#endif // CORE_FXCRT_CFX_READ_ONLY_CONTAINER_STREAM_H_