// 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_SEMANTIC_CALL_TARGET_H_
#define SRC_SEMANTIC_CALL_TARGET_H_

#include <utility>
#include <vector>

#include "src/semantic/node.h"
#include "src/type/sampler_type.h"

namespace tint {

// Forward declarations
namespace type {
class Type;
}  // namespace type

namespace semantic {

/// Parameter describes a single parameter of a call target
struct Parameter {
  /// Usage is extra metadata for identifying a parameter based on its overload
  /// position
  enum class Usage {
    kNone,
    kArrayIndex,
    kBias,
    kCoords,
    kDepthRef,
    kDdx,
    kDdy,
    kLevel,
    kOffset,
    kSampler,
    kSampleIndex,
    kTexture,
    kValue,
  };

  /// Parameter type
  type::Type* const type;
  /// Parameter usage
  Usage const usage = Usage::kNone;
};

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

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

/// @returns a string representation of the given parameter usage.
const char* str(Parameter::Usage usage);

/// 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, Parameter::Usage 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(type::Type* return_type, const ParameterList& parameters);

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

  /// Destructor
  ~CallTarget() override;

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

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

}  // namespace semantic
}  // namespace tint

#endif  // SRC_SEMANTIC_CALL_TARGET_H_
