Specific API of oneDPL

namespace dpstd {

// Declared in <dpstd/iterators.h>

  template <typename Integral>
  class counting_iterator;

  template <typename... Iterators>
  class zip_iterator;
  template <typename... Iterators>
  zip_iterator<Iterators...> make_zip_iterator(Iterators...);

  template <typename UnaryFunc, typename Iterator>
  class transform_iterator;
  template <typename UnaryFunc, typename Iterator>
  transform_iterator<UnaryFunc, Iterator> make_transform_iterator(Iterator, UnaryFunc);


// Declared in <dpstd/functional>

  struct identity;

// Defined in <dpstd/algorithm>

  template<typename Policy, typename InputKeyIt, typename InputValueIt, typename OutputValueIt>
  OutputValueIt
  exclusive_scan_by_segment(Policy&& policy, InputKeyIt keys_first, InputKeyIt keys_last,
                            InputValueIt values_first, OutputValueIt values_result);

  template<typename Policy, typename InputKeyIt, typename InputValueIt, typename OutputValueIt,
           typename T>
  OutputValueIt
  exclusive_scan_by_segment(Policy&& policy, InputKeyIt keys_first, InputKeyIt keys_last,
                            InputValueIt values_first, OutputValueIt values_result,
                            T init);

  template<typename Policy, typename InputKeyIt, typename InputValueIt, typename OutputValueIt,
           typename T, typename BinaryPredicate>
  OutputValueIt
  exclusive_scan_by_segment(Policy&& policy, InputKeyIt keys_first, InputKeyIt keys_last,
                            InputValueIt values_first, OutputValueIt values_result,
                            T init, BinaryPredicate binary_pred);

  template<typename Policy, typename InputKeyIt, typename InputValueIt, typename OutputValueIt,
           typename T, typename BinaryPredicate, typename BinaryOp>
  OutputValueIt
  exclusive_scan_by_segment(Policy&& policy, InputKeyIt keys_first, InputKeyIt keys_last,
                            InputValueIt values_first, OutputValueIt values_result,
                            T init, BinaryPredicate binary_pred, BinaryOp binary_op);

  template<typename Policy, typename InputKeyIt, typename InputValueIt, typename OutputValueIt>
  OutputValueIt
  inclusive_scan_by_segment(Policy&& policy, InputKeyIt keys_first, InputKeyIt keys_last,
                            InputValueIt values_first, OutputValueIt values_result);

  template<typename Policy, typename InputKeyIt, typename InputValueIt, typename OutputValueIt,
           typename BinaryPred>
  OutputValueIt
  inclusive_scan_by_segment(Policy&& policy, InputKeyIt keys_first, InputKeyIt keys_last,
                            InputValueIt values_first, OutputValueIt values_result,
                            BinaryPred binary_pred);

  template<typename Policy, typename InputKeyIt, typename InputValueIt, typename OutputValueIt,
           typename BinaryPred, typename BinaryOp>
  OutputValueIt
  inclusive_scan_by_segment(Policy&& policy, InputKeyIt keys_first, InputKeyIt keys_last,
                            InputValueIt values_first, OutputValueIt values_result,
                            BinaryPred binary_pred, BinaryOp binary_op);

  template<typename Policy, typename InputKeyIt, typename InputValueIt, typename OutputKeyIt,
           typename OutputValueIt>
  std::pair<OutputKeyIt,OutputValueIt>
  reduce_by_segment(Policy&& policy, InputKeyIt keys_first, InputKeyIt keys_last,
                    InputValueIt values_first, OutputKeyIt keys_result, OutputValueIt values_result);

  template<typename Policy, typename InputKeyIt, typename InputValueIt, typename OutputKeyIt,
           typename OutputValueIt, typename BinaryPred>
  std::pair<OutputKeyIt,OutputValueIt>
  reduce_by_segment(Policy&& policy, InputKeyIt keys_first, InputKeyIt keys_last,
                    InputValueIt values_first, OutputKeyIt keys_result, OutputValueIt values_result,
                    BinaryPred binary_pred);

  template<typename Policy, typename InputKeyIt, typename InputValueIt, typename OutputKeyIt,
           typename OutputValueIt, typename BinaryPred, typename BinaryOp>
  std::pair<OutputKeyIt,OutputValueIt>
  reduce_by_segment(Policy&& policy, InputKeyIt keys_first, InputKeyIt keys_last,
                    InputValueIt values_first, OutputKeyIt keys_result, OutputValueIt values_result,
                    BinaryPred binary_pred, BinaryOp binary_op);

}