// -*- C++ -*-
// -*-===----------------------------------------------------------------------===//
//
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
//
//===----------------------------------------------------------------------===//

#ifndef _PSTL_INTERNAL_OMP_PARALLEL_MERGE_H
#define _PSTL_INTERNAL_OMP_PARALLEL_MERGE_H

#include "util.h"

namespace __pstl
{
namespace __omp_backend
{

template <typename _RandomAccessIterator1, typename _RandomAccessIterator2, typename _RandomAccessIterator3,
          typename _Compare, typename _LeafMerge>
void
__parallel_merge_body(std::size_t __size_x, std::size_t __size_y, _RandomAccessIterator1 __xs,
                      _RandomAccessIterator1 __xe, _RandomAccessIterator2 __ys, _RandomAccessIterator2 __ye,
                      _RandomAccessIterator3 __zs, _Compare __comp, _LeafMerge __leaf_merge)
{

    if (__size_x + __size_y <= __omp_backend::__default_chunk_size)
    {
        __leaf_merge(__xs, __xe, __ys, __ye, __zs, __comp);
        return;
    }

    _RandomAccessIterator1 __xm;
    _RandomAccessIterator2 __ym;

    if (__size_x < __size_y)
    {
        __ym = __ys + (__size_y / 2);
        __xm = std::upper_bound(__xs, __xe, *__ym, __comp);
    }
    else
    {
        __xm = __xs + (__size_x / 2);
        __ym = std::lower_bound(__ys, __ye, *__xm, __comp);
    }

    auto __zm = __zs + (__xm - __xs) + (__ym - __ys);

    _PSTL_PRAGMA(omp task untied mergeable default(none)
                     firstprivate(__xs, __xm, __ys, __ym, __zs, __comp, __leaf_merge))
    __parallel_merge_body(__xm - __xs, __ym - __ys, __xs, __xm, __ys, __ym, __zs, __comp, __leaf_merge);

    _PSTL_PRAGMA(omp task untied mergeable default(none)
                     firstprivate(__xm, __xe, __ym, __ye, __zm, __comp, __leaf_merge))
    __parallel_merge_body(__xe - __xm, __ye - __ym, __xm, __xe, __ym, __ye, __zm, __comp, __leaf_merge);

    _PSTL_PRAGMA(omp taskwait)
}

template <class _ExecutionPolicy, typename _RandomAccessIterator1, typename _RandomAccessIterator2,
          typename _RandomAccessIterator3, typename _Compare, typename _LeafMerge>
void
__parallel_merge(_ExecutionPolicy&& /*__exec*/, _RandomAccessIterator1 __xs, _RandomAccessIterator1 __xe,
                 _RandomAccessIterator2 __ys, _RandomAccessIterator2 __ye, _RandomAccessIterator3 __zs, _Compare __comp,
                 _LeafMerge __leaf_merge)

{
    std::size_t __size_x = __xe - __xs;
    std::size_t __size_y = __ye - __ys;

    /*
     * Run the merge in parallel by chunking it up. Use the smaller range (if any) as the iteration range, and the
     * larger range as the search range.
     */

    if (omp_in_parallel())
    {
        __parallel_merge_body(__size_x, __size_y, __xs, __xe, __ys, __ye, __zs, __comp, __leaf_merge);
    }
    else
    {
        _PSTL_PRAGMA(omp parallel)
        {
            _PSTL_PRAGMA(omp single nowait)
            __parallel_merge_body(__size_x, __size_y, __xs, __xe, __ys, __ye, __zs, __comp, __leaf_merge);
        }
    }
}

} // namespace __omp_backend
} // namespace __pstl
#endif // _PSTL_INTERNAL_OMP_PARALLEL_MERGE_H
