call_delayed.h 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. // This file is part of Desktop App Toolkit,
  2. // a set of libraries for developing nice desktop applications.
  3. //
  4. // For license and copyright information please follow this link:
  5. // https://github.com/desktop-app/legal/blob/master/LEGAL
  6. //
  7. #pragma once
  8. namespace base {
  9. void call_delayed(crl::time delay, FnMut<void()> &&callable);
  10. template <
  11. typename Guard,
  12. typename Callable,
  13. typename GuardTraits = crl::guard_traits<std::decay_t<Guard>>,
  14. typename = std::enable_if_t<
  15. sizeof(GuardTraits) != crl::details::dependent_zero<GuardTraits>>>
  16. inline void call_delayed(
  17. crl::time delay,
  18. Guard &&object,
  19. Callable &&callable) {
  20. return call_delayed(delay, crl::guard(
  21. std::forward<Guard>(object),
  22. std::forward<Callable>(callable)));
  23. }
  24. template <typename Guard, typename Callable>
  25. [[nodiscard]] inline auto fn_delayed(
  26. crl::time delay,
  27. Guard &&object,
  28. Callable &&callable) {
  29. auto guarded = crl::guard(
  30. std::forward<Guard>(object),
  31. std::forward<Callable>(callable));
  32. return [saved = std::move(guarded), delay] {
  33. auto copy = saved;
  34. base::call_delayed(delay, std::move(copy));
  35. };
  36. }
  37. } // namespace base