// Copyright 2020 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_INTRINSIC_H_
#define SRC_SEMANTIC_INTRINSIC_H_

#include <ostream>
#include <string>

#include "src/semantic/call_target.h"

namespace tint {
namespace semantic {

enum class IntrinsicType {
  kNone = -1,

  kAbs,
  kAcos,
  kAll,
  kAny,
  kArrayLength,
  kAsin,
  kAtan,
  kAtan2,
  kCeil,
  kClamp,
  kCos,
  kCosh,
  kCountOneBits,
  kCross,
  kDeterminant,
  kDistance,
  kDot,
  kDpdx,
  kDpdxCoarse,
  kDpdxFine,
  kDpdy,
  kDpdyCoarse,
  kDpdyFine,
  kExp,
  kExp2,
  kFaceForward,
  kFloor,
  kFma,
  kFract,
  kFrexp,
  kFwidth,
  kFwidthCoarse,
  kFwidthFine,
  kInverseSqrt,
  kIsFinite,
  kIsInf,
  kIsNan,
  kIsNormal,
  kLdexp,
  kLength,
  kLog,
  kLog2,
  kMax,
  kMin,
  kMix,
  kModf,
  kNormalize,
  kPack4x8Snorm,
  kPack4x8Unorm,
  kPack2x16Snorm,
  kPack2x16Unorm,
  kPack2x16Float,
  kPow,
  kReflect,
  kReverseBits,
  kRound,
  kSelect,
  kSign,
  kSin,
  kSinh,
  kSmoothStep,
  kSqrt,
  kStep,
  kTan,
  kTanh,
  kTextureDimensions,
  kTextureLoad,
  kTextureNumLayers,
  kTextureNumLevels,
  kTextureNumSamples,
  kTextureSample,
  kTextureSampleBias,
  kTextureSampleCompare,
  kTextureSampleGrad,
  kTextureSampleLevel,
  kTextureStore,
  kTrunc,
  kUnpack4x8Snorm,
  kUnpack4x8Unorm,
  kUnpack2x16Snorm,
  kUnpack2x16Unorm,
  kUnpack2x16Float,
};

/// Matches the IntrisicType by name
/// @param name the intrinsic name to parse
/// @returns the parsed IntrinsicType, or IntrinsicType::kNone if `name` did not
/// match any intrinsic.
IntrinsicType ParseIntrinsicType(const std::string& name);

/// @returns the name of the intrinsic function type. The spelling, including
/// case, matches the name in the WGSL spec.
const char* str(IntrinsicType i);

/// Determines if the given `i` is a coarse derivative
/// @param i the intrinsic type
/// @returns true if the given derivative is coarse.
bool IsCoarseDerivativeIntrinsic(IntrinsicType i);

/// Determines if the given `i` is a fine derivative
/// @param i the intrinsic type
/// @returns true if the given derivative is fine.
bool IsFineDerivativeIntrinsic(IntrinsicType i);

/// Determine if the given `i` is a derivative intrinsic
/// @param i the intrinsic type
/// @returns true if the given `i` is a derivative intrinsic
bool IsDerivativeIntrinsic(IntrinsicType i);

/// Determines if the given `i` is a float classification intrinsic
/// @param i the intrinsic type
/// @returns true if the given `i` is a float intrinsic
bool IsFloatClassificationIntrinsic(IntrinsicType i);

/// Determines if the given `i` is a texture operation intrinsic
/// @param i the intrinsic type
/// @returns true if the given `i` is a texture operation intrinsic
bool IsTextureIntrinsic(IntrinsicType i);

/// Determines if the given `i` is a image query intrinsic
/// @param i the intrinsic type
/// @returns true if the given `i` is a image query intrinsic
bool IsImageQueryIntrinsic(IntrinsicType i);

/// Determines if the given `i` is a data packing intrinsic
/// @param i the intrinsic
/// @returns true if the given `i` is a data packing intrinsic
bool IsDataPackingIntrinsic(IntrinsicType i);

/// Determines if the given `i` is a data unpacking intrinsic
/// @param i the intrinsic
/// @returns true if the given `i` is a data unpacking intrinsic
bool IsDataUnpackingIntrinsic(IntrinsicType i);

/// Intrinsic holds the semantic information for an intrinsic function.
class Intrinsic : public Castable<Intrinsic, CallTarget> {
 public:
  /// Constructor
  /// @param type the intrinsic type
  /// @param return_type the return type for the intrinsic call
  /// @param parameters the parameters for the intrinsic overload
  Intrinsic(IntrinsicType type,
            type::Type* return_type,
            const ParameterList& parameters);

  /// Destructor
  ~Intrinsic() override;

  /// @return the type of the intrinsic
  IntrinsicType Type() const { return type_; }

  /// @returns the name of the intrinsic function type. The spelling, including
  /// case, matches the name in the WGSL spec.
  const char* str() const;

  /// @returns true if intrinsic is a coarse derivative intrinsic
  bool IsCoarseDerivative() const;

  /// @returns true if intrinsic is a fine a derivative intrinsic
  bool IsFineDerivative() const;

  /// @returns true if intrinsic is a derivative intrinsic
  bool IsDerivative() const;

  /// @returns true if intrinsic is a float intrinsic
  bool IsFloatClassification() const;

  /// @returns true if intrinsic is a texture operation intrinsic
  bool IsTexture() const;

  /// @returns true if intrinsic is a image query intrinsic
  bool IsImageQuery() const;

  /// @returns true if intrinsic is a data packing intrinsic
  bool IsDataPacking() const;

  /// @returns true if intrinsic is a data unpacking intrinsic
  bool IsDataUnpacking() const;

 private:
  IntrinsicType const type_;
};

/// Emits the name of the intrinsic function type. The spelling, including case,
/// matches the name in the WGSL spec.
std::ostream& operator<<(std::ostream& out, IntrinsicType i);

}  // namespace semantic
}  // namespace tint

#endif  // SRC_SEMANTIC_INTRINSIC_H_
