50 const std::string_view& name)
const {
51 std::bitset<seed_digits> seed_bits = m_seed.value();
52 std::bitset<event_num_digits> event_num_bits = evt_num;
53#if EDM4HEP_BUILD_VERSION >= EDM4HEP_VERSION(0, 99, 2)
54 std::bitset<run_num_digits> run_num_bits = run_num;
57 std::bitset<run_num_digits> run_num_bits =
static_cast<std::uint32_t
>(run_num);
59 std::bitset<name_digits> name_bits = std::hash<std::string_view>{}(name);
61 std::bitset<seed_digits + event_num_digits + run_num_digits + name_digits> combined_bits;
63 for (
size_t i = 0; i < name_digits; i++) {
64 combined_bits[i] = name_bits[i];
66 for (
size_t i = 0; i < run_num_digits; i++) {
67 combined_bits[i + name_digits] = run_num_bits[i];
69 for (
size_t i = 0; i < event_num_digits; i++) {
70 combined_bits[i + run_num_digits + name_digits] = event_num_bits[i];
72 for (
size_t i = 0; i < seed_digits; i++) {
73 combined_bits[i + event_num_digits + run_num_digits + name_digits] = seed_bits[i];
77 std::hash<std::bitset<seed_digits + event_num_digits + run_num_digits + name_digits>>{}(
80 if (m_checkDuplicates) {
81 auto [it, inserted] = [=,
this, &name]() {
82 std::lock_guard<std::mutex> lock(m_mutex);
83 return m_uniqueIDs.insert({hash, {evt_num, run_num, std::string{name}}});
86 const auto& [id_evt, id_run, id_name] = it->second;
88 throw std::runtime_error(fmt::format(
89 "Duplicate ID for event number, run number and algorithm name: {}, {}, \"{}\". "
90 "ID already assigned to: {}, {}, \"{}\"",
91 evt_num, run_num, name, id_evt, id_run, id_name));
107 mutable std::unordered_map<size_t, std::tuple<event_num_t, run_num_t, std::string>, std::identity>