2020-12-26 14:12:05 -08:00
|
|
|
// Copyright (c) FIRST and other WPILib contributors.
|
|
|
|
|
// Open Source Software; you can modify and/or share it under the terms of
|
|
|
|
|
// the WPILib BSD license file in the root directory of this project.
|
2019-11-29 18:13:40 -05:00
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
2020-12-28 12:58:06 -08:00
|
|
|
#include <algorithm>
|
2023-11-15 21:13:12 -08:00
|
|
|
#include <cstddef>
|
|
|
|
|
#include <utility>
|
2019-11-29 18:13:40 -05:00
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
|
|
namespace wpi {
|
|
|
|
|
|
2022-12-26 14:32:13 -05:00
|
|
|
// Binary insertion into vector; std::log(n) efficiency.
|
2019-11-29 18:13:40 -05:00
|
|
|
template <typename T>
|
|
|
|
|
typename std::vector<T>::iterator insert_sorted(std::vector<T>& vec,
|
|
|
|
|
T const& item) {
|
|
|
|
|
return vec.insert(std::upper_bound(vec.begin(), vec.end(), item), item);
|
|
|
|
|
}
|
2023-11-15 21:13:12 -08:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Calls f(i, elem) for each element of elems where i is the index of the
|
|
|
|
|
* element in elems and elem is the element.
|
|
|
|
|
*
|
|
|
|
|
* @param f The callback.
|
|
|
|
|
* @param elems The elements.
|
|
|
|
|
*/
|
|
|
|
|
template <typename F, typename... Ts>
|
|
|
|
|
constexpr void for_each(F&& f, Ts&&... elems) {
|
|
|
|
|
[&]<size_t... Is>(std::index_sequence<Is...>) {
|
|
|
|
|
(f(Is, elems), ...);
|
|
|
|
|
}(std::index_sequence_for<Ts...>{});
|
|
|
|
|
}
|
|
|
|
|
|
2019-11-29 18:13:40 -05:00
|
|
|
} // namespace wpi
|