//===------ ISLOperators.h --------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// Operator overloads for isl C++ objects.
//
//===----------------------------------------------------------------------===//

#ifndef POLLY_ISLOPERATORS_H
#define POLLY_ISLOPERATORS_H

#include "isl/isl-noexceptions.h"

namespace polly {

/// Addition
/// @{
inline isl::pw_aff operator+(isl::pw_aff Left, isl::pw_aff Right) {
  return Left.add(Right);
}

inline isl::pw_aff operator+(isl::val ValLeft, isl::pw_aff Right) {
  isl::pw_aff Left(Right.domain(), ValLeft);
  return Left.add(Right);
}

inline isl::pw_aff operator+(isl::pw_aff Left, isl::val ValRight) {
  isl::pw_aff Right(Left.domain(), ValRight);
  return Left.add(Right);
}

inline isl::pw_aff operator+(long IntLeft, isl::pw_aff Right) {
  isl::ctx Ctx = Right.ctx();
  isl::val ValLeft(Ctx, IntLeft);
  isl::pw_aff Left(Right.domain(), ValLeft);
  return Left.add(Right);
}

inline isl::pw_aff operator+(isl::pw_aff Left, long IntRight) {
  isl::ctx Ctx = Left.ctx();
  isl::val ValRight(Ctx, IntRight);
  isl::pw_aff Right(Left.domain(), ValRight);
  return Left.add(Right);
}
/// @}

/// Multiplication
/// @{
inline isl::pw_aff operator*(isl::pw_aff Left, isl::pw_aff Right) {
  return Left.mul(Right);
}

inline isl::pw_aff operator*(isl::val ValLeft, isl::pw_aff Right) {
  isl::pw_aff Left(Right.domain(), ValLeft);
  return Left.mul(Right);
}

inline isl::pw_aff operator*(isl::pw_aff Left, isl::val ValRight) {
  isl::pw_aff Right(Left.domain(), ValRight);
  return Left.mul(Right);
}

inline isl::pw_aff operator*(long IntLeft, isl::pw_aff Right) {
  isl::ctx Ctx = Right.ctx();
  isl::val ValLeft(Ctx, IntLeft);
  isl::pw_aff Left(Right.domain(), ValLeft);
  return Left.mul(Right);
}

inline isl::pw_aff operator*(isl::pw_aff Left, long IntRight) {
  isl::ctx Ctx = Left.ctx();
  isl::val ValRight(Ctx, IntRight);
  isl::pw_aff Right(Left.domain(), ValRight);
  return Left.mul(Right);
}
/// @}

/// Subtraction
/// @{
inline isl::pw_aff operator-(isl::pw_aff Left, isl::pw_aff Right) {
  return Left.sub(Right);
}

inline isl::pw_aff operator-(isl::val ValLeft, isl::pw_aff Right) {
  isl::pw_aff Left(Right.domain(), ValLeft);
  return Left.sub(Right);
}

inline isl::pw_aff operator-(isl::pw_aff Left, isl::val ValRight) {
  isl::pw_aff Right(Left.domain(), ValRight);
  return Left.sub(Right);
}

inline isl::pw_aff operator-(long IntLeft, isl::pw_aff Right) {
  isl::ctx Ctx = Right.ctx();
  isl::val ValLeft(Ctx, IntLeft);
  isl::pw_aff Left(Right.domain(), ValLeft);
  return Left.sub(Right);
}

inline isl::pw_aff operator-(isl::pw_aff Left, long IntRight) {
  isl::ctx Ctx = Left.ctx();
  isl::val ValRight(Ctx, IntRight);
  isl::pw_aff Right(Left.domain(), ValRight);
  return Left.sub(Right);
}
/// @}

/// Division
///
/// This division rounds towards zero. This follows the semantics of C/C++.
///
/// @{
inline isl::pw_aff operator/(isl::pw_aff Left, isl::pw_aff Right) {
  return Left.tdiv_q(Right);
}

inline isl::pw_aff operator/(isl::val ValLeft, isl::pw_aff Right) {
  isl::pw_aff Left(Right.domain(), ValLeft);
  return Left.tdiv_q(Right);
}

inline isl::pw_aff operator/(isl::pw_aff Left, isl::val ValRight) {
  isl::pw_aff Right(Left.domain(), ValRight);
  return Left.tdiv_q(Right);
}

inline isl::pw_aff operator/(long IntLeft, isl::pw_aff Right) {
  isl::ctx Ctx = Right.ctx();
  isl::val ValLeft(Ctx, IntLeft);
  isl::pw_aff Left(Right.domain(), ValLeft);
  return Left.tdiv_q(Right);
}

inline isl::pw_aff operator/(isl::pw_aff Left, long IntRight) {
  isl::ctx Ctx = Left.ctx();
  isl::val ValRight(Ctx, IntRight);
  isl::pw_aff Right(Left.domain(), ValRight);
  return Left.tdiv_q(Right);
}
/// @}

/// Remainder
///
/// This is the remainder of a division which rounds towards zero. This follows
/// the semantics of C/C++.
///
/// @{
inline isl::pw_aff operator%(isl::pw_aff Left, isl::pw_aff Right) {
  return Left.tdiv_r(Right);
}

inline isl::pw_aff operator%(isl::val ValLeft, isl::pw_aff Right) {
  isl::pw_aff Left(Right.domain(), ValLeft);
  return Left.tdiv_r(Right);
}

inline isl::pw_aff operator%(isl::pw_aff Left, isl::val ValRight) {
  isl::pw_aff Right(Left.domain(), ValRight);
  return Left.tdiv_r(Right);
}

inline isl::pw_aff operator%(long IntLeft, isl::pw_aff Right) {
  isl::ctx Ctx = Right.ctx();
  isl::val ValLeft(Ctx, IntLeft);
  isl::pw_aff Left(Right.domain(), ValLeft);
  return Left.tdiv_r(Right);
}

inline isl::pw_aff operator%(isl::pw_aff Left, long IntRight) {
  isl::ctx Ctx = Left.ctx();
  isl::val ValRight(Ctx, IntRight);
  isl::pw_aff Right(Left.domain(), ValRight);
  return Left.tdiv_r(Right);
}
/// @}

} // namespace polly

#endif // POLLY_ISLOPERATORS_H
