7#ifndef CORE_FPDFAPI_PARSER_CPDF_ARRAY_H_
8#define CORE_FPDFAPI_PARSER_CPDF_ARRAY_H_
18#include "core/fpdfapi/parser/cpdf_indirect_object_holder.h"
19#include "core/fpdfapi/parser/cpdf_object.h"
20#include "core/fxcrt/check.h"
21#include "core/fxcrt/fx_coordinates.h"
22#include "core/fxcrt/retain_ptr.h"
40 bool IsEmpty()
const {
return m_Objects.empty(); }
83 template <
typename T,
typename... Args>
86 static_assert(!
std::is_same<T, CPDF_Stream>::value,
87 "Cannot append a CPDF_Stream directly. Add it indirectly as "
88 "a `CPDF_Reference` instead.");
89 return pdfium::WrapRetain(
static_cast<T*>(
90 AppendInternal(
pdfium::MakeRetain<T>(
std::forward<Args>(args)...))));
92 template <
typename T,
typename... Args>
95 return pdfium::WrapRetain(
static_cast<T*>(AppendInternal(
96 pdfium::MakeRetain<T>(m_pPool, std::forward<Args>(args)...))));
98 template <
typename T,
typename... Args>
101 static_assert(!
std::is_same<T, CPDF_Stream>::value,
102 "Cannot set a CPDF_Stream directly. Add it indirectly as a "
103 "`CPDF_Reference` instead.");
104 return pdfium::WrapRetain(
static_cast<T*>(SetAtInternal(
105 index, pdfium::MakeRetain<T>(std::forward<Args>(args)...))));
107 template <
typename T,
typename... Args>
110 return pdfium::WrapRetain(
static_cast<T*>(SetAtInternal(
111 index, pdfium::MakeRetain<T>(m_pPool, std::forward<Args>(args)...))));
113 template <
typename T,
typename... Args>
116 static_assert(!
std::is_same<T, CPDF_Stream>::value,
117 "Cannot insert a CPDF_Stream directly. Add it indirectly as "
118 "a `CPDF_Reference` instead.");
119 return pdfium::WrapRetain(
static_cast<T*>(InsertAtInternal(
120 index, pdfium::MakeRetain<T>(std::forward<Args>(args)...))));
122 template <
typename T,
typename... Args>
125 return pdfium::WrapRetain(
static_cast<T*>(InsertAtInternal(
126 index, pdfium::MakeRetain<T>(m_pPool, std::forward<Args>(args)...))));
156 explicit CPDF_Array(
const WeakPtr<ByteStringPool>& pPool);
160 const CPDF_Object* GetObjectAtInternal(size_t index)
const;
161 CPDF_Object* GetMutableObjectAtInternal(size_t index);
168 std::set<
const CPDF_Object*>* pVisited)
const override;
170 std::vector<RetainPtr<CPDF_Object>> m_Objects;
171 WeakPtr<ByteStringPool> m_pPool;
172 mutable uint32_t m_LockCount = 0;
177 FX_STACK_ALLOCATED();
186 CHECK(m_pArray->IsLocked());
187 return m_pArray->m_Objects.begin();
190 CHECK(m_pArray->IsLocked());
191 return m_pArray->m_Objects.end();
fxcrt::ByteString ByteString
CPDF_ArrayLocker(RetainPtr< CPDF_Array > pArray)
const_iterator begin() const
const_iterator end() const
CPDF_ArrayLocker(const CPDF_Array *pArray)
CPDF_ArrayLocker(RetainPtr< const CPDF_Array > pArray)
void Append(RetainPtr< CPDF_Stream > stream)=delete
bool GetBooleanAt(size_t index, bool bDefault) const
void SetAt(size_t index, RetainPtr< CPDF_Object > object)
RetainPtr< CPDF_Dictionary > GetMutableDictAt(size_t index)
RetainPtr< CPDF_Object > CloneNonCyclic(bool bDirect, std::set< const CPDF_Object * > *pVisited) const override
RetainPtr< const CPDF_Object > GetDirectObjectAt(size_t index) const
RetainPtr< const CPDF_Stream > GetStreamAt(size_t index) const
Type GetType() const override
CPDF_Array * AsMutableArray() override
RetainPtr< const CPDF_Object > GetObjectAt(size_t index) const
RetainPtr< CPDF_Object > GetMutableObjectAt(size_t index)
std::enable_if<!CanInternStrings< T >::value, RetainPtr< T > >::type AppendNew(Args &&... args)
WideString GetUnicodeTextAt(size_t index) const
RetainPtr< CPDF_Array > GetMutableArrayAt(size_t index)
RetainPtr< CPDF_Object > Clone() const override
std::enable_if< CanInternStrings< T >::value, RetainPtr< T > >::type AppendNew(Args &&... args)
RetainPtr< const CPDF_Dictionary > GetDictAt(size_t index) const
std::vector< RetainPtr< CPDF_Object > >::const_iterator const_iterator
std::enable_if<!CanInternStrings< T >::value, RetainPtr< T > >::type InsertNewAt(size_t index, Args &&... args)
RetainPtr< CPDF_Stream > GetMutableStreamAt(size_t index)
bool Contains(const CPDF_Object *pThat) const
void ConvertToIndirectObjectAt(size_t index, CPDF_IndirectObjectHolder *pHolder)
std::optional< size_t > Find(const CPDF_Object *pThat) const
std::enable_if< CanInternStrings< T >::value, RetainPtr< T > >::type InsertNewAt(size_t index, Args &&... args)
std::enable_if<!CanInternStrings< T >::value, RetainPtr< T > >::type SetNewAt(size_t index, Args &&... args)
bool WriteTo(IFX_ArchiveStream *archive, const CPDF_Encryptor *encryptor) const override
RetainPtr< CPDF_Object > GetMutableDirectObjectAt(size_t index)
CFX_Matrix GetMatrix() const
int GetIntegerAt(size_t index) const
void SetAt(size_t index, RetainPtr< CPDF_Stream > stream)=delete
void InsertAt(size_t index, RetainPtr< CPDF_Object > object)
ByteString GetByteStringAt(size_t index) const
std::enable_if< CanInternStrings< T >::value, RetainPtr< T > >::type SetNewAt(size_t index, Args &&... args)
void Append(RetainPtr< CPDF_Object > object)
RetainPtr< const CPDF_String > GetStringAt(size_t index) const
RetainPtr< const CPDF_Array > GetArrayAt(size_t index) const
RetainPtr< const CPDF_Number > GetNumberAt(size_t index) const
CFX_FloatRect GetRect() const
void InsertAt(size_t index, RetainPtr< CPDF_Stream > stream)=delete
void RemoveAt(size_t index)
float GetFloatAt(size_t index) const
CPDF_Creator(CPDF_Document *pDoc, RetainPtr< IFX_RetainableWriteStream > archive)
bool SetFileVersion(int32_t fileVersion)
bool Create(uint32_t flags)
std::map< ByteString, RetainPtr< CPDF_Object >, std::less<> > DictMap
const CPDF_Array * AsArray() const
virtual CPDF_Array * AsMutableArray()
virtual FX_FILESIZE CurrentOffset() const =0
static RetainPtr< IFX_SeekableReadStream > CreateFromFilename(const char *filename)
virtual FX_FILESIZE GetPosition()
virtual bool ReadBlockAtOffset(pdfium::span< uint8_t > buffer, FX_FILESIZE offset)=0
virtual FX_FILESIZE GetSize()=0
bool WriteFilesize(FX_FILESIZE size)
bool WriteByte(uint8_t byte)
bool WriteString(ByteStringView str)
virtual ~IFX_WriteStream()=default
bool WriteDWord(uint32_t i)
virtual bool WriteBlock(pdfium::span< const uint8_t > data)=0
static ByteString Format(const char *pFormat,...)
ByteString & operator=(ByteString &&that) noexcept
UnownedPtr(const UnownedPtr< U > &that)
bool operator==(const UnownedPtr &that) const
operator T*() const noexcept
UnownedPtr(UnownedPtr< U > &&that) noexcept
UnownedPtr & operator=(UnownedPtr< U > &&that) noexcept
constexpr UnownedPtr(const UnownedPtr &that) noexcept=default
constexpr UnownedPtr(T *pObj) noexcept
UnownedPtr & operator=(T *that) noexcept
bool operator==(std::nullptr_t ptr) const
UnownedPtr & operator=(UnownedPtr &&that) noexcept
UnownedPtr & operator=(std::nullptr_t) noexcept
UnownedPtr & operator=(const UnownedPtr< U > &that) noexcept
constexpr UnownedPtr() noexcept=default
bool operator<(const UnownedPtr &that) const
UnownedPtr & operator=(const UnownedPtr &that) noexcept=default
constexpr UnownedPtr(UnownedPtr &&that) noexcept
constexpr UnownedPtr(std::nullptr_t ptr)
CPDF_Array * ToArray(CPDF_Object *obj)
const CPDF_Array * ToArray(const CPDF_Object *obj)
RetainPtr< CPDF_Array > ToArray(RetainPtr< CPDF_Object > obj)
#define FPDFCREATE_INCREMENTAL
#define FPDFCREATE_NO_ORIGINAL
void * FX_Random_MT_Start(uint32_t dwSeed)
void FX_Random_MT_Close(void *pContext)
pdfium::CheckedNumeric< FX_FILESIZE > FX_SAFE_FILESIZE
UnownedPtr< T > WrapUnowned(T *that)
#define CONSTRUCT_VIA_MAKE_RETAIN
fxcrt::ByteStringView ByteStringView
#define UNOWNED_PTR_EXCLUSION
fxcrt::WideString WideString