// Copyright (c) 2020 André Perez Maselco
//
// 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 SOURCE_FUZZ_TRANSFORMATION_MAKE_VECTOR_OPERATION_DYNAMIC_H_
#define SOURCE_FUZZ_TRANSFORMATION_MAKE_VECTOR_OPERATION_DYNAMIC_H_

#include "source/fuzz/protobufs/spirvfuzz_protobufs.h"
#include "source/fuzz/transformation.h"
#include "source/fuzz/transformation_context.h"
#include "source/opt/ir_context.h"

namespace spvtools {
namespace fuzz {

class TransformationMakeVectorOperationDynamic : public Transformation {
 public:
  explicit TransformationMakeVectorOperationDynamic(
      const protobufs::TransformationMakeVectorOperationDynamic& message);

  TransformationMakeVectorOperationDynamic(uint32_t instruction_result_id,
                                           uint32_t constant_index_id);

  // - |message_.instruction_result_id| must be the result id of an
  // OpCompositeExtract/Insert instruction such that the composite operand is a
  // vector.
  // - |message_.constant_index_id| must be the result id of an integer
  // instruction such that its value equals the indexing literal of the
  // OpCompositeExtract/Insert instruction.
  bool IsApplicable(
      opt::IRContext* ir_context,
      const TransformationContext& transformation_context) const override;

  // Replaces the OpCompositeExtract and OpCompositeInsert instructions with the
  // OpVectorExtractDynamic and OpVectorInsertDynamic instructions.
  void Apply(opt::IRContext* ir_context,
             TransformationContext* transformation_context) const override;

  protobufs::Transformation ToMessage() const override;

  // Checks |instruction| is defined, is an OpCompositeExtract/Insert
  // instruction and the composite operand is a vector.
  static bool IsVectorOperation(opt::IRContext* ir_context,
                                opt::Instruction* instruction);

 private:
  protobufs::TransformationMakeVectorOperationDynamic message_;
};

}  // namespace fuzz
}  // namespace spvtools

#endif  // SOURCE_FUZZ_TRANSFORMATION_MAKE_VECTOR_OPERATION_DYNAMIC_H_
