// Copyright 2017 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_CPDF_OBJECT_WALKER_H_ #define CORE_FPDFAPI_PARSER_CPDF_OBJECT_WALKER_H_ #include #include #include "core/fxcrt/bytestring.h" #include "core/fxcrt/retain_ptr.h" class CPDF_Object; // Walk on all non-null sub-objects in an object in depth, include itself, // like in flat list. class CPDF_ObjectWalker { public: class SubobjectIterator { public: virtual ~SubobjectIterator(); virtual bool IsFinished() const = 0; bool IsStarted() const { return is_started_; } RetainPtr Increment(); const CPDF_Object* object() const { return object_.Get(); } protected: explicit SubobjectIterator(RetainPtr object); virtual RetainPtr IncrementImpl() = 0; virtual void Start() = 0; private: RetainPtr object_; bool is_started_ = false; }; explicit CPDF_ObjectWalker(RetainPtr root); ~CPDF_ObjectWalker(); RetainPtr GetNext(); void SkipWalkIntoCurrentObject(); size_t current_depth() const { return current_depth_; } const CPDF_Object* GetParent() const { return parent_object_.Get(); } const ByteString& dictionary_key() const { return dict_key_; } private: static std::unique_ptr MakeIterator( RetainPtr object); RetainPtr next_object_; RetainPtr parent_object_; ByteString dict_key_; size_t current_depth_ = 0; std::stack> stack_; }; class CPDF_NonConstObjectWalker final : public CPDF_ObjectWalker { public: explicit CPDF_NonConstObjectWalker(RetainPtr root); RetainPtr GetNext(); }; #endif // CORE_FPDFAPI_PARSER_CPDF_OBJECT_WALKER_H_