@@ -365,123 +365,110 @@ Context::on_shutdown(OnShutdownCallback callback)
365365rclcpp::OnShutdownCallbackHandle
366366Context::add_on_shutdown_callback (OnShutdownCallback callback)
367367{
368- return add_shutdown_callback ( ShutdownType::on_shutdown, callback);
368+ return add_shutdown_callback< ShutdownType::on_shutdown>( callback);
369369}
370370
371371bool
372372Context::remove_on_shutdown_callback (const OnShutdownCallbackHandle & callback_handle)
373373{
374- return remove_shutdown_callback ( ShutdownType::on_shutdown, callback_handle);
374+ return remove_shutdown_callback< ShutdownType::on_shutdown>( callback_handle);
375375}
376376
377377rclcpp::PreShutdownCallbackHandle
378378Context::add_pre_shutdown_callback (PreShutdownCallback callback)
379379{
380- return add_shutdown_callback ( ShutdownType::pre_shutdown, callback);
380+ return add_shutdown_callback< ShutdownType::pre_shutdown>( callback);
381381}
382382
383383bool
384384Context::remove_pre_shutdown_callback (
385385 const PreShutdownCallbackHandle & callback_handle)
386386{
387- return remove_shutdown_callback ( ShutdownType::pre_shutdown, callback_handle);
387+ return remove_shutdown_callback< ShutdownType::pre_shutdown>( callback_handle);
388388}
389389
390+ template <Context::ShutdownType shutdown_type>
390391rclcpp::ShutdownCallbackHandle
391392Context::add_shutdown_callback (
392- ShutdownType shutdown_type,
393393 ShutdownCallback callback)
394394{
395395 auto callback_shared_ptr =
396396 std::make_shared<ShutdownCallbackHandle::ShutdownCallbackType>(callback);
397397
398- switch (shutdown_type) {
399- case ShutdownType::pre_shutdown:
400- {
401- std::lock_guard<std::mutex> lock (pre_shutdown_callbacks_mutex_);
402- pre_shutdown_callbacks_.emplace (callback_shared_ptr);
403- }
404- break ;
405- case ShutdownType::on_shutdown:
406- {
407- std::lock_guard<std::mutex> lock (on_shutdown_callbacks_mutex_);
408- on_shutdown_callbacks_.emplace (callback_shared_ptr);
409- }
410- break ;
398+ static_assert (
399+ shutdown_type == ShutdownType::pre_shutdown || shutdown_type == ShutdownType::on_shutdown);
400+
401+ if constexpr (shutdown_type == ShutdownType::pre_shutdown) {
402+ std::lock_guard<std::mutex> lock (pre_shutdown_callbacks_mutex_);
403+ pre_shutdown_callbacks_.emplace (callback_shared_ptr);
404+ } else {
405+ std::lock_guard<std::mutex> lock (on_shutdown_callbacks_mutex_);
406+ on_shutdown_callbacks_.emplace (callback_shared_ptr);
411407 }
412408
413409 ShutdownCallbackHandle callback_handle;
414410 callback_handle.callback = callback_shared_ptr;
415411 return callback_handle;
416412}
417413
414+ template <Context::ShutdownType shutdown_type>
418415bool
419416Context::remove_shutdown_callback (
420- ShutdownType shutdown_type,
421417 const ShutdownCallbackHandle & callback_handle)
422418{
423- std::mutex * mutex_ptr = nullptr ;
424- std::unordered_set<
425- std::shared_ptr<ShutdownCallbackHandle::ShutdownCallbackType>> * callback_list_ptr;
426-
427- switch (shutdown_type) {
428- case ShutdownType::pre_shutdown:
429- mutex_ptr = &pre_shutdown_callbacks_mutex_;
430- callback_list_ptr = &pre_shutdown_callbacks_;
431- break ;
432- case ShutdownType::on_shutdown:
433- mutex_ptr = &on_shutdown_callbacks_mutex_;
434- callback_list_ptr = &on_shutdown_callbacks_;
435- break ;
436- }
437-
438- std::lock_guard<std::mutex> lock (*mutex_ptr);
439- auto callback_shared_ptr = callback_handle.callback .lock ();
419+ const auto callback_shared_ptr = callback_handle.callback .lock ();
440420 if (callback_shared_ptr == nullptr ) {
441421 return false ;
442422 }
443- return callback_list_ptr->erase (callback_shared_ptr) == 1 ;
423+
424+ const auto remove_callback = [this , &callback_shared_ptr](auto & mutex, auto & callback_set) {
425+ const std::lock_guard<std::mutex> lock (mutex);
426+ return callback_set.erase (callback_shared_ptr) == 1 ;
427+ };
428+
429+ static_assert (
430+ shutdown_type == ShutdownType::pre_shutdown || shutdown_type == ShutdownType::on_shutdown);
431+
432+ if constexpr (shutdown_type == ShutdownType::pre_shutdown) {
433+ return remove_callback (pre_shutdown_callbacks_mutex_, pre_shutdown_callbacks_);
434+ } else {
435+ return remove_callback (on_shutdown_callbacks_mutex_, on_shutdown_callbacks_);
436+ }
444437}
445438
446439std::vector<rclcpp::Context::OnShutdownCallback>
447440Context::get_on_shutdown_callbacks () const
448441{
449- return get_shutdown_callback ( ShutdownType::on_shutdown);
442+ return get_shutdown_callback< ShutdownType::on_shutdown>( );
450443}
451444
452445std::vector<rclcpp::Context::PreShutdownCallback>
453446Context::get_pre_shutdown_callbacks () const
454447{
455- return get_shutdown_callback ( ShutdownType::pre_shutdown);
448+ return get_shutdown_callback< ShutdownType::pre_shutdown>( );
456449}
457450
451+ template <Context::ShutdownType shutdown_type>
458452std::vector<rclcpp::Context::ShutdownCallback>
459- Context::get_shutdown_callback (ShutdownType shutdown_type ) const
453+ Context::get_shutdown_callback () const
460454{
461- std::mutex * mutex_ptr = nullptr ;
462- const std::unordered_set<
463- std::shared_ptr<ShutdownCallbackHandle::ShutdownCallbackType>> * callback_list_ptr;
464-
465- switch (shutdown_type) {
466- case ShutdownType::pre_shutdown:
467- mutex_ptr = &pre_shutdown_callbacks_mutex_;
468- callback_list_ptr = &pre_shutdown_callbacks_;
469- break ;
470- case ShutdownType::on_shutdown:
471- mutex_ptr = &on_shutdown_callbacks_mutex_;
472- callback_list_ptr = &on_shutdown_callbacks_;
473- break ;
474- }
455+ const auto get_callback_vector = [this ](auto & mutex, auto & callback_set) {
456+ const std::lock_guard<std::mutex> lock (mutex);
457+ std::vector<rclcpp::Context::ShutdownCallback> callbacks;
458+ for (auto & callback : callback_set) {
459+ callbacks.push_back (*callback);
460+ }
461+ return callbacks;
462+ };
475463
476- std::vector<rclcpp::Context::ShutdownCallback> callbacks;
477- {
478- std::lock_guard<std::mutex> lock (*mutex_ptr);
479- for (auto & iter : *callback_list_ptr) {
480- callbacks.emplace_back (*iter);
481- }
482- }
464+ static_assert (
465+ shutdown_type == ShutdownType::pre_shutdown || shutdown_type == ShutdownType::on_shutdown);
483466
484- return callbacks;
467+ if constexpr (shutdown_type == ShutdownType::pre_shutdown) {
468+ return get_callback_vector (pre_shutdown_callbacks_mutex_, pre_shutdown_callbacks_);
469+ } else {
470+ return get_callback_vector (on_shutdown_callbacks_mutex_, on_shutdown_callbacks_);
471+ }
485472}
486473
487474std::shared_ptr<rcl_context_t >
0 commit comments