// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2010, 2013 Jitse Niesen <jitse@maths.leeds.ac.uk>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
// SPDX-License-Identifier: MPL-2.0

#ifndef EIGEN_STEM_FUNCTION
#define EIGEN_STEM_FUNCTION

// IWYU pragma: private
#include "./InternalHeaderCheck.h"

namespace Eigen {

namespace internal {

/** \brief The exponential function (and its derivatives). */
template <typename Scalar>
Scalar stem_function_exp(Scalar x, int) {
  using std::exp;
  return exp(x);
}

/** \brief Cosine (and its derivatives). */
template <typename Scalar>
Scalar stem_function_cos(Scalar x, int n) {
  Scalar res;

  switch (n % 4) {
    case 0:
      res = numext::cos(x);
      break;
    case 1:
      res = -numext::sin(x);
      break;
    case 2:
      res = -numext::cos(x);
      break;
    case 3:
      res = numext::sin(x);
      break;
  }
  return res;
}

/** \brief Sine (and its derivatives). */
template <typename Scalar>
Scalar stem_function_sin(Scalar x, int n) {
  Scalar res;

  switch (n % 4) {
    case 0:
      res = numext::sin(x);
      break;
    case 1:
      res = numext::cos(x);
      break;
    case 2:
      res = -numext::sin(x);
      break;
    case 3:
      res = -numext::cos(x);
      break;
  }
  return res;
}

/** \brief Hyperbolic cosine (and its derivatives). */
template <typename Scalar>
Scalar stem_function_cosh(Scalar x, int n) {
  Scalar res;

  switch (n % 2) {
    case 0:
      res = numext::cosh(x);
      break;
    case 1:
      res = numext::sinh(x);
      break;
  }
  return res;
}

/** \brief Hyperbolic sine (and its derivatives). */
template <typename Scalar>
Scalar stem_function_sinh(Scalar x, int n) {
  Scalar res;

  switch (n % 2) {
    case 0:
      res = numext::sinh(x);
      break;
    case 1:
      res = numext::cosh(x);
      break;
  }
  return res;
}

}  // end namespace internal

}  // end namespace Eigen

#endif  // EIGEN_STEM_FUNCTION
