1103285Sikob// -*- C++ -*- 2103285Sikob//===----------------------------------------------------------------------===// 3103285Sikob// 4103285Sikob// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5103285Sikob// See https://llvm.org/LICENSE.txt for license information. 6103285Sikob// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7103285Sikob// 8103285Sikob//===----------------------------------------------------------------------===// 9103285Sikob 10103285Sikob#ifndef _LIBCPP___NUMERIC_EXCLUSIVE_SCAN_H 11103285Sikob#define _LIBCPP___NUMERIC_EXCLUSIVE_SCAN_H 12103285Sikob 13103285Sikob#include <__config> 14103285Sikob#include <__functional/operations.h> 15103285Sikob#include <__utility/move.h> 16103285Sikob 17103285Sikob#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 18103285Sikob# pragma GCC system_header 19103285Sikob#endif 20103285Sikob 21103285Sikob_LIBCPP_BEGIN_NAMESPACE_STD 22103285Sikob 23103285Sikob#if _LIBCPP_STD_VER > 14 24103285Sikob 25103285Sikobtemplate <class _InputIterator, class _OutputIterator, class _Tp, class _BinaryOp> 26103285Sikob_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator 27103285Sikobexclusive_scan(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Tp __init, _BinaryOp __b) { 28103285Sikob if (__first != __last) { 29103285Sikob _Tp __tmp(__b(__init, *__first)); 30103285Sikob while (true) { 31103285Sikob *__result = _VSTD::move(__init); 32103285Sikob ++__result; 33103285Sikob ++__first; 34103285Sikob if (__first == __last) 35103285Sikob break; 36103285Sikob __init = _VSTD::move(__tmp); 37103285Sikob __tmp = __b(__init, *__first); 38103285Sikob } 39103285Sikob } 40103285Sikob return __result; 41103285Sikob} 42103285Sikob 43103285Sikobtemplate <class _InputIterator, class _OutputIterator, class _Tp> 44103285Sikob_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator 45103285Sikobexclusive_scan(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Tp __init) { 46103285Sikob return _VSTD::exclusive_scan(__first, __last, __result, __init, _VSTD::plus<>()); 47103285Sikob} 48103285Sikob 49103285Sikob#endif // _LIBCPP_STD_VER > 14 50103285Sikob 51103285Sikob_LIBCPP_END_NAMESPACE_STD 52103285Sikob 53103285Sikob#endif // _LIBCPP___NUMERIC_EXCLUSIVE_SCAN_H 54103285Sikob