// Copyright 2017 PDFium Authors. All rights reserved. // 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/fpdfapi/parser/cpdf_dictionary.h" // 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(); bool IsStarted() const { return is_started_; } bool virtual IsFinished() const = 0; const CPDF_Object* Increment(); const CPDF_Object* object() const { return object_; } protected: explicit SubobjectIterator(const CPDF_Object* object); virtual const CPDF_Object* IncrementImpl() = 0; virtual void Start() = 0; private: const CPDF_Object* object_; bool is_started_ = false; }; explicit CPDF_ObjectWalker(const CPDF_Object* root); ~CPDF_ObjectWalker(); const CPDF_Object* GetNext(); void SkipWalkIntoCurrentObject(); size_t current_depth() const { return current_depth_; } const CPDF_Object* GetParent() const { return parent_object_; } ByteString dictionary_key() const { return dict_key_; } private: static std::unique_ptr MakeIterator( const CPDF_Object* object); const CPDF_Object* next_object_; const CPDF_Object* parent_object_; ByteString dict_key_; size_t current_depth_; std::stack> stack_; }; class CPDF_NonConstObjectWalker : public CPDF_ObjectWalker { public: explicit CPDF_NonConstObjectWalker(CPDF_Object* root) : CPDF_ObjectWalker(root) {} CPDF_Object* GetNext() { return const_cast(CPDF_ObjectWalker::GetNext()); } }; #endif // CORE_FPDFAPI_PARSER_CPDF_OBJECT_WALKER_H_