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

#ifndef _LIBCPP___RANDOM_SEED_SEQ_H
#define _LIBCPP___RANDOM_SEED_SEQ_H

#include <__algorithm/copy.h>
#include <__algorithm/fill.h>
#include <__algorithm/max.h>
#include <__config>
#include <cstdint>
#include <initializer_list>
#include <vector>

#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
#  pragma GCC system_header
#endif

_LIBCPP_PUSH_MACROS
#include <__undef_macros>

_LIBCPP_BEGIN_NAMESPACE_STD

class _LIBCPP_TEMPLATE_VIS seed_seq
{
public:
    // types
    typedef uint32_t result_type;

    // constructors
    _LIBCPP_INLINE_VISIBILITY
    seed_seq() _NOEXCEPT {}
#ifndef _LIBCPP_CXX03_LANG
    template<class _Tp, __enable_if_t<is_integral<_Tp>::value>* = nullptr>
    _LIBCPP_INLINE_VISIBILITY
    seed_seq(initializer_list<_Tp> __il) {
        __init(__il.begin(), __il.end());
    }
#endif // _LIBCPP_CXX03_LANG

    template<class _InputIterator>
    _LIBCPP_INLINE_VISIBILITY
    seed_seq(_InputIterator __first, _InputIterator __last) {
        static_assert(is_integral<typename iterator_traits<_InputIterator>::value_type>::value,
            "Mandates: iterator_traits<InputIterator>::value_type is an integer type");
        __init(__first, __last);
    }

    // generating functions
    template<class _RandomAccessIterator>
        void generate(_RandomAccessIterator __first, _RandomAccessIterator __last);

    // property functions
    _LIBCPP_INLINE_VISIBILITY
    size_t size() const _NOEXCEPT {return __v_.size();}
    template<class _OutputIterator>
        _LIBCPP_INLINE_VISIBILITY
        void param(_OutputIterator __dest) const
            {_VSTD::copy(__v_.begin(), __v_.end(), __dest);}

    seed_seq(const seed_seq&) = delete;
    void operator=(const seed_seq&) = delete;

    _LIBCPP_INLINE_VISIBILITY
    static result_type _Tp(result_type __x) {return __x ^ (__x >> 27);}

private:
    template<class _InputIterator>
    void __init(_InputIterator __first, _InputIterator __last);

    vector<result_type> __v_;
};

template<class _InputIterator>
void
seed_seq::__init(_InputIterator __first, _InputIterator __last)
{
    for (_InputIterator __s = __first; __s != __last; ++__s)
        __v_.push_back(*__s & 0xFFFFFFFF);
}

template<class _RandomAccessIterator>
void
seed_seq::generate(_RandomAccessIterator __first, _RandomAccessIterator __last)
{
    if (__first != __last)
    {
        _VSTD::fill(__first, __last, 0x8b8b8b8b);
        const size_t __n = static_cast<size_t>(__last - __first);
        const size_t __s = __v_.size();
        const size_t __t = (__n >= 623) ? 11
                         : (__n >= 68) ? 7
                         : (__n >= 39) ? 5
                         : (__n >= 7)  ? 3
                         : (__n - 1) / 2;
        const size_t __p = (__n - __t) / 2;
        const size_t __q = __p + __t;
        const size_t __m = _VSTD::max(__s + 1, __n);
        // __k = 0;
        {
            result_type __r = 1664525 * _Tp(__first[0] ^ __first[__p]
                                                      ^  __first[__n - 1]);
            __first[__p] += __r;
            __r += __s;
            __first[__q] += __r;
            __first[0] = __r;
        }
        // Initialize indexing terms used with if statements as an optimization to
        // avoid calculating modulo n on every loop iteration for each term.
        size_t __kmodn = 0;          // __k % __n
        size_t __k1modn = __n - 1;   // (__k - 1) % __n
        size_t __kpmodn = __p % __n; // (__k + __p) % __n
        size_t __kqmodn = __q % __n; // (__k + __q) % __n

        for (size_t __k = 1; __k <= __s; ++__k)
        {
          if (++__kmodn == __n)
            __kmodn = 0;
          if (++__k1modn == __n)
            __k1modn = 0;
          if (++__kpmodn == __n)
            __kpmodn = 0;
          if (++__kqmodn == __n)
            __kqmodn = 0;

          result_type __r = 1664525 * _Tp(__first[__kmodn] ^ __first[__kpmodn] ^ __first[__k1modn]);
          __first[__kpmodn] += __r;
          __r += __kmodn + __v_[__k - 1];
          __first[__kqmodn] += __r;
          __first[__kmodn] = __r;
        }
        for (size_t __k = __s + 1; __k < __m; ++__k)
        {
          if (++__kmodn == __n)
            __kmodn = 0;
          if (++__k1modn == __n)
            __k1modn = 0;
          if (++__kpmodn == __n)
            __kpmodn = 0;
          if (++__kqmodn == __n)
            __kqmodn = 0;

          result_type __r = 1664525 * _Tp(__first[__kmodn] ^ __first[__kpmodn] ^ __first[__k1modn]);
          __first[__kpmodn] += __r;
          __r += __kmodn;
          __first[__kqmodn] += __r;
          __first[__kmodn] = __r;
        }
        for (size_t __k = __m; __k < __m + __n; ++__k)
        {
          if (++__kmodn == __n)
            __kmodn = 0;
          if (++__k1modn == __n)
            __k1modn = 0;
          if (++__kpmodn == __n)
            __kpmodn = 0;
          if (++__kqmodn == __n)
            __kqmodn = 0;

          result_type __r = 1566083941 * _Tp(__first[__kmodn] + __first[__kpmodn] + __first[__k1modn]);
          __first[__kpmodn] ^= __r;
          __r -= __kmodn;
          __first[__kqmodn] ^= __r;
          __first[__kmodn] = __r;
        }
    }
}

_LIBCPP_END_NAMESPACE_STD

_LIBCPP_POP_MACROS

#endif // _LIBCPP___RANDOM_SEED_SEQ_H
