// 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_SEM_CALL_TARGET_H_
#define SRC_SEM_CALL_TARGET_H_

#include <vector>

#include "src/sem/node.h"
#include "src/sem/parameter_usage.h"
#include "src/sem/sampler_type.h"
#include "src/utils/hash.h"

namespace tint {

namespace sem {
// Forward declarations
class Type;

/// Parameter describes a single parameter of a call target
struct Parameter {
  /// Parameter type
  sem::Type* const type;
  /// Parameter usage
  ParameterUsage const usage = ParameterUsage::kNone;
};

std::ostream& operator<<(std::ostream& out, Parameter parameter);

/// Equality operator for Parameters
static inline bool operator==(const Parameter& a, const Parameter& b) {
  return a.type == b.type && a.usage == b.usage;
}

/// Inequality operator for Parameters
static inline bool operator!=(const Parameter& a, const Parameter& b) {
  return !(a == b);
}

/// ParameterList is a list of Parameter
using ParameterList = std::vector<Parameter>;

/// @param parameters the list of parameters
/// @param usage the parameter usage to find
/// @returns the index of the parameter with the given usage, or -1 if no
/// parameter with the given usage exists.
int IndexOf(const ParameterList& parameters, ParameterUsage usage);

/// CallTarget is the base for callable functions
class CallTarget : public Castable<CallTarget, Node> {
 public:
  /// Constructor
  /// @param return_type the return type of the call target
  /// @param parameters the parameters for the call target
  CallTarget(sem::Type* return_type, const ParameterList& parameters);

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

  /// @return the return type of the call target
  sem::Type* ReturnType() const { return return_type_; }

  /// Destructor
  ~CallTarget() override;

  /// @return the parameters of the call target
  const ParameterList& Parameters() const { return parameters_; }

 private:
  sem::Type* const return_type_;
  ParameterList const parameters_;
};

}  // namespace sem
}  // namespace tint

namespace std {

/// Custom std::hash specialization for tint::sem::Parameter
template <>
class hash<tint::sem::Parameter> {
 public:
  /// @param p the tint::sem::Parameter to create a hash for
  /// @return the hash value
  inline std::size_t operator()(const tint::sem::Parameter& p) const {
    return tint::utils::Hash(p.type, p.usage);
  }
};

}  // namespace std

#endif  // SRC_SEM_CALL_TARGET_H_
