/* Self tests for parallel_for_each

   Copyright (C) 2021-2022 Free Software Foundation, Inc.

   This file is part of GDB.

   This program 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 of the License, or
   (at your option) any later version.

   This program 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 program.  If not, see <http://www.gnu.org/licenses/>.  */

/* This file is divided in two parts:
   - FOR_EACH-undefined, and
   - FOR_EACH-defined.
   The former includes the latter, more than once, with different values for
   FOR_EACH.  The FOR_EACH-defined part reads like a regular function.  */
#ifndef FOR_EACH

#include "defs.h"
#include "gdbsupport/selftest.h"
#include "gdbsupport/parallel-for.h"

#if CXX_STD_THREAD

#include "gdbsupport/thread-pool.h"

namespace selftests {
namespace parallel_for {

struct save_restore_n_threads
{
  save_restore_n_threads ()
    : n_threads (gdb::thread_pool::g_thread_pool->thread_count ())
  {
  }

  ~save_restore_n_threads ()
  {
    gdb::thread_pool::g_thread_pool->set_thread_count (n_threads);
  }

  int n_threads;
};

/* Define test_par using TEST in the FOR_EACH-defined part.  */
#define TEST test_par
#define FOR_EACH gdb::parallel_for_each
#include "parallel-for-selftests.c"
#undef FOR_EACH
#undef TEST

/* Define test_seq using TEST in the FOR_EACH-defined part.  */
#define TEST test_seq
#define FOR_EACH gdb::sequential_for_each
#include "parallel-for-selftests.c"
#undef FOR_EACH
#undef TEST

static void
test (int n_threads)
{
  test_par (n_threads);
  test_seq (n_threads);
}

static void
test_n_threads ()
{
  test (0);
  test (1);
  test (3);
}

}
}

#endif /* CXX_STD_THREAD */

void _initialize_parallel_for_selftests ();
void
_initialize_parallel_for_selftests ()
{
#ifdef CXX_STD_THREAD
  selftests::register_test ("parallel_for",
			    selftests::parallel_for::test_n_threads);
#endif /* CXX_STD_THREAD */
}

#else /* FOR_EACH */

static void
TEST (int n_threads)
{
  save_restore_n_threads saver;
  gdb::thread_pool::g_thread_pool->set_thread_count (n_threads);

#define NUMBER 10000

  std::atomic<int> counter (0);
  FOR_EACH (1, 0, NUMBER,
	    [&] (int start, int end)
	    {
	      counter += end - start;
	    });
  SELF_CHECK (counter == NUMBER);

  counter = 0;
  FOR_EACH (1, 0, 0,
	    [&] (int start, int end)
	    {
	      counter += end - start;
	    });
  SELF_CHECK (counter == 0);

  auto task_size_max_ = [] (int iter)
    {
      return (size_t)SIZE_MAX;
    };
  auto task_size_max = gdb::make_function_view (task_size_max_);

  counter = 0;
  FOR_EACH (1, 0, NUMBER,
	    [&] (int start, int end)
	    {
	      counter += end - start;
	    }, task_size_max);
  SELF_CHECK (counter == NUMBER);

  auto task_size_one_ = [] (int iter)
    {
      return (size_t)1;
    };
  auto task_size_one = gdb::make_function_view (task_size_one_);

  counter = 0;
  FOR_EACH (1, 0, NUMBER,
	    [&] (int start, int end)
	    {
	      counter += end - start;
	    }, task_size_one);
  SELF_CHECK (counter == NUMBER);

#undef NUMBER
}

#endif /* FOR_EACH */
