reader_fsm.hpp 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /* Copyright (c) 2018-2025 Marcelo Zimbres Silva (mzimbres@gmail.com)
  2. *
  3. * Distributed under the Boost Software License, Version 1.0. (See
  4. * accompanying file LICENSE.txt)
  5. */
  6. #ifndef BOOST_REDIS_READER_FSM_HPP
  7. #define BOOST_REDIS_READER_FSM_HPP
  8. #include <boost/redis/detail/connection_state.hpp>
  9. #include <boost/redis/detail/multiplexer.hpp>
  10. #include <boost/asio/cancellation_type.hpp>
  11. #include <boost/system/error_code.hpp>
  12. #include <chrono>
  13. #include <cstddef>
  14. namespace boost::redis::detail {
  15. class read_buffer;
  16. class reader_fsm {
  17. public:
  18. class action {
  19. public:
  20. enum class type
  21. {
  22. read_some,
  23. notify_push_receiver,
  24. done,
  25. };
  26. action(system::error_code ec) noexcept
  27. : type_(type::done)
  28. , ec_(ec)
  29. { }
  30. static action read_some(std::chrono::steady_clock::duration timeout) { return {timeout}; }
  31. static action notify_push_receiver(std::size_t bytes) { return {bytes}; }
  32. type get_type() const { return type_; }
  33. system::error_code error() const
  34. {
  35. BOOST_ASSERT(type_ == type::done);
  36. return ec_;
  37. }
  38. std::chrono::steady_clock::duration timeout() const
  39. {
  40. BOOST_ASSERT(type_ == type::read_some);
  41. return timeout_;
  42. }
  43. std::size_t push_size() const
  44. {
  45. BOOST_ASSERT(type_ == type::notify_push_receiver);
  46. return push_size_;
  47. }
  48. private:
  49. action(std::size_t push_size) noexcept
  50. : type_(type::notify_push_receiver)
  51. , push_size_(push_size)
  52. { }
  53. action(std::chrono::steady_clock::duration t) noexcept
  54. : type_(type::read_some)
  55. , timeout_(t)
  56. { }
  57. type type_;
  58. union {
  59. system::error_code ec_;
  60. std::chrono::steady_clock::duration timeout_;
  61. std::size_t push_size_{};
  62. };
  63. };
  64. action resume(
  65. connection_state& st,
  66. std::size_t bytes_read,
  67. system::error_code ec,
  68. asio::cancellation_type_t cancel_state);
  69. reader_fsm() = default;
  70. private:
  71. int resume_point_{0};
  72. std::pair<consume_result, std::size_t> res_{consume_result::needs_more, 0u};
  73. };
  74. } // namespace boost::redis::detail
  75. #endif // BOOST_REDIS_READER_FSM_HPP