Program Listing for File ThreadUidNormalizer.hpp¶
↰ Return to documentation for file (include/uitsl/nonce/ThreadUidNormalizer.hpp)
#pragma once
#ifndef UITSL_NONCE_THREADUIDNORMALIZER_HPP_INCLUDE
#define UITSL_NONCE_THREADUIDNORMALIZER_HPP_INCLUDE
#include <functional>
#include <unordered_map>
#include "../mpi/proc_id_t.hpp"
#include "../parallel/thread_utils.hpp"
namespace uitsl {
class ThreadUidNormalizer {
std::function< uitsl::proc_id_t(size_t) > proc_assigner;
std::function< uitsl::thread_id_t(size_t) > thread_assigner;
std::unordered_map<
uitsl::proc_id_t, std::unordered_map<uitsl::thread_id_t, size_t>
> seen;
public:
ThreadUidNormalizer(
const std::function< uitsl::proc_id_t(size_t) >& proc_assigner_,
const std::function< uitsl::thread_id_t(size_t) >& thread_assigner_
) : proc_assigner( proc_assigner_ ), thread_assigner( thread_assigner_ ) {}
size_t operator()( const size_t arg ) {
auto& by_proc_lookup = seen[ proc_assigner( arg ) ];
const auto raw_thread_assignment = thread_assigner( arg );
if ( !by_proc_lookup.count( raw_thread_assignment ) ) {
by_proc_lookup.emplace( raw_thread_assignment, by_proc_lookup.size() );
}
return by_proc_lookup.at( raw_thread_assignment );
}
};
} // namespace uitsl
#endif // #ifndef UITSL_NONCE_THREADUIDNORMALIZER_HPP_INCLUDE