11#include "PdfDataContainer.h"
16using PdfArrayList = std::vector<PdfObject>;
21template <
typename TObject,
typename TListIterator>
37 using difference_type =
void;
40 using reference =
void;
41 using iterator_category = std::forward_iterator_tag;
47 Iterator(
const Iterator&) =
default;
48 Iterator& operator=(
const Iterator&) =
default;
49 bool operator==(
const Iterator&
rhs)
const;
50 bool operator!=(
const Iterator&
rhs)
const;
51 Iterator& operator++();
52 Iterator operator++(
int);
53 value_type operator*();
54 value_type operator->();
63 Iterator begin()
const;
90 using iterator = PdfArrayList::iterator;
91 using const_iterator = PdfArrayList::const_iterator;
92 using reverse_iterator = PdfArrayList::reverse_iterator;
93 using const_reverse_iterator = PdfArrayList::const_reverse_iterator;
106 template <
typename TReal,
typename = std::enable_if_t<std::is_
floating_po
int_v<TReal>>>
109 template <
typename TInt,
typename = std::enable_if_t<std::is_
integral_v<TInt>>>
124 unsigned GetSize()
const;
129 bool IsEmpty()
const;
138 template <
typename T>
139 const typename ObjectAdapter<T>::TRet GetAtAs(
unsigned idx)
const;
141 template <
typename T>
142 typename ObjectAdapter<T>::TRet GetAtAs(
unsigned idx);
144 template <
typename T>
145 const typename ObjectAdapter<T>::TRet GetAtAsSafe(
unsigned idx,
const std::common_type_t<T>&
fallback = { })
const;
147 template <
typename T>
148 typename ObjectAdapter<T>::TRet GetAtAsSafe(
unsigned idx,
const std::common_type_t<T>&
fallback = { });
150 template <
typename T>
151 bool TryGetAtAs(
unsigned idx, T& value)
const;
153 template <
typename T>
154 bool TryGetAtAs(
unsigned idx, T& value);
171 template <
typename T>
172 const typename ObjectAdapter<T>::TRet FindAtAs(
unsigned idx)
const;
174 template <
typename T>
175 typename ObjectAdapter<T>::TRet FindAtAs(
unsigned idx);
177 template <
typename T>
178 const typename ObjectAdapter<T>::TRet FindAtAsSafe(
unsigned idx,
const std::common_type_t<T>&
fallback = { })
const;
180 template <
typename T>
181 typename ObjectAdapter<T>::TRet FindAtAsSafe(
unsigned idx,
const std::common_type_t<T>&
fallback = { });
183 template <
typename T>
184 bool TryFindAtAs(
unsigned idx, T& value)
const;
186 template <
typename T>
187 bool TryFindAtAs(
unsigned idx, T& value);
189 void RemoveAt(
unsigned idx);
218 void Reserve(
unsigned n);
245 const_iterator begin()
const;
259 const_iterator end()
const;
266 reverse_iterator rbegin();
273 const_reverse_iterator rbegin()
const;
280 reverse_iterator rend();
287 const_reverse_iterator rend()
const;
289 void resize(
size_t size);
291 void reserve(
size_t size);
296 template<
typename InputIterator>
299 void erase(
const iterator&
pos);
300 void erase(
const iterator&
first,
const iterator&
last);
331 void resetDirty()
override;
332 void setChildrenParent()
override;
347 PdfArrayList m_Objects;
350template<
typename TReal,
typename>
355 for (
unsigned i = 0; i <
reals.size(); i++)
361template<
typename TInt,
typename>
362PdfArray PdfArray::FromNumbers(cspan<TInt> numbers)
365 arr.reserve(numbers.size());
366 for (
unsigned i = 0; i < numbers.size(); i++)
367 arr.Add(PdfObject(
static_cast<int64_t
>(numbers[i])));
373const typename ObjectAdapter<T>::TRet PdfArray::GetAtAs(
unsigned idx)
const
375 return ObjectAdapter<T>::Get(
const_cast<const PdfObject&
>(getAt(idx)));
379typename ObjectAdapter<T>::TRet PdfArray::GetAtAs(
unsigned idx)
381 return ObjectAdapter<T>::Get(getAt(idx));
385const typename ObjectAdapter<T>::TRet PdfArray::GetAtAsSafe(
unsigned idx,
const std::common_type_t<T>& fallback)
const
387 return ObjectAdapter<T>::Get(
const_cast<const PdfObject&
>(getAt(idx)), fallback);
391typename ObjectAdapter<T>::TRet PdfArray::GetAtAsSafe(
unsigned idx,
const std::common_type_t<T>& fallback)
393 return ObjectAdapter<T>::Get(getAt(idx), fallback);
397bool PdfArray::TryGetAtAs(
unsigned idx, T& value)
const
399 if (ObjectAdapter<T>::TryGet(
const_cast<const PdfObject&
>(getAt(idx)), value))
411bool PdfArray::TryGetAtAs(
unsigned idx, T& value)
413 if (ObjectAdapter<T>::TryGet(getAt(idx), value))
425const typename ObjectAdapter<T>::TRet PdfArray::FindAtAs(
unsigned idx)
const
427 return ObjectAdapter<T>::Get(MustFindAt(idx));
431inline typename ObjectAdapter<T>::TRet PdfArray::FindAtAs(
unsigned idx)
433 return ObjectAdapter<T>::Get(MustFindAt(idx));
437const typename ObjectAdapter<T>::TRet PdfArray::FindAtAsSafe(
unsigned idx,
const std::common_type_t<T>& fallback)
const
439 auto obj = findAt(idx);
443 return ObjectAdapter<T>::Get(
const_cast<const PdfObject&
>(*obj), fallback);
447inline typename ObjectAdapter<T>::TRet PdfArray::FindAtAsSafe(
unsigned idx,
const std::common_type_t<T>& fallback)
449 auto obj = findAt(idx);
453 return ObjectAdapter<T>::Get(*obj, fallback);
457bool PdfArray::TryFindAtAs(
unsigned idx, T& value)
const
459 auto obj = findAt(idx);
460 if (obj !=
nullptr && ObjectAdapter<T>::TryGet(
const_cast<const PdfObject&
>(*obj), value))
472inline bool PdfArray::TryFindAtAs(
unsigned idx, T& value)
474 auto obj = findAt(idx);
475 if (obj !=
nullptr && ObjectAdapter<T>::TryGet(*obj, value))
486template<
typename InputIterator>
487void PdfArray::insert(
const PdfArray::iterator& pos,
488 const InputIterator& first,
489 const InputIterator& last)
492 auto document = GetObjectDocument();
493 InputIterator it1 = first;
495 for (; it1 != last; it1++, it2++)
497 it2 = m_Objects.insert(it2, *it1);
498 it2->SetDocument(document);
504template<
typename TObject,
typename TListIterator>
505PdfArrayIndirectIterableBase<TObject, TListIterator>::PdfArrayIndirectIterableBase()
508template<
typename TObject,
typename TListIterator>
509PdfArrayIndirectIterableBase<TObject, TListIterator>::PdfArrayIndirectIterableBase(PdfArray& arr)
510 : PdfIndirectIterableBase(arr), m_arr(&arr) { }
512template<
typename TObject,
typename TListIterator>
513typename PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator PdfArrayIndirectIterableBase<TObject, TListIterator>::begin()
const
515 if (m_arr ==
nullptr)
518 return Iterator(m_arr->begin(), GetObjects());
521template<
typename TObject,
typename TListIterator>
522typename PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator PdfArrayIndirectIterableBase<TObject, TListIterator>::end()
const
524 if (m_arr ==
nullptr)
527 return Iterator(m_arr->end(), GetObjects());
530template<
typename TObject,
typename TListIterator>
531PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::Iterator() : m_objects(nullptr) { }
533template<
typename TObject,
typename TListIterator>
534PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::Iterator(TListIterator&& iterator, PdfIndirectObjectList* objects)
535 : m_iterator(std::move(iterator)), m_objects(objects) { }
537template<
typename TObject,
typename TListIterator>
538bool PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::operator==(
const Iterator& rhs)
const
540 return m_iterator == rhs.m_iterator;
543template<
typename TObject,
typename TListIterator>
544bool PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::operator!=(
const Iterator& rhs)
const
546 return m_iterator != rhs.m_iterator;
549template<
typename TObject,
typename TListIterator>
550typename PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator& PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::operator++()
556template<
typename TObject,
typename TListIterator>
557typename PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::operator++(
int)
564template<
typename TObject,
typename TListIterator>
565typename PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::value_type PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::operator*()
570template<
typename TObject,
typename TListIterator>
571typename PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::value_type PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::operator->()
576template<
typename TObject,
typename TListIterator>
577typename PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::value_type PdfArrayIndirectIterableBase<TObject, TListIterator>::Iterator::resolve()
579 TObject& robj = *m_iterator;
580 TObject* indirectobj;
582 if (m_objects !=
nullptr
583 && robj.TryGetReference(ref)
585 && (indirectobj = GetObject(*m_objects, ref)) !=
nullptr)
SPDX-FileCopyrightText: (C) 2005 Dominik Seichter domseichter@web.de SPDX-FileCopyrightText: (C) 2020...
An interface for writing blocks of data to a data source.
Definition OutputStream.h:18
Helper class to iterate through array indirect objects.
Definition PdfArray.h:23
This class represents a PdfArray Use it for all arrays that are written to a PDF file.
Definition PdfArray.h:81
PdfArray()
Create an empty array.
Definition PdfArray.cpp:15
A PdfDataProvider object with a PdfObject owner, specialized in holding objects.
Definition PdfDataContainer.h:22
A list of PdfObjects that constitutes the indirect object list of the document The PdfParser will rea...
Definition PdfIndirectObjectList.h:30
This class represents a PDF indirect Object in memory.
Definition PdfObject.h:35
A simple tokenizer for PDF files and PDF content streams.
Definition PdfTokenizer.h:36
Convenient type for char array storage and/or buffer with std::string compatibility.
Definition basetypes.h:38
SPDX-FileCopyrightText: (C) 2022 Francesco Pretto ceztko@gmail.com SPDX-License-Identifier: LGPL-2....
Definition basetypes.h:16
PdfWriteFlags
Specify additional options for writing the PDF.
Definition PdfDeclarations.h:149