// Copyright 2021 The Tint Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef SRC_TINT_WRITER_ARRAY_LENGTH_FROM_UNIFORM_OPTIONS_H_
#define SRC_TINT_WRITER_ARRAY_LENGTH_FROM_UNIFORM_OPTIONS_H_

#include <unordered_map>

#include "src/tint/sem/binding_point.h"

namespace tint::writer {

/// Options used to specify a mapping of binding points to indices into a UBO
/// from which to load buffer sizes.
struct ArrayLengthFromUniformOptions {
  /// Constructor
  ArrayLengthFromUniformOptions();
  /// Destructor
  ~ArrayLengthFromUniformOptions();
  /// Copy constructor
  ArrayLengthFromUniformOptions(const ArrayLengthFromUniformOptions&);
  /// Copy assignment
  /// @returns this ArrayLengthFromUniformOptions
  ArrayLengthFromUniformOptions& operator=(
      const ArrayLengthFromUniformOptions&);
  /// Move constructor
  ArrayLengthFromUniformOptions(ArrayLengthFromUniformOptions&&);

  /// The binding point to use to generate a uniform buffer from which to read
  /// buffer sizes.
  sem::BindingPoint ubo_binding;
  /// The mapping from storage buffer binding points to the index into the
  /// uniform buffer where the length of the buffer is stored.
  std::unordered_map<sem::BindingPoint, uint32_t> bindpoint_to_size_index;

  // NOTE: Update src/tint/fuzzers/data_builder.h when adding or changing any
  // struct members.
};

}  // namespace tint::writer

#endif  // SRC_TINT_WRITER_ARRAY_LENGTH_FROM_UNIFORM_OPTIONS_H_
