// Copyright (C) 2009-2021 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library.  This library 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.

// This library 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 this library; see the file COPYING3.  If not see
// <http://www.gnu.org/licenses/>.

// { dg-require-effective-target dfp }

// ISO/IEC TR 24733  3.2.2.6  Compound assignment (decimal32).
// ISO/IEC TR 24733  3.2.3.6  Compound assignment (decimal64).
// ISO/IEC TR 24733  3.2.4.6  Compound assignment (decimal128).

// Access member functions directly.

#include <decimal/decimal>
#include <testsuite_hooks.h>

using namespace std::decimal;

decimal32 d32 (5);
decimal64 d64 (-10);
decimal128 d128 (25);
int si = -2;
unsigned int ui = 5;
long sl = -10;
unsigned long ul = 20;
long long sll = -25;
unsigned long long ull = 50;

void
compound_assignment_add_32 (void)
{
  decimal32 a (1000), b;

  b = a; b.operator+=(d32);  VERIFY (b == 1005);
  b = a; b.operator+=(d64);  VERIFY (b == 990);
  b = a; b.operator+=(d128); VERIFY (b == 1025);
  b = a; b.operator+=(si);   VERIFY (b == 998);
  b = a; b.operator+=(ui);   VERIFY (b == 1005);
  b = a; b.operator+=(sl);   VERIFY (b == 990);
  b = a; b.operator+=(ul);   VERIFY (b == 1020);
  b = a; b.operator+=(sll);  VERIFY (b == 975);
  b = a; b.operator+=(ull);  VERIFY (b == 1050);
}

void
compound_assignment_subtract_32 (void)
{
  decimal32 a (1000), b;

  b = a; b.operator-=(d32);  VERIFY (b == 995);
  b = a; b.operator-=(d64);  VERIFY (b == 1010);
  b = a; b.operator-=(d128); VERIFY (b == 975);
  b = a; b.operator-=(si);   VERIFY (b == 1002);
  b = a; b.operator-=(ui);   VERIFY (b == 995);
  b = a; b.operator-=(sl);   VERIFY (b == 1010);
  b = a; b.operator-=(ul);   VERIFY (b == 980);
  b = a; b.operator-=(sll);  VERIFY (b == 1025);
  b = a; b.operator-=(ull);  VERIFY (b == 950);
}

void
compound_assignment_multiply_32 (void)
{
  decimal32 a (1000), b;

  b = a; b.operator*=(d32);  VERIFY (b == 5000);
  b = a; b.operator*=(d64);  VERIFY (b == -10000);
  b = a; b.operator*=(d128); VERIFY (b == 25000);
  b = a; b.operator*=(si);   VERIFY (b == -2000);
  b = a; b.operator*=(ui);   VERIFY (b == 5000);
  b = a; b.operator*=(sl);   VERIFY (b == -10000);
  b = a; b.operator*=(ul);   VERIFY (b == 20000);
  b = a; b.operator*=(sll);  VERIFY (b == -25000);
  b = a; b.operator*=(ull);  VERIFY (b == 50000);
}

void
compound_assignment_divide_32 (void)
{
  decimal32 a (1000), b;

  b = a; b.operator/=(d32);  VERIFY (b == 200);
  b = a; b.operator/=(d64);  VERIFY (b == -100);
  b = a; b.operator/=(d128); VERIFY (b == 40);
  b = a; b.operator/=(si);   VERIFY (b == -500);
  b = a; b.operator/=(ui);   VERIFY (b == 200);
  b = a; b.operator/=(sl);   VERIFY (b == -100);
  b = a; b.operator/=(ul);   VERIFY (b == 50);
  b = a; b.operator/=(sll);  VERIFY (b == -40);
  b = a; b.operator/=(ull);  VERIFY (b == 20);
}

void
compound_assignment_add_64 (void)
{
  decimal64 a (1000), b;

  b = a; b.operator+=(d32);  VERIFY (b == 1005);
  b = a; b.operator+=(d64);  VERIFY (b == 990);
  b = a; b.operator+=(d128); VERIFY (b == 1025);
  b = a; b.operator+=(si);   VERIFY (b == 998);
  b = a; b.operator+=(ui);   VERIFY (b == 1005);
  b = a; b.operator+=(sl);   VERIFY (b == 990);
  b = a; b.operator+=(ul);   VERIFY (b == 1020);
  b = a; b.operator+=(sll);  VERIFY (b == 975);
  b = a; b.operator+=(ull);  VERIFY (b == 1050);
}

void
compound_assignment_subtract_64 (void)
{
  decimal64 a (1000), b;

  b = a; b.operator-=(d32);  VERIFY (b == 995);
  b = a; b.operator-=(d64);  VERIFY (b == 1010);
  b = a; b.operator-=(d128); VERIFY (b == 975);
  b = a; b.operator-=(si);   VERIFY (b == 1002);
  b = a; b.operator-=(ui);   VERIFY (b == 995);
  b = a; b.operator-=(sl);   VERIFY (b == 1010);
  b = a; b.operator-=(ul);   VERIFY (b == 980);
  b = a; b.operator-=(sll);  VERIFY (b == 1025);
  b = a; b.operator-=(ull);  VERIFY (b == 950);
}

void
compound_assignment_multiply_64 (void)
{
  decimal64 a (1000), b;

  b = a; b.operator*=(d32);  VERIFY (b == 5000);
  b = a; b.operator*=(d64);  VERIFY (b == -10000);
  b = a; b.operator*=(d128); VERIFY (b == 25000);
  b = a; b.operator*=(si);   VERIFY (b == -2000);
  b = a; b.operator*=(ui);   VERIFY (b == 5000);
  b = a; b.operator*=(sl);   VERIFY (b == -10000);
  b = a; b.operator*=(ul);   VERIFY (b == 20000);
  b = a; b.operator*=(sll);  VERIFY (b == -25000);
  b = a; b.operator*=(ull);  VERIFY (b == 50000);
}

void
compound_assignment_divide_64 (void)
{
  decimal64 a (1000), b;

  b = a; b.operator/=(d32);  VERIFY (b == 200);
  b = a; b.operator/=(d64);  VERIFY (b == -100);
  b = a; b.operator/=(d128); VERIFY (b == 40);
  b = a; b.operator/=(si);   VERIFY (b == -500);
  b = a; b.operator/=(ui);   VERIFY (b == 200);
  b = a; b.operator/=(sl);   VERIFY (b == -100);
  b = a; b.operator/=(ul);   VERIFY (b == 50);
  b = a; b.operator/=(sll);  VERIFY (b == -40);
  b = a; b.operator/=(ull);  VERIFY (b == 20);
}

void
compound_assignment_add_128 (void)
{
  decimal128 a (1000), b;

  b = a; b.operator+=(d32);  VERIFY (b == 1005);
  b = a; b.operator+=(d64);  VERIFY (b == 990);
  b = a; b.operator+=(d128); VERIFY (b == 1025);
  b = a; b.operator+=(si);   VERIFY (b == 998);
  b = a; b.operator+=(ui);   VERIFY (b == 1005);
  b = a; b.operator+=(sl);   VERIFY (b == 990);
  b = a; b.operator+=(ul);   VERIFY (b == 1020);
  b = a; b.operator+=(sll);  VERIFY (b == 975);
  b = a; b.operator+=(ull);  VERIFY (b == 1050);
}

void
compound_assignment_subtract_128 (void)
{
  decimal128 a (1000), b;

  b = a; b.operator-=(d32);  VERIFY (b == 995);
  b = a; b.operator-=(d64);  VERIFY (b == 1010);
  b = a; b.operator-=(d128); VERIFY (b == 975);
  b = a; b.operator-=(si);   VERIFY (b == 1002);
  b = a; b.operator-=(ui);   VERIFY (b == 995);
  b = a; b.operator-=(sl);   VERIFY (b == 1010);
  b = a; b.operator-=(ul);   VERIFY (b == 980);
  b = a; b.operator-=(sll);  VERIFY (b == 1025);
  b = a; b.operator-=(ull);  VERIFY (b == 950);
}

void
compound_assignment_multiply_128 (void)
{
  decimal128 a (1000), b;

  b = a; b.operator*=(d32);  VERIFY (b == 5000);
  b = a; b.operator*=(d64);  VERIFY (b == -10000);
  b = a; b.operator*=(d128); VERIFY (b == 25000);
  b = a; b.operator*=(si);   VERIFY (b == -2000);
  b = a; b.operator*=(ui);   VERIFY (b == 5000);
  b = a; b.operator*=(sl);   VERIFY (b == -10000);
  b = a; b.operator*=(ul);   VERIFY (b == 20000);
  b = a; b.operator*=(sll);  VERIFY (b == -25000);
  b = a; b.operator*=(ull);  VERIFY (b == 50000);
}

void
compound_assignment_divide_128 (void)
{
  decimal128 a (1000), b;

  b = a; b.operator/=(d32);  VERIFY (b == 200);
  b = a; b.operator/=(d64);  VERIFY (b == -100);
  b = a; b.operator/=(d128); VERIFY (b == 40);
  b = a; b.operator/=(si);   VERIFY (b == -500);
  b = a; b.operator/=(ui);   VERIFY (b == 200);
  b = a; b.operator/=(sl);   VERIFY (b == -100);
  b = a; b.operator/=(ul);   VERIFY (b == 50);
  b = a; b.operator/=(sll);  VERIFY (b == -40);
  b = a; b.operator/=(ull);  VERIFY (b == 20);
}

int
main ()
{
  compound_assignment_add_32 ();
  compound_assignment_subtract_32 ();
  compound_assignment_multiply_32 ();
  compound_assignment_divide_32 ();

  compound_assignment_add_64 ();
  compound_assignment_subtract_64 ();
  compound_assignment_multiply_64 ();
  compound_assignment_divide_64 ();

  compound_assignment_add_128 ();
  compound_assignment_subtract_128 ();
  compound_assignment_multiply_128 ();
  compound_assignment_divide_128 ();
}
