Program Listing for File ThreadLocalServiceManager.hpp¶
↰ Return to documentation for file (include/dish2/services_threadlocal/ThreadLocalServiceManager.hpp)
#pragma once
#ifndef DISH2_SERVICES_THREADLOCAL_THREADLOCALSERVICEMANAGER_HPP_INCLUDE
#define DISH2_SERVICES_THREADLOCAL_THREADLOCALSERVICEMANAGER_HPP_INCLUDE
namespace dish2 {
// base case
template<typename... Services> struct ThreadLocalServiceManager {
template<typename ThreadWorld>
static void Run(ThreadWorld& thread_world, const size_t) {}
};
// adapted from https://stackoverflow.com/a/35284581
template<typename FirstService, typename... SubsequentServices>
struct ThreadLocalServiceManager<FirstService, SubsequentServices...> {
template<typename ThreadWorld>
static void Run( ThreadWorld& thread_world, const size_t update ) {
using subsequent_services_t = dish2::ThreadLocalServiceManager<SubsequentServices...>;
if ( FirstService::ShouldRun( update ) ) {
FirstService::DoService( thread_world, update );
}
if constexpr ( sizeof...(SubsequentServices) > 0 ) {
subsequent_services_t::template Run<ThreadWorld>( thread_world, update );
}
}
};
} // namespace dish2
#endif // #ifndef DISH2_SERVICES_THREADLOCAL_THREADLOCALSERVICEMANAGER_HPP_INCLUDE