Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

61 righe
1.3 KiB

  1. #pragma once
  2. #include "timeout_stream.h"
  3. namespace asyncpp {
  4. namespace timing {
  5. /* timeout_stream */
  6. template<
  7. typename T_inner>
  8. template<
  9. typename X_inner,
  10. typename X_base,
  11. typename X_ratio>
  12. timeout_stream<T_inner>::timeout_stream(
  13. X_inner&& p_inner,
  14. const duration<X_base, X_ratio>& p_timeout)
  15. : _inner (std::forward<X_inner>(p_inner))
  16. , _timeout (p_timeout)
  17. , _delay (asyncpp::now() + p_timeout)
  18. { }
  19. template<
  20. typename T_inner>
  21. template<
  22. typename X_base,
  23. typename X_ratio>
  24. void timeout_stream<T_inner>
  25. ::reset(const duration<X_base, X_ratio>& p_timeout)
  26. {
  27. _timeout = p_timeout;
  28. _delay.reset(_timeout);
  29. }
  30. template<
  31. typename T_inner>
  32. typename timeout_stream<T_inner>::result_type
  33. timeout_stream<T_inner>
  34. ::poll()
  35. {
  36. auto r = _inner.poll();
  37. if (r.is_not_ready())
  38. {
  39. if (_delay.poll())
  40. {
  41. _delay.reset(_timeout);
  42. throw timing::timeout_exception();
  43. }
  44. }
  45. else
  46. {
  47. _delay.reset(_timeout);
  48. }
  49. return r;
  50. }
  51. } }