// Copyright (C) 2009-2025 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 dfprt }

// 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 ();
}
