/* longdouble.h -- Definitions of floating-point access for the frontend.
   Copyright (C) 2015-2021 Free Software Foundation, Inc.

GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.

GCC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */

#ifndef GCC_D_LONGDOUBLE_H
#define GCC_D_LONGDOUBLE_H

struct real_value;
class Type;

struct longdouble
{
public:
  /* Return the hidden real_value from the longdouble type.  */
  const real_value &rv (void) const
  { return *(const real_value *) this; }

  real_value &rv (void)
  { return *(real_value *) this; }

  /* Normalize the value to be the precision supported by target.  */
  longdouble normalize (void);

  /* No constructor to be able to use this class in a union.  */
  template <typename T> longdouble &operator = (T x)
  { set (x); return *this; }

  /* Lvalue operators.  */
  void set (real_value &d);
  void set (int32_t d);
  void set (int64_t d);
  void set (uint32_t d);
  void set (uint64_t d);
  void set (bool d);

  /* Rvalue operators.  */
  bool to_bool () const;
  int64_t to_int () const;
  uint64_t to_uint () const;

  operator int32_t (void)
  { return (int32_t) this->to_int (); }

  operator int64_t (void)
  { return this->to_int (); }

  operator uint32_t (void)
  { return (uint32_t) this->to_uint (); }

  operator uint64_t (void)
  { return this->to_uint (); }

  operator bool (void)
  { return this->to_bool (); }

  /* Arithmetic operators.  */
  longdouble add (const longdouble &r) const;
  longdouble sub (const longdouble &r) const;
  longdouble mul (const longdouble &r) const;
  longdouble div (const longdouble &r) const;
  longdouble mod (const longdouble &r) const;
  longdouble neg () const;

  longdouble operator + (const longdouble &r)
  { return this->add (r); }

  longdouble operator - (const longdouble &r)
  { return this->sub (r); }

  longdouble operator * (const longdouble &r)
  { return this->mul (r); }

  longdouble operator / (const longdouble &r)
  { return this->div (r); }

  longdouble operator % (const longdouble &r)
  { return this->mod (r); }

  longdouble operator - (void)
  { return this->neg (); }

  /* Comparison operators.  */
  int cmp (const longdouble &t) const;
  int equals (const longdouble &t) const;

  bool operator < (const longdouble &r)
  { return this->cmp (r) < 0; }

  bool operator <= (const longdouble &r)
  { return this->cmp (r) <= 0; }

  bool operator > (const longdouble &r)
  { return this->cmp (r) > 0; }

  bool operator >= (const longdouble &r)
  { return this->cmp (r) >= 0; }

  bool operator == (const longdouble &r)
  { return this->equals (r); }

  bool operator != (const longdouble &r)
  { return !this->equals (r); }

private:
  /* Including gcc/real.h presents too many problems, so just
     statically allocate enough space for REAL_VALUE_TYPE.  */
  long realvalue[(2 + (16 + sizeof (long)) / sizeof (long))];
};

/* Declared, but "volatile" is not required.  */
typedef longdouble volatile_longdouble;

/* Use ldouble() to explicitly create a longdouble value.  */
template <typename T>
inline longdouble
ldouble (T x)
{
  longdouble d;
  d.set (x);
  return d;
}

#endif  /* GCC_D_LONGDOUBLE_H  */
