// Copyright 2021 The Dawn & Tint Authors
//
// 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.
//
// 3. Neither the name of the copyright holder nor the names of its
//    contributors may be used to endorse or promote products derived from
//    this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT HOLDER OR 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.

#ifndef SRC_TINT_LANG_WGSL_AST_TRANSFORM_BINDING_REMAPPER_H_
#define SRC_TINT_LANG_WGSL_AST_TRANSFORM_BINDING_REMAPPER_H_

#include <unordered_map>

#include "src/tint/api/common/binding_point.h"
#include "src/tint/lang/core/access.h"
#include "src/tint/lang/wgsl/ast/transform/transform.h"

namespace tint::ast::transform {

/// BindingPoint is an alias to BindingPoint
using BindingPoint = BindingPoint;

/// BindingRemapper is a transform used to remap resource binding points and
/// access controls.
class BindingRemapper final : public Castable<BindingRemapper, Transform> {
  public:
    /// BindingPoints is a map of old binding point to new binding point
    using BindingPoints = std::unordered_map<BindingPoint, BindingPoint>;

    /// AccessControls is a map of old binding point to new access control
    using AccessControls = std::unordered_map<BindingPoint, core::Access>;

    /// Remappings is consumed by the BindingRemapper transform.
    /// Data holds information about shader usage and constant buffer offsets.
    struct Remappings final : public Castable<Remappings, Data> {
        /// Constructor
        /// @param bp a map of new binding points
        /// @param ac a map of new access controls
        /// @param may_collide If true, then validation will be disabled for
        /// binding point collisions generated by this transform
        Remappings(BindingPoints bp, AccessControls ac, bool may_collide = true);

        /// Copy constructor
        Remappings(const Remappings&);

        /// Destructor
        ~Remappings() override;

        /// A map of old binding point to new binding point
        const BindingPoints binding_points;

        /// A map of old binding point to new access controls
        const AccessControls access_controls;

        /// If true, then validation will be disabled for binding point collisions
        /// generated by this transform
        const bool allow_collisions;
    };

    /// Constructor
    BindingRemapper();
    ~BindingRemapper() override;

    /// @copydoc Transform::Apply
    ApplyResult Apply(const Program& program,
                      const DataMap& inputs,
                      DataMap& outputs) const override;
};

}  // namespace tint::ast::transform

#endif  // SRC_TINT_LANG_WGSL_AST_TRANSFORM_BINDING_REMAPPER_H_
