Coverage Report

Created: 2025-08-26 07:09

/src/qpdf/libqpdf/qpdf/QPDFObjectHandle_private.hh
Line
Count
Source (jump to first uncovered line)
1
#ifndef OBJECTHANDLE_PRIVATE_HH
2
#define OBJECTHANDLE_PRIVATE_HH
3
4
#include <qpdf/QPDFObjectHandle.hh>
5
6
#include <qpdf/QPDFObject_private.hh>
7
#include <qpdf/QPDF_private.hh>
8
#include <qpdf/QUtil.hh>
9
10
namespace qpdf
11
{
12
    class Array final: public BaseHandle
13
    {
14
      public:
15
        // Create an empty Array. If 'empty' is false, create a null Array.
16
        Array(bool empty = true);
17
18
        Array(std::vector<QPDFObjectHandle> const& items);
19
20
        Array(std::vector<QPDFObjectHandle>&& items);
21
22
        Array(Array const& other) :
23
            BaseHandle(other.obj)
24
0
        {
25
0
        }
26
27
        Array&
28
        operator=(Array const& other)
29
0
        {
30
0
            if (obj != other.obj) {
31
0
                obj = other.obj;
32
0
            }
33
0
            return *this;
34
0
        }
35
36
        Array(Array&&) = default;
37
        Array& operator=(Array&&) = default;
38
39
        explicit Array(std::shared_ptr<QPDFObject> const& obj) :
40
7.82M
            BaseHandle(obj)
41
7.82M
        {
42
7.82M
        }
43
44
        explicit Array(std::shared_ptr<QPDFObject>&& obj) :
45
33.4k
            BaseHandle(std::move(obj))
46
33.4k
        {
47
33.4k
        }
48
49
        Array(QPDFObjectHandle const& oh) :
50
126k
            BaseHandle(oh.resolved_type_code() == ::ot_array ? oh : QPDFObjectHandle())
51
126k
        {
52
126k
        }
53
54
        Array&
55
        operator=(QPDFObjectHandle const& oh)
56
0
        {
57
0
            assign(::ot_array, oh);
58
0
            return *this;
59
0
        }
60
61
        Array(QPDFObjectHandle&& oh) :
62
            BaseHandle(oh.resolved_type_code() == ::ot_array ? std::move(oh) : QPDFObjectHandle())
63
0
        {
64
0
        }
65
66
        Array&
67
        operator=(QPDFObjectHandle&& oh)
68
0
        {
69
0
            assign(::ot_array, std::move(oh));
70
0
            return *this;
71
0
        }
72
73
        QPDFObjectHandle const& operator[](size_t n) const;
74
75
        QPDFObjectHandle const& operator[](int n) const;
76
77
        using iterator = std::vector<QPDFObjectHandle>::iterator;
78
        using const_iterator = std::vector<QPDFObjectHandle>::const_iterator;
79
        using const_reverse_iterator = std::vector<QPDFObjectHandle>::const_reverse_iterator;
80
81
        iterator begin();
82
83
        iterator end();
84
85
        const_iterator cbegin();
86
87
        const_iterator cend();
88
89
        const_reverse_iterator crbegin();
90
91
        const_reverse_iterator crend();
92
93
        // Return the number of elements in the array. Return 0 if the object is not an array.
94
        size_t size() const;
95
        QPDFObjectHandle get(size_t n) const;
96
        QPDFObjectHandle get(int n) const;
97
        bool set(size_t at, QPDFObjectHandle const& oh);
98
        bool set(int at, QPDFObjectHandle const& oh);
99
        bool insert(size_t at, QPDFObjectHandle const& item);
100
        bool insert(int at, QPDFObjectHandle const& item);
101
        void push_back(QPDFObjectHandle const& item);
102
        bool erase(size_t at);
103
        bool erase(int at);
104
105
        std::vector<QPDFObjectHandle> getAsVector() const;
106
        void setFromVector(std::vector<QPDFObjectHandle> const& items);
107
108
      private:
109
        QPDF_Array* array() const;
110
        void checkOwnership(QPDFObjectHandle const& item) const;
111
        QPDFObjectHandle null() const;
112
113
        std::unique_ptr<std::vector<QPDFObjectHandle>> sp_elements{};
114
    };
115
116
    // BaseDictionary is only used as a base class. It does not contain any methods exposed in the
117
    // public API.
118
    class BaseDictionary: public BaseHandle
119
    {
120
      public:
121
        using iterator = std::map<std::string, QPDFObjectHandle>::iterator;
122
        using const_iterator = std::map<std::string, QPDFObjectHandle>::const_iterator;
123
        using reverse_iterator = std::map<std::string, QPDFObjectHandle>::reverse_iterator;
124
        using const_reverse_iterator =
125
            std::map<std::string, QPDFObjectHandle>::const_reverse_iterator;
126
127
        iterator
128
        begin()
129
17.8M
        {
130
17.8M
            if (auto d = as<QPDF_Dictionary>()) {
131
758k
                return d->items.begin();
132
758k
            }
133
17.0M
            return {};
134
17.8M
        }
135
136
        iterator
137
        end()
138
17.8M
        {
139
17.8M
            if (auto d = as<QPDF_Dictionary>()) {
140
758k
                return d->items.end();
141
758k
            }
142
17.0M
            return {};
143
17.8M
        }
144
145
        const_iterator
146
        cbegin()
147
0
        {
148
0
            if (auto d = as<QPDF_Dictionary>()) {
149
0
                return d->items.cbegin();
150
0
            }
151
0
            return {};
152
0
        }
153
154
        const_iterator
155
        cend()
156
0
        {
157
0
            if (auto d = as<QPDF_Dictionary>()) {
158
0
                return d->items.cend();
159
0
            }
160
0
            return {};
161
0
        }
162
163
        reverse_iterator
164
        rbegin()
165
0
        {
166
0
            if (auto d = as<QPDF_Dictionary>()) {
167
0
                return d->items.rbegin();
168
0
            }
169
0
            return {};
170
0
        }
171
172
        reverse_iterator
173
        rend()
174
0
        {
175
0
            if (auto d = as<QPDF_Dictionary>()) {
176
0
                return d->items.rend();
177
0
            }
178
0
            return {};
179
0
        }
180
181
        const_reverse_iterator
182
        crbegin()
183
36.0k
        {
184
36.0k
            if (auto d = as<QPDF_Dictionary>()) {
185
36.0k
                return d->items.crbegin();
186
36.0k
            }
187
0
            return {};
188
36.0k
        }
189
190
        const_reverse_iterator
191
        crend()
192
36.0k
        {
193
36.0k
            if (auto d = as<QPDF_Dictionary>()) {
194
36.0k
                return d->items.crend();
195
36.0k
            }
196
0
            return {};
197
36.0k
        }
198
199
        // The following methods are not part of the public API.
200
        bool hasKey(std::string const& key) const;
201
        QPDFObjectHandle getKey(std::string const& key) const;
202
        std::set<std::string> getKeys();
203
        std::map<std::string, QPDFObjectHandle> const& getAsMap() const;
204
        void removeKey(std::string const& key);
205
        void replaceKey(std::string const& key, QPDFObjectHandle value);
206
207
      protected:
208
        BaseDictionary() = default;
209
        BaseDictionary(std::shared_ptr<QPDFObject> const& obj) :
210
19.0M
            BaseHandle(obj) {};
211
        BaseDictionary(std::shared_ptr<QPDFObject>&& obj) :
212
5.96k
            BaseHandle(std::move(obj)) {};
213
        BaseDictionary(BaseDictionary const&) = default;
214
        BaseDictionary& operator=(BaseDictionary const&) = default;
215
        BaseDictionary(BaseDictionary&&) = default;
216
        BaseDictionary& operator=(BaseDictionary&&) = default;
217
        ~BaseDictionary() = default;
218
219
        QPDF_Dictionary* dict() const;
220
    };
221
222
    class Dictionary final: public BaseDictionary
223
    {
224
      public:
225
        explicit Dictionary(std::shared_ptr<QPDFObject> const& obj) :
226
19.0M
            BaseDictionary(obj)
227
19.0M
        {
228
19.0M
        }
229
230
        explicit Dictionary(std::shared_ptr<QPDFObject>&& obj) :
231
5.96k
            BaseDictionary(std::move(obj))
232
5.96k
        {
233
5.96k
        }
234
    };
235
236
    class Name final: public BaseHandle
237
    {
238
      public:
239
        // Put # into strings with characters unsuitable for name token
240
        static std::string normalize(std::string const& name);
241
242
        // Check whether name is valid utf-8 and whether it contains characters that require
243
        // escaping. Return {false, false} if the name is not valid utf-8, otherwise return {true,
244
        // true} if no characters require or {true, false} if escaping is required.
245
        static std::pair<bool, bool> analyzeJSONEncoding(std::string const& name);
246
    };
247
248
    class Stream final: public BaseHandle
249
    {
250
      public:
251
        explicit Stream(std::shared_ptr<QPDFObject> const& obj) :
252
289k
            BaseHandle(obj)
253
289k
        {
254
289k
        }
255
256
        explicit Stream(std::shared_ptr<QPDFObject>&& obj) :
257
24.0k
            BaseHandle(std::move(obj))
258
24.0k
        {
259
24.0k
        }
260
261
        Stream(
262
            QPDF& qpdf,
263
            QPDFObjGen og,
264
            QPDFObjectHandle stream_dict,
265
            qpdf_offset_t offset,
266
            size_t length);
267
268
        QPDFObjectHandle
269
        getDict() const
270
227k
        {
271
227k
            return stream()->stream_dict;
272
227k
        }
273
        bool
274
        isDataModified() const
275
26.0k
        {
276
26.0k
            return !stream()->token_filters.empty();
277
26.0k
        }
278
        void
279
        setFilterOnWrite(bool val)
280
10.9k
        {
281
10.9k
            stream()->filter_on_write = val;
282
10.9k
        }
283
        bool
284
        getFilterOnWrite() const
285
26.0k
        {
286
26.0k
            return stream()->filter_on_write;
287
26.0k
        }
288
289
        // Methods to help QPDF copy foreign streams
290
        size_t
291
        getLength() const
292
0
        {
293
0
            return stream()->length;
294
0
        }
295
        std::shared_ptr<Buffer>
296
        getStreamDataBuffer() const
297
0
        {
298
0
            return stream()->stream_data;
299
0
        }
300
        std::shared_ptr<QPDFObjectHandle::StreamDataProvider>
301
        getStreamDataProvider() const
302
0
        {
303
0
            return stream()->stream_provider;
304
0
        }
305
306
        // See comments in QPDFObjectHandle.hh for these methods.
307
        bool pipeStreamData(
308
            Pipeline* p,
309
            bool* tried_filtering,
310
            int encode_flags,
311
            qpdf_stream_decode_level_e decode_level,
312
            bool suppress_warnings,
313
            bool will_retry);
314
        std::string getStreamData(qpdf_stream_decode_level_e level);
315
        std::string getRawStreamData();
316
        void replaceStreamData(
317
            std::shared_ptr<Buffer> data,
318
            QPDFObjectHandle const& filter,
319
            QPDFObjectHandle const& decode_parms);
320
        void replaceStreamData(
321
            std::shared_ptr<QPDFObjectHandle::StreamDataProvider> provider,
322
            QPDFObjectHandle const& filter,
323
            QPDFObjectHandle const& decode_parms);
324
        void
325
        addTokenFilter(std::shared_ptr<QPDFObjectHandle::TokenFilter> token_filter)
326
0
        {
327
0
            stream()->token_filters.emplace_back(token_filter);
328
0
        }
329
        JSON getStreamJSON(
330
            int json_version,
331
            qpdf_json_stream_data_e json_data,
332
            qpdf_stream_decode_level_e decode_level,
333
            Pipeline* p,
334
            std::string const& data_filename);
335
        qpdf_stream_decode_level_e writeStreamJSON(
336
            int json_version,
337
            JSON::Writer& jw,
338
            qpdf_json_stream_data_e json_data,
339
            qpdf_stream_decode_level_e decode_level,
340
            Pipeline* p,
341
            std::string const& data_filename,
342
            bool no_data_key = false);
343
        void
344
        replaceDict(QPDFObjectHandle const& new_dict)
345
0
        {
346
0
            auto s = stream();
347
0
            s->stream_dict = new_dict;
348
0
            setDictDescription();
349
0
        }
350
        bool isRootMetadata() const;
351
352
        void setDictDescription();
353
354
        static void registerStreamFilter(
355
            std::string const& filter_name,
356
            std::function<std::shared_ptr<QPDFStreamFilter>()> factory);
357
358
      private:
359
        QPDF_Stream::Members*
360
        stream() const
361
417k
        {
362
417k
            if (auto s = as<QPDF_Stream>()) {
363
417k
                if (auto ptr = s->m.get()) {
364
417k
                    return ptr;
365
417k
                }
366
3
                throw std::logic_error("QPDF_Stream: unexpected nullptr");
367
417k
            }
368
0
            throw std::runtime_error("operation for stream attempted on non-stream object");
369
0
            return nullptr; // unreachable
370
417k
        }
371
        bool filterable(
372
            qpdf_stream_decode_level_e decode_level,
373
            std::vector<std::shared_ptr<QPDFStreamFilter>>& filters);
374
        void replaceFilterData(
375
            QPDFObjectHandle const& filter, QPDFObjectHandle const& decode_parms, size_t length);
376
377
        void warn(std::string const& message);
378
379
        static std::map<std::string, std::string> filter_abbreviations;
380
    };
381
382
    template <typename T>
383
    T*
384
    BaseHandle::as() const
385
53.3M
    {
386
53.3M
        if (!obj) {
387
48.7k
            return nullptr;
388
48.7k
        }
389
53.3M
        if (std::holds_alternative<T>(obj->value)) {
390
3.98M
            return &std::get<T>(obj->value);
391
3.98M
        }
392
49.3M
        if (std::holds_alternative<QPDF_Unresolved>(obj->value)) {
393
84
            return BaseHandle(QPDF::Resolver::resolved(obj->qpdf, obj->og)).as<T>();
394
84
        }
395
49.3M
        if (std::holds_alternative<QPDF_Reference>(obj->value)) {
396
            // see comment in QPDF_Reference.
397
0
            return BaseHandle(std::get<QPDF_Reference>(obj->value).obj).as<T>();
398
0
        }
399
49.3M
        return nullptr;
400
49.3M
    }
QPDF_Dictionary* qpdf::BaseHandle::as<QPDF_Dictionary>() const
Line
Count
Source
385
36.9M
    {
386
36.9M
        if (!obj) {
387
0
            return nullptr;
388
0
        }
389
36.9M
        if (std::holds_alternative<T>(obj->value)) {
390
2.76M
            return &std::get<T>(obj->value);
391
2.76M
        }
392
34.1M
        if (std::holds_alternative<QPDF_Unresolved>(obj->value)) {
393
80
            return BaseHandle(QPDF::Resolver::resolved(obj->qpdf, obj->og)).as<T>();
394
80
        }
395
34.1M
        if (std::holds_alternative<QPDF_Reference>(obj->value)) {
396
            // see comment in QPDF_Reference.
397
0
            return BaseHandle(std::get<QPDF_Reference>(obj->value).obj).as<T>();
398
0
        }
399
34.1M
        return nullptr;
400
34.1M
    }
QPDF_Stream* qpdf::BaseHandle::as<QPDF_Stream>() const
Line
Count
Source
385
417k
    {
386
417k
        if (!obj) {
387
0
            return nullptr;
388
0
        }
389
417k
        if (std::holds_alternative<T>(obj->value)) {
390
417k
            return &std::get<T>(obj->value);
391
417k
        }
392
0
        if (std::holds_alternative<QPDF_Unresolved>(obj->value)) {
393
0
            return BaseHandle(QPDF::Resolver::resolved(obj->qpdf, obj->og)).as<T>();
394
0
        }
395
0
        if (std::holds_alternative<QPDF_Reference>(obj->value)) {
396
            // see comment in QPDF_Reference.
397
0
            return BaseHandle(std::get<QPDF_Reference>(obj->value).obj).as<T>();
398
0
        }
399
0
        return nullptr;
400
0
    }
QPDF_Bool* qpdf::BaseHandle::as<QPDF_Bool>() const
Line
Count
Source
385
2
    {
386
2
        if (!obj) {
387
0
            return nullptr;
388
0
        }
389
2
        if (std::holds_alternative<T>(obj->value)) {
390
2
            return &std::get<T>(obj->value);
391
2
        }
392
0
        if (std::holds_alternative<QPDF_Unresolved>(obj->value)) {
393
0
            return BaseHandle(QPDF::Resolver::resolved(obj->qpdf, obj->og)).as<T>();
394
0
        }
395
0
        if (std::holds_alternative<QPDF_Reference>(obj->value)) {
396
            // see comment in QPDF_Reference.
397
0
            return BaseHandle(std::get<QPDF_Reference>(obj->value).obj).as<T>();
398
0
        }
399
0
        return nullptr;
400
0
    }
QPDF_Integer* qpdf::BaseHandle::as<QPDF_Integer>() const
Line
Count
Source
385
111k
    {
386
111k
        if (!obj) {
387
0
            return nullptr;
388
0
        }
389
111k
        if (std::holds_alternative<T>(obj->value)) {
390
110k
            return &std::get<T>(obj->value);
391
110k
        }
392
1.34k
        if (std::holds_alternative<QPDF_Unresolved>(obj->value)) {
393
4
            return BaseHandle(QPDF::Resolver::resolved(obj->qpdf, obj->og)).as<T>();
394
4
        }
395
1.34k
        if (std::holds_alternative<QPDF_Reference>(obj->value)) {
396
            // see comment in QPDF_Reference.
397
0
            return BaseHandle(std::get<QPDF_Reference>(obj->value).obj).as<T>();
398
0
        }
399
1.34k
        return nullptr;
400
1.34k
    }
Unexecuted instantiation: QPDF_String* qpdf::BaseHandle::as<QPDF_String>() const
QPDF_Array* qpdf::BaseHandle::as<QPDF_Array>() const
Line
Count
Source
385
15.9M
    {
386
15.9M
        if (!obj) {
387
48.7k
            return nullptr;
388
48.7k
        }
389
15.8M
        if (std::holds_alternative<T>(obj->value)) {
390
695k
            return &std::get<T>(obj->value);
391
695k
        }
392
15.1M
        if (std::holds_alternative<QPDF_Unresolved>(obj->value)) {
393
0
            return BaseHandle(QPDF::Resolver::resolved(obj->qpdf, obj->og)).as<T>();
394
0
        }
395
15.1M
        if (std::holds_alternative<QPDF_Reference>(obj->value)) {
396
            // see comment in QPDF_Reference.
397
0
            return BaseHandle(std::get<QPDF_Reference>(obj->value).obj).as<T>();
398
0
        }
399
15.1M
        return nullptr;
400
15.1M
    }
401
402
    inline BaseHandle::BaseHandle(QPDFObjectHandle const& oh) :
403
126k
        obj(oh.obj)
404
126k
    {
405
126k
    }
406
407
    inline BaseHandle::BaseHandle(QPDFObjectHandle&& oh) :
408
        obj(std::move(oh.obj))
409
    {
410
    }
411
412
    inline void
413
    BaseHandle::assign(qpdf_object_type_e required, BaseHandle const& other)
414
0
    {
415
0
        if (obj != other.obj) {
416
0
            obj = other.resolved_type_code() == required ? other.obj : nullptr;
417
0
        }
418
0
    }
419
420
    inline void
421
    BaseHandle::assign(qpdf_object_type_e required, BaseHandle&& other)
422
0
    {
423
0
        if (obj != other.obj) {
424
0
            obj = other.resolved_type_code() == required ? std::move(other.obj) : nullptr;
425
0
        }
426
0
    }
427
428
    inline QPDFObjGen
429
    BaseHandle::id_gen() const
430
669
    {
431
669
        return obj ? obj->og : QPDFObjGen();
432
669
    }
433
434
    inline bool
435
    BaseHandle::indirect() const
436
8.70M
    {
437
8.70M
        return obj ? obj->og.isIndirect() : false;
438
8.70M
    }
439
440
    inline bool
441
    BaseHandle::null() const
442
3.03M
    {
443
3.03M
        return !obj || type_code() == ::ot_null;
444
3.03M
    }
445
446
    inline QPDF*
447
    BaseHandle::qpdf() const
448
179k
    {
449
179k
        return obj ? obj->qpdf : nullptr;
450
179k
    }
451
452
    inline qpdf_object_type_e
453
    BaseHandle::raw_type_code() const
454
180M
    {
455
180M
        return obj ? static_cast<qpdf_object_type_e>(obj->value.index()) : ::ot_uninitialized;
456
180M
    }
457
458
    inline qpdf_object_type_e
459
    BaseHandle::resolved_type_code() const
460
8.47M
    {
461
8.47M
        if (!obj) {
462
0
            return ::ot_uninitialized;
463
0
        }
464
8.47M
        if (raw_type_code() == ::ot_unresolved) {
465
4
            return QPDF::Resolver::resolved(obj->qpdf, obj->og)->getTypeCode();
466
4
        }
467
8.47M
        return raw_type_code();
468
8.47M
    }
469
470
    inline qpdf_object_type_e
471
    BaseHandle::type_code() const
472
49.2M
    {
473
49.2M
        if (!obj) {
474
1.54k
            return ::ot_uninitialized;
475
1.54k
        }
476
49.2M
        if (raw_type_code() == ::ot_unresolved) {
477
199k
            return QPDF::Resolver::resolved(obj->qpdf, obj->og)->getTypeCode();
478
199k
        }
479
49.0M
        if (raw_type_code() == ::ot_reference) {
480
0
            return std::get<QPDF_Reference>(obj->value).obj->getTypeCode();
481
0
        }
482
49.0M
        return raw_type_code();
483
49.0M
    }
484
485
} // namespace qpdf
486
487
inline QPDF_Dictionary::QPDF_Dictionary(std::map<std::string, QPDFObjectHandle>&& items) :
488
193k
    items(std::move(items))
489
193k
{
490
193k
}
491
492
inline std::shared_ptr<QPDFObject>
493
QPDF_Null::create(
494
    std::shared_ptr<QPDFObject> parent, std::string_view const& static_descr, std::string var_descr)
495
323k
{
496
323k
    auto n = QPDFObject::create<QPDF_Null>();
497
323k
    n->setChildDescription(parent->getQPDF(), parent, static_descr, var_descr);
498
323k
    return n;
499
323k
}
500
501
inline QPDF_Real::QPDF_Real(double value, int decimal_places, bool trim_trailing_zeroes) :
502
26.6k
    val(QUtil::double_to_string(value, decimal_places, trim_trailing_zeroes))
503
26.6k
{
504
26.6k
}
505
506
template <typename T, typename... Args>
507
inline std::shared_ptr<QPDFObject>
508
QPDFObject::create(Args&&... args)
509
11.5M
{
510
11.5M
    return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...)));
511
11.5M
}
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Null>()
Line
Count
Source
509
701k
{
510
701k
    return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...)));
511
701k
}
Unexecuted instantiation: std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Reserved>()
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Bool, bool&>(bool&)
Line
Count
Source
509
199
{
510
199
    return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...)));
511
199
}
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Integer, long long&>(long long&)
Line
Count
Source
509
564k
{
510
564k
    return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...)));
511
564k
}
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Real, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&)
Line
Count
Source
509
4.68k
{
510
4.68k
    return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...)));
511
4.68k
}
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_String, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&)
Line
Count
Source
509
17.9k
{
510
17.9k
    return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...)));
511
17.9k
}
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Name, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&)
Line
Count
Source
509
19.1k
{
510
19.1k
    return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...)));
511
19.1k
}
Unexecuted instantiation: std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Array, QPDF_Array const&>(QPDF_Array const&)
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Array, QPDF_Array>(QPDF_Array&&)
Line
Count
Source
509
32
{
510
32
    return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...)));
511
32
}
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Array, std::__1::vector<QPDFObjectHandle, std::__1::allocator<QPDFObjectHandle> >, bool>(std::__1::vector<QPDFObjectHandle, std::__1::allocator<QPDFObjectHandle> >&&, bool&&)
Line
Count
Source
509
698
{
510
698
    return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...)));
511
698
}
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Dictionary, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, QPDFObjectHandle, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, QPDFObjectHandle> > > const&>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, QPDFObjectHandle, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, QPDFObjectHandle> > > const&)
Line
Count
Source
509
58.0k
{
510
58.0k
    return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...)));
511
58.0k
}
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Dictionary, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, QPDFObjectHandle, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, QPDFObjectHandle> > >&>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, QPDFObjectHandle, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, QPDFObjectHandle> > >&)
Line
Count
Source
509
5.77k
{
510
5.77k
    return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...)));
511
5.77k
}
Unexecuted instantiation: std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Operator, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&)
Unexecuted instantiation: std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_InlineImage, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&)
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Real, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Line
Count
Source
509
81.9k
{
510
81.9k
    return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...)));
511
81.9k
}
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Real, double&, int&, bool&>(double&, int&, bool&)
Line
Count
Source
509
26.6k
{
510
26.6k
    return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...)));
511
26.6k
}
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Name, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Line
Count
Source
509
9.38M
{
510
9.38M
    return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...)));
511
9.38M
}
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_String, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Line
Count
Source
509
380k
{
510
380k
    return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...)));
511
380k
}
Unexecuted instantiation: std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Operator, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Unexecuted instantiation: std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_InlineImage, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Array, std::__1::vector<QPDFObjectHandle, std::__1::allocator<QPDFObjectHandle> > const&>(std::__1::vector<QPDFObjectHandle, std::__1::allocator<QPDFObjectHandle> > const&)
Line
Count
Source
509
8.86k
{
510
8.86k
    return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...)));
511
8.86k
}
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Array, std::__1::vector<QPDFObjectHandle, std::__1::allocator<QPDFObjectHandle> >&>(std::__1::vector<QPDFObjectHandle, std::__1::allocator<QPDFObjectHandle> >&)
Line
Count
Source
509
3.87k
{
510
3.87k
    return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...)));
511
3.87k
}
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Bool, bool>(bool&&)
Line
Count
Source
509
11.0k
{
510
11.0k
    return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...)));
511
11.0k
}
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Integer, long long>(long long&&)
Line
Count
Source
509
10.5k
{
510
10.5k
    return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...)));
511
10.5k
}
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Array, std::__1::vector<QPDFObjectHandle, std::__1::allocator<QPDFObjectHandle> > >(std::__1::vector<QPDFObjectHandle, std::__1::allocator<QPDFObjectHandle> >&&)
Line
Count
Source
509
104k
{
510
104k
    return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...)));
511
104k
}
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Dictionary, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, QPDFObjectHandle, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, QPDFObjectHandle> > > >(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, QPDFObjectHandle, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, QPDFObjectHandle> > >&&)
Line
Count
Source
509
193k
{
510
193k
    return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...)));
511
193k
}
Unexecuted instantiation: std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Array>()
512
513
inline qpdf_object_type_e
514
QPDFObject::getResolvedTypeCode() const
515
184k
{
516
184k
    if (getTypeCode() == ::ot_unresolved) {
517
0
        return QPDF::Resolver::resolved(qpdf, og)->getTypeCode();
518
0
    }
519
184k
    if (getTypeCode() == ::ot_reference) {
520
0
        return std::get<QPDF_Reference>(value).obj->getTypeCode();
521
0
    }
522
184k
    return getTypeCode();
523
184k
}
524
525
inline qpdf::Array
526
QPDFObjectHandle::as_array(qpdf::typed options) const
527
7.85M
{
528
7.85M
    if (options & qpdf::error) {
529
0
        assertType("array", false);
530
0
    }
531
7.85M
    if (options & qpdf::any_flag || type_code() == ::ot_array ||
532
7.85M
        (options & qpdf::optional && type_code() == ::ot_null)) {
533
7.82M
        return qpdf::Array(obj);
534
7.82M
    }
535
33.4k
    return qpdf::Array(std::shared_ptr<QPDFObject>());
536
7.85M
}
537
538
inline qpdf::Dictionary
539
QPDFObjectHandle::as_dictionary(qpdf::typed options) const
540
19.0M
{
541
19.0M
    if (options & qpdf::any_flag || type_code() == ::ot_dictionary ||
542
19.0M
        (options & qpdf::optional && type_code() == ::ot_null)) {
543
19.0M
        return qpdf::Dictionary(obj);
544
19.0M
    }
545
5.96k
    if (options & qpdf::error) {
546
0
        assertType("dictionary", false);
547
0
    }
548
5.96k
    return qpdf::Dictionary(std::shared_ptr<QPDFObject>());
549
19.0M
}
550
551
inline qpdf::Stream
552
QPDFObjectHandle::as_stream(qpdf::typed options) const
553
315k
{
554
315k
    if (options & qpdf::any_flag || type_code() == ::ot_stream ||
555
315k
        (options & qpdf::optional && type_code() == ::ot_null)) {
556
289k
        return qpdf::Stream(obj);
557
289k
    }
558
26.8k
    if (options & qpdf::error) {
559
36
        assertType("stream", false);
560
36
    }
561
26.8k
    return qpdf::Stream(std::shared_ptr<QPDFObject>());
562
315k
}
563
564
#endif // OBJECTHANDLE_PRIVATE_HH