| // Copyright 2023 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_FPDFAPI_PARSER_OBJECT_TREE_TRAVERSAL_UTIL_H_ | |
| #define CORE_FPDFAPI_PARSER_OBJECT_TREE_TRAVERSAL_UTIL_H_ | |
| #include <stdint.h> | |
| #include <set> | |
| class CPDF_Document; | |
| // Traverses `document` starting with its trailer, if it has one, or starting at | |
| // the catalog, which always exists. The trailer should have a reference to the | |
| // catalog. The traversal avoids cycles. | |
| // Returns all the PDF objects (not CPDF_Objects) the traversal reached as a set | |
| // of object numbers. | |
| std::set<uint32_t> GetObjectsWithReferences(const CPDF_Document* document); | |
| // Same as GetObjectsWithReferences(), but only returns the objects with | |
| // multiple references. References that would create a cycle are ignored. | |
| // | |
| // In this example, where (A) is the root node: | |
| // | |
| // A -> B | |
| // A -> C | |
| // B -> D | |
| // C -> D | |
| // | |
| // GetObjectsWithMultipleReferences() returns {D}, since both (B) and (C) | |
| // references to (D), and there are no cycles. | |
| // | |
| // In this example, where (A) is the root node: | |
| // | |
| // A -> B | |
| // B -> C | |
| // C -> B | |
| // | |
| // GetObjectsWithMultipleReferences() returns {}, even though both (A) and (C) | |
| // references (B). Since (B) -> (C) -> (B) creates a cycle, the (C) -> (B) | |
| // reference does not count. | |
| std::set<uint32_t> GetObjectsWithMultipleReferences( | |
| const CPDF_Document* document); | |
| #endif // CORE_FPDFAPI_PARSER_OBJECT_TREE_TRAVERSAL_UTIL_H_ |