PageRenderTime 54ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/include/zmqh/socket.hpp

https://gitlab.com/MujibAzizi/libzhelper
C++ Header | 208 lines | 161 code | 42 blank | 5 comment | 8 complexity | 6938d4043c0855f5b08cc3827e35ea77 MD5 | raw file
  1. /**
  2. * @file
  3. * @date 13 oct. 2010
  4. * @todo comment
  5. */
  6. #ifndef ZMQH_SOCKET_HPP_
  7. #define ZMQH_SOCKET_HPP_
  8. #include "zmqh/zmqh.hpp"
  9. #include "zmqh/context.hpp"
  10. #include "zmqh/binary.hpp"
  11. #include "zmqh/message.hpp"
  12. #include "zmqh/socket_fwd.hpp"
  13. #include "zmqh/option_fwd.hpp"
  14. #include <string>
  15. #include <iostream>
  16. #include <boost/shared_ptr.hpp>
  17. namespace zmqh {
  18. struct multipart;
  19. namespace socket {
  20. struct socket_base {
  21. operator void*() const;
  22. template< typename option_type_t, typename value_type_t = typename option_type_t::value_type >
  23. void set_option(value_type_t const value_in) {
  24. option_type_t::set(*this, value_in);
  25. }
  26. template< typename option_type_t, typename value_type_t = typename option_type_t::value_type >
  27. value_type_t option() {
  28. return option_type_t::get(*this);
  29. }
  30. void set_id();
  31. void bind(::std::string const& address_in) throw (::zmqh::error_t);
  32. void connect(::std::string const& address_in) throw (::zmqh::error_t);
  33. protected:
  34. socket_base();
  35. socket_base(void const* socket_ptr_in);
  36. ~socket_base() throw (::zmqh::error_t);
  37. void const* const __socket_ptr;
  38. socket_base(socket_base const&);
  39. void operator =(socket_base const&);
  40. bool recv(mode const mode_in, message_t& message_out) throw (::zmqh::error_t);
  41. bool send(mode const mode_in, message_t const& message_out, bool const send_more_in) throw (::zmqh::error_t);
  42. void dump() throw (::zmqh::error_t);
  43. void set_block(bool block_in) {
  44. __block = block_in;
  45. }
  46. bool block() {
  47. return __block;
  48. }
  49. friend struct read_socket;
  50. friend struct write_socket;
  51. private:
  52. bool __block;
  53. };
  54. struct read_socket: public virtual socket_base {
  55. template< mode mode_t = mode::BLOCK >
  56. bool recv(message_t& message_out) throw (::zmqh::error_t) {
  57. return socket_base::recv(mode_t, message_out);
  58. }
  59. template< mode mode_t = mode::BLOCK >
  60. bool recv() throw (::zmqh::error_t) {
  61. message_t message;
  62. return recv< mode_t > (message);
  63. }
  64. template< mode mode_t = mode::BLOCK, typename data_t = binary_t >
  65. bool recv(data_t& data_out) {
  66. message_t message;
  67. bool result_out = recv< mode_t > (message);
  68. data_out = message.data< data_t > ();
  69. return result_out;
  70. }
  71. void dump() throw (::zmqh::error_t) {
  72. socket_base::dump();
  73. }
  74. void set_block(bool block_in) {
  75. socket_base::set_block(block_in);
  76. }
  77. bool block() {
  78. return socket_base::block();
  79. }
  80. };
  81. struct write_socket: public virtual socket_base {
  82. template< mode mode_t = mode::BLOCK >
  83. bool send(message_t const& message_in, bool const send_more_in = false) throw (::zmqh::error_t) {
  84. return socket_base::send(mode_t, message_in, send_more_in);
  85. }
  86. template< mode mode_t = mode::BLOCK >
  87. bool send() {
  88. return send< mode_t > (message_t());
  89. }
  90. template< mode mode_t = mode::BLOCK >
  91. bool send_more() {
  92. return send< mode_t > (message_t(), true);
  93. }
  94. template< mode mode_t = mode::BLOCK, typename data_t >
  95. bool send(data_t const& data_in) {
  96. return send< mode_t > (message_t(data_in));
  97. }
  98. template< mode mode_t = mode::BLOCK, typename data_t >
  99. bool send_more(data_t const& data_in) {
  100. return send< mode_t > (message_t(data_in), true);
  101. }
  102. protected:
  103. void set_more(bool more_in) {
  104. __more = more_in;
  105. }
  106. bool more() {
  107. return __more;
  108. }
  109. write_socket() :
  110. __more(false) {
  111. }
  112. template< typename data_t >
  113. void pend(data_t const& data_in) {
  114. flush();
  115. __pending_message.reset(new message_t(data_in));
  116. }
  117. void pend() {
  118. flush();
  119. __pending_message.reset(new message_t());
  120. }
  121. void flush() {
  122. if (__pending_message.get() == nullptr) {
  123. return;
  124. }
  125. socket_base::send(socket_base::block() ? mode::BLOCK : mode::NO_BLOCK, *__pending_message, __more);
  126. __pending_message.reset();
  127. }
  128. template< typename data_t >
  129. friend write_socket& operator<<(write_socket& socket_inout, data_t const& data_in);
  130. private:
  131. bool __more;
  132. ::boost::shared_ptr< message_t > __pending_message;
  133. };
  134. template< type socket_type_t >
  135. class socket: public read_socket, public write_socket, public virtual socket_base {
  136. public:
  137. explicit socket(context_t const& context_in = context_t::default_) throw (::zmqh::error_t) :
  138. socket_base(zmq_socket(context_in, static_cast< int > (socket_type_t))) {
  139. if (__socket_ptr == nullptr) {
  140. throw ::zmqh::error_t();
  141. }
  142. }
  143. };
  144. template< type socket_type_t >
  145. class read_only_socket: public read_socket, public virtual socket_base {
  146. public:
  147. explicit read_only_socket(context_t const& context_in = context_t::default_) throw (::zmqh::error_t) :
  148. socket_base(zmq_socket(context_in, static_cast< int > (socket_type_t))) {
  149. if (__socket_ptr == nullptr) {
  150. throw ::zmqh::error_t();
  151. }
  152. }
  153. };
  154. template< type socket_type_t >
  155. class write_only_socket: public write_socket, public virtual socket_base {
  156. public:
  157. explicit write_only_socket(context_t const& context_in = context_t::default_) throw (::zmqh::error_t) :
  158. socket_base(zmq_socket(context_in, static_cast< int > (socket_type_t))) {
  159. if (__socket_ptr == nullptr) {
  160. throw ::zmqh::error_t();
  161. }
  162. }
  163. };
  164. } // namespace socket
  165. } // namespace zmqh
  166. #endif /* ZMQH_SOCKET_HPP_ */