/*
 * Copyright (C) 2020 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

#pragma once

#if ENABLE(LAYOUT_FORMATTING_CONTEXT)

#include "LayoutInitialContainingBlock.h"
#include <wtf/HashMap.h>
#include <wtf/Vector.h>

namespace WebCore {

class RenderBlockFlow;

namespace LayoutIntegration {

class BoxTree {
public:
    BoxTree(const RenderBlockFlow&);

    const Layout::InitialContainingBlock& rootLayoutBox() const { return m_root; }
    Layout::InitialContainingBlock& rootLayoutBox() { return m_root; }

    const Layout::Box* layoutBoxForRenderer(const RenderObject&) const;
    const RenderObject* rendererForLayoutBox(const Layout::Box&) const;

private:
    void buildTree(const RenderBlockFlow&);

    Layout::InitialContainingBlock m_root;
    struct BoxAndRenderer {
        std::unique_ptr<const Layout::Box> box;
        const RenderObject* renderer { nullptr };
    };
    Vector<BoxAndRenderer, 1> m_boxes;

    mutable HashMap<const RenderObject*, const Layout::Box*> m_rendererToBoxMap;
    mutable HashMap<const Layout::Box*, const RenderObject*> m_boxToRendererMap;
};

}
}

#endif
