9#include "PdfDataContainer.h"
14using PdfArrayList = std::vector<PdfObject>;
19template <
typename TObject,
typename TListIterator>
35 using difference_type =
void;
38 using reference =
void;
39 using iterator_category = std::forward_iterator_tag;
45 Iterator(
const Iterator&) =
default;
46 Iterator& operator=(
const Iterator&) =
default;
47 bool operator==(
const Iterator&
rhs)
const;
48 bool operator!=(
const Iterator&
rhs)
const;
49 Iterator& operator++();
50 Iterator operator++(
int);
51 value_type operator*();
52 value_type operator->();
61 Iterator begin()
const;
88 using iterator = PdfArrayList::iterator;
89 using const_iterator = PdfArrayList::const_iterator;
90 using reverse_iterator = PdfArrayList::reverse_iterator;
91 using const_reverse_iterator = PdfArrayList::const_reverse_iterator;
104 template <
typename TReal,
typename = std::enable_if_t<std::is_
floating_po
int_v<TReal>>>
107 template <
typename TInt,
typename = std::enable_if_t<std::is_
integral_v<TInt>>>
122 unsigned GetSize()
const;
127 bool IsEmpty()
const;
136 template <
typename T>
137 const typename ObjectAdapter<T>::TRet GetAtAs(
unsigned idx)
const;
139 template <
typename T>
140 typename ObjectAdapter<T>::TRet GetAtAs(
unsigned idx);
142 template <
typename T>
143 const typename ObjectAdapter<T>::TRet GetAtAsSafe(
unsigned idx,
const std::common_type_t<T>&
fallback = { })
const;
145 template <
typename T>
146 typename ObjectAdapter<T>::TRet GetAtAsSafe(
unsigned idx,
const std::common_type_t<T>&
fallback = { });
148 template <
typename T>
149 bool TryGetAtAs(
unsigned idx, T& value)
const;
151 template <
typename T>
152 bool TryGetAtAs(
unsigned idx, T& value);
169 template <
typename T>
170 const typename ObjectAdapter<T>::TRet FindAtAs(
unsigned idx)
const;
172 template <
typename T>
173 typename ObjectAdapter<T>::TRet FindAtAs(
unsigned idx);
175 template <
typename T>
176 const typename ObjectAdapter<T>::TRet FindAtAsSafe(
unsigned idx,
const std::common_type_t<T>&
fallback = { })
const;
178 template <
typename T>
179 typename ObjectAdapter<T>::TRet FindAtAsSafe(
unsigned idx,
const std::common_type_t<T>&
fallback = { });
181 template <
typename T>
182 bool TryFindAtAs(
unsigned idx, T& value)
const;
184 template <
typename T>
185 bool TryFindAtAs(
unsigned idx, T& value);
187 void RemoveAt(
unsigned idx);
216 void Reserve(
unsigned n);
243 const_iterator begin()
const;
257 const_iterator end()
const;
264 reverse_iterator rbegin();
271 const_reverse_iterator rbegin()
const;
278 reverse_iterator rend();
285 const_reverse_iterator rend()
const;
287 void resize(
size_t size);
289 void reserve(
size_t size);
294 template<
typename InputIterator>
297 void erase(
const iterator&
pos);
298 void erase(
const iterator&
first,
const iterator&
last);
329 void resetDirty()
override;
330 void setChildrenParent()
override;
345 PdfArrayList m_Objects;
348template<
typename TReal,
typename>
353 for (
unsigned i = 0; i <
reals.size(); i++)
359template<
typename TInt,
typename>
360PdfArray PdfArray::FromNumbers(cspan<TInt> numbers)
363 arr.reserve(numbers.size());
364 for (
unsigned i = 0; i < numbers.size(); i++)
365 arr.Add(PdfObject(
static_cast<int64_t
>(numbers[i])));
371const typename ObjectAdapter<T>::TRet PdfArray::GetAtAs(
unsigned idx)
const
373 return ObjectAdapter<T>::Get(
const_cast<const PdfObject&
>(getAt(idx)));
377typename ObjectAdapter<T>::TRet PdfArray::GetAtAs(
unsigned idx)
379 return ObjectAdapter<T>::Get(getAt(idx));
383const typename ObjectAdapter<T>::TRet PdfArray::GetAtAsSafe(
unsigned idx,
const std::common_type_t<T>& fallback)
const
385 return ObjectAdapter<T>::Get(
const_cast<const PdfObject&
>(getAt(idx)), fallback);
389typename ObjectAdapter<T>::TRet PdfArray::GetAtAsSafe(
unsigned idx,
const std::common_type_t<T>& fallback)
391 return ObjectAdapter<T>::Get(getAt(idx), fallback);
395bool PdfArray::TryGetAtAs(
unsigned idx, T& value)
const
397 if (ObjectAdapter<T>::TryGet(
const_cast<const PdfObject&
>(getAt(idx)), value))
409bool PdfArray::TryGetAtAs(
unsigned idx, T& value)
411 if (ObjectAdapter<T>::TryGet(getAt(idx), value))
423const typename ObjectAdapter<T>::TRet PdfArray::FindAtAs(
unsigned idx)
const
425 return ObjectAdapter<T>::Get(MustFindAt(idx));
429inline typename ObjectAdapter<T>::TRet PdfArray::FindAtAs(
unsigned idx)
431 return ObjectAdapter<T>::Get(MustFindAt(idx));
435const typename ObjectAdapter<T>::TRet PdfArray::FindAtAsSafe(
unsigned idx,
const std::common_type_t<T>& fallback)
const
437 auto obj = findAt(idx);
441 return ObjectAdapter<T>::Get(
const_cast<const PdfObject&
>(*obj), fallback);
445inline typename ObjectAdapter<T>::TRet PdfArray::FindAtAsSafe(
unsigned idx,
const std::common_type_t<T>& fallback)
447 auto obj = findAt(idx);
451 return ObjectAdapter<T>::Get(*obj, fallback);
455bool PdfArray::TryFindAtAs(
unsigned idx, T& value)
const
457 auto obj = findAt(idx);
458 if (obj !=
nullptr && ObjectAdapter<T>::TryGet(
const_cast<const PdfObject&
>(*obj), value))
470inline bool PdfArray::TryFindAtAs(
unsigned idx, T& value)
472 auto obj = findAt(idx);
473 if (obj !=
nullptr && ObjectAdapter<T>::TryGet(*obj, value))
484template<
typename InputIterator>
485void PdfArray::insert(
const PdfArray::iterator& pos,
486 const InputIterator& first,
487 const InputIterator& last)
490 auto document = GetObjectDocument();
491 InputIterator it1 = first;
493 for (; it1 != last; it1++, it2++)
495 it2 = m_Objects.insert(it2, *it1);
496 it2->SetDocument(document);
502template<
typename TObject,
typename TListIterator>
503PdfArrayIndirectIterableBase<TObject, TListIterator>::PdfArrayIndirectIterableBase()
506template<
typename TObject,
typename TListIterator>
507PdfArrayIndirectIterableBase<TObject, TListIterator>::PdfArrayIndirectIterableBase(PdfArray& arr)
508 : PdfIndirectIterableBase(arr), m_arr(&arr) { }
510template<
typename TObject,
typename TListIterator>
511typename PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator PdfArrayIndirectIterableBase<TObject, TListIterator>::begin()
const
513 if (m_arr ==
nullptr)
516 return Iterator(m_arr->begin(), GetObjects());
519template<
typename TObject,
typename TListIterator>
520typename PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator PdfArrayIndirectIterableBase<TObject, TListIterator>::end()
const
522 if (m_arr ==
nullptr)
525 return Iterator(m_arr->end(), GetObjects());
528template<
typename TObject,
typename TListIterator>
529PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::Iterator() : m_objects(nullptr) { }
531template<
typename TObject,
typename TListIterator>
532PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::Iterator(TListIterator&& iterator, PdfIndirectObjectList* objects)
533 : m_iterator(std::move(iterator)), m_objects(objects) { }
535template<
typename TObject,
typename TListIterator>
536bool PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::operator==(
const Iterator& rhs)
const
538 return m_iterator == rhs.m_iterator;
541template<
typename TObject,
typename TListIterator>
542bool PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::operator!=(
const Iterator& rhs)
const
544 return m_iterator != rhs.m_iterator;
547template<
typename TObject,
typename TListIterator>
548typename PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator& PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::operator++()
554template<
typename TObject,
typename TListIterator>
555typename PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::operator++(
int)
562template<
typename TObject,
typename TListIterator>
563typename PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::value_type PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::operator*()
568template<
typename TObject,
typename TListIterator>
569typename PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::value_type PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::operator->()
574template<
typename TObject,
typename TListIterator>
575typename PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::value_type PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::resolve()
577 TObject& robj = *m_iterator;
578 TObject* indirectobj;
580 if (m_objects !=
nullptr
581 && robj.TryGetReference(ref)
583 && (indirectobj = GetObject(*m_objects, ref)) !=
nullptr)
This file should be included as the FIRST file in every header of PoDoFo lib.
An interface for writing blocks of data to a data source.
Definition OutputStream.h:16
Helper class to iterate through array indirect objects.
Definition PdfArray.h:21
This class represents a PdfArray Use it for all arrays that are written to a PDF file.
Definition PdfArray.h:79
PdfArray()
Create an empty array.
Definition PdfArray.cpp:13
A PdfDataProvider object with a PdfObject owner, specialized in holding objects.
Definition PdfDataContainer.h:20
A list of PdfObjects that constitutes the indirect object list of the document The PdfParser will rea...
Definition PdfIndirectObjectList.h:29
This class represents a PDF indirect Object in memory.
Definition PdfObject.h:33
A simple tokenizer for PDF files and PDF content streams.
Definition PdfTokenizer.h:34
Convenient type for char array storage and/or buffer with std::string compatibility.
Definition basetypes.h:35
All classes, functions, types and enums of PoDoFo are members of these namespace.
Definition basetypes.h:13
PdfWriteFlags
Specify additional options for writing the PDF.
Definition PdfDeclarations.h:147