File indexing completed on 2026-07-26 08:22:00
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011
0012 #include <concepts>
0013 #include <memory>
0014 #include <unordered_set>
0015 #include <utility>
0016
0017 namespace traccc::host {
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038 template <typename P, typename CONTAINER>
0039 requires std::regular_invocable<P,
0040 decltype(std::declval<CONTAINER>().at(0))> &&
0041 std::semiregular<P>
0042 bool is_contiguous_on(P&& projection, const CONTAINER& in) {
0043
0044 typename CONTAINER::size_type n = in.size();
0045
0046
0047 using projection_t =
0048 std::invoke_result_t<P, decltype(std::declval<CONTAINER>().at(0))>;
0049
0050
0051 std::unique_ptr<projection_t[]> iout = std::make_unique<projection_t[]>(n);
0052 std::size_t iout_size = 0;
0053
0054
0055 for (std::size_t i = 0; i < n; ++i) {
0056 if (i == 0) {
0057 iout[iout_size++] =
0058 projection(in.at(static_cast<typename CONTAINER::size_type>(i)));
0059 } else {
0060 projection_t v =
0061 projection(in.at(static_cast<typename CONTAINER::size_type>(i)));
0062
0063 if (v != iout[iout_size - 1]) {
0064 iout[iout_size++] = v;
0065 }
0066 }
0067 }
0068
0069
0070 std::unordered_set<projection_t> seen;
0071
0072 for (std::size_t i = 0; i < iout_size; ++i) {
0073 projection_t& v = iout[i];
0074
0075 if (seen.count(v) == 1) {
0076 return false;
0077 } else {
0078 seen.insert(v);
0079 }
0080 }
0081
0082 return true;
0083 }
0084
0085 }