// 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_