// Copyright 2016 The Chromium 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 NGLayoutOpportunityIterator_h
#define NGLayoutOpportunityIterator_h

#include "core/CoreExport.h"
#include "core/layout/ng/ng_constraint_space.h"
#include "core/layout/ng/ng_layout_opportunity_tree_node.h"
#include "core/layout/ng/ng_units.h"
#include "platform/heap/Handle.h"
#include "wtf/Optional.h"
#include "wtf/Vector.h"

namespace blink {

typedef NGLogicalRect NGLayoutOpportunity;
typedef Vector<NGLayoutOpportunity> NGLayoutOpportunities;

class CORE_EXPORT NGLayoutOpportunityIterator final {
  STACK_ALLOCATED();

 public:
  // Default constructor.
  //
  // @param space Constraint space with exclusions for which this iterator needs
  //              to generate layout opportunities.
  // @param opt_origin_point Optional origin_point parameter that is used as a
  //                         default start point for layout opportunities.
  // @param opt_leader_point Optional 'leader' parameter that is used to specify
  //                         the ending point of temporary excluded rectangle
  //                         which starts from 'origin'. This rectangle may
  //                         represent a text fragment for example.
  NGLayoutOpportunityIterator(
      const NGConstraintSpace* space,
      const WTF::Optional<NGLogicalOffset>& opt_origin_point = WTF::nullopt,
      const WTF::Optional<NGLogicalOffset>& opt_leader_point = WTF::nullopt);

  // Gets the next Layout Opportunity or nullptr if the search is exhausted.
  // TODO(chrome-layout-team): Refactor with using C++ <iterator> library.
  const NGLayoutOpportunity Next();

 private:
  // Mutable Getters.
  NGLayoutOpportunityTreeNode* MutableOpportunityTreeRoot() {
    return opportunity_tree_root_.get();
  }

  // Read-only Getters.
  const NGLayoutOpportunityTreeNode* OpportunityTreeRoot() const {
    return opportunity_tree_root_.get();
  }

  const NGConstraintSpace* constraint_space_;

  NGLayoutOpportunities opportunities_;
  NGLayoutOpportunities::const_iterator opportunity_iter_;
  Persistent<NGLayoutOpportunityTreeNode> opportunity_tree_root_;
};

}  // namespace blink

#endif  // NGLayoutOpportunityIterator_h
