You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by as...@apache.org on 2016/06/15 18:17:42 UTC

qpid-proton git commit: PROTON-1232: [C++ binding] change container interface: - Make all member functions in container class pure virtual (except destructor) - Add a new standard_container class that has the standard behaviour of the variant overloads

Repository: qpid-proton
Updated Branches:
  refs/heads/master ab6b74732 -> b005b877a


PROTON-1232: [C++ binding] change container interface:
- Make all member functions in container class pure virtual (except destructor)
- Add a new standard_container class that has the standard behaviour
  of the variant overloads
- Make all container implementations use standard_container class
- Remove unnecessary includes of container_impl


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/b005b877
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/b005b877
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/b005b877

Branch: refs/heads/master
Commit: b005b877a62630a6fdcb62f2270827af56737830
Parents: ab6b747
Author: Andrew Stitcher <as...@apache.org>
Authored: Tue Jun 14 18:05:13 2016 -0400
Committer: Andrew Stitcher <as...@apache.org>
Committed: Wed Jun 15 13:49:17 2016 -0400

----------------------------------------------------------------------
 examples/cpp/mt/epoll_container.cpp             |  5 ++
 .../bindings/cpp/include/proton/container.hpp   | 73 +++++++++++++++-----
 .../include/proton/io/container_impl_base.hpp   |  6 +-
 proton-c/bindings/cpp/src/connection.cpp        |  1 -
 proton-c/bindings/cpp/src/connector.cpp         |  1 -
 proton-c/bindings/cpp/src/container.cpp         | 39 +++--------
 proton-c/bindings/cpp/src/container_impl.hpp    |  9 ++-
 proton-c/bindings/cpp/src/link.cpp              |  1 -
 proton-c/bindings/cpp/src/messaging_adapter.cpp |  1 -
 proton-c/bindings/cpp/src/session.cpp           |  1 -
 .../bindings/cpp/src/test_dummy_container.hpp   | 10 ++-
 11 files changed, 92 insertions(+), 55 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b005b877/examples/cpp/mt/epoll_container.cpp
----------------------------------------------------------------------
diff --git a/examples/cpp/mt/epoll_container.cpp b/examples/cpp/mt/epoll_container.cpp
index 63b6a5f..4dd1525 100644
--- a/examples/cpp/mt/epoll_container.cpp
+++ b/examples/cpp/mt/epoll_container.cpp
@@ -104,6 +104,11 @@ class epoll_container : public proton::io::container_impl_base {
     epoll_container(const std::string& id);
     ~epoll_container();
 
+    // Pull in base class functions here so that name search finds all the overloads
+    using standard_container::stop;
+    using standard_container::connect;
+    using standard_container::listen;
+
     proton::returned<proton::connection> connect(
         const std::string& addr, const proton::connection_options& opts) OVERRIDE;
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b005b877/proton-c/bindings/cpp/include/proton/container.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/container.hpp b/proton-c/bindings/cpp/include/proton/container.hpp
index 16f63fd..cbf6e7d 100644
--- a/proton-c/bindings/cpp/include/proton/container.hpp
+++ b/proton-c/bindings/cpp/include/proton/container.hpp
@@ -25,6 +25,8 @@
 #include "./connection_options.hpp"
 #include "./function.hpp"
 #include "./listener.hpp"
+#include "./receiver_options.hpp"
+#include "./sender_options.hpp"
 #include "./thread_safe.hpp"
 
 #include "./internal/config.hpp"
@@ -75,7 +77,7 @@ class PN_CPP_CLASS_EXTERN container {
     virtual returned<connection> connect(const std::string& url, const connection_options &) = 0;
 
     /// Connect to `url` and send an open request to the remote peer.
-    PN_CPP_EXTERN returned<connection> connect(const std::string& url);
+    virtual returned<connection> connect(const std::string& url) = 0;
 
     /// @cond INTERNAL
     /// Stop listening on url, must match the url string given to listen().
@@ -95,11 +97,11 @@ class PN_CPP_CLASS_EXTERN container {
 
     /// Listen with a fixed set of options for all accepted connections.
     /// See listen(const std::string&, listen_handler&)
-    PN_CPP_EXTERN listener listen(const std::string& url, const connection_options&);
+    virtual listener listen(const std::string& url, const connection_options&) = 0;
 
     /// Start listening on URL.
     /// New connections will use the handler from server_connection_options()
-    PN_CPP_EXTERN listener listen(const std::string& url);
+    virtual listener listen(const std::string& url) = 0;
 
     /// Run the container in this thread.
     /// Returns when the container stops.
@@ -124,17 +126,17 @@ class PN_CPP_CLASS_EXTERN container {
 
     /// Stop the container with an empty error condition.
     /// @see stop(const error_condition&)
-    PN_CPP_EXTERN void stop();
+    virtual void stop() = 0;
 
     /// Open a connection and sender for `url`.
-    PN_CPP_EXTERN returned<sender> open_sender(const std::string &url);
+    virtual returned<sender> open_sender(const std::string &url) = 0;
 
     /// Open a connection and sender for `url`.
     ///
     /// Any supplied sender options will override the container's
     /// template options.
-    PN_CPP_EXTERN returned<sender> open_sender(const std::string &url,
-                                               const proton::sender_options &o);
+    virtual returned<sender> open_sender(const std::string &url,
+                                         const proton::sender_options &o) = 0;
 
     /// Open a connection and sender for `url`.
     ///
@@ -145,15 +147,15 @@ class PN_CPP_CLASS_EXTERN container {
                                          const connection_options &c) = 0;
 
     /// Open a connection and receiver for `url`.
-    PN_CPP_EXTERN returned<receiver> open_receiver(const std::string&url);
+    virtual returned<receiver> open_receiver(const std::string&url) = 0;
 
 
     /// Open a connection and receiver for `url`.
     ///
     /// Any supplied receiver options will override the container's
     /// template options.
-    PN_CPP_EXTERN returned<receiver> open_receiver(const std::string&url,
-                                                   const proton::receiver_options &o);
+    virtual returned<receiver> open_receiver(const std::string&url,
+                                             const proton::receiver_options &o) = 0;
 
     /// Open a connection and receiver for `url`.
     ///
@@ -208,6 +210,36 @@ class PN_CPP_CLASS_EXTERN container {
     virtual void schedule(duration, void_function0&) = 0;
 };
 
+/// @cond INTERNAL
+/// This class is intended for container implementers, it simplifies implementing container
+/// by performing all the default actions for shortened method signatures
+///
+/// Note: This class will only be useful if you want all the ususal defaulted behaviours
+/// in your class as it makes them all non virtual, so you can't use just some of them.
+///
+/// It means that in the usual case the container interface is smaller and a little simpler.
+class PN_CPP_CLASS_EXTERN standard_container : public container {
+  public:
+    // Pull in base class functions here so we don't need to define them again
+    using container::stop;
+    using container::connect;
+    using container::listen;
+    using container::open_receiver;
+    using container::open_sender;
+
+    PN_CPP_EXTERN returned<connection> connect(const std::string& url);
+    PN_CPP_EXTERN listener listen(const std::string& url, const connection_options&);
+    PN_CPP_EXTERN listener listen(const std::string& url);
+    PN_CPP_EXTERN void stop();
+    PN_CPP_EXTERN returned<sender> open_sender(const std::string &url);
+    PN_CPP_EXTERN returned<sender> open_sender(const std::string &url,
+                                               const proton::sender_options &o);
+    PN_CPP_EXTERN returned<receiver> open_receiver(const std::string&url);
+    PN_CPP_EXTERN returned<receiver> open_receiver(const std::string&url,
+                                                           const proton::receiver_options &o);
+};
+/// @endcond
+
 /// This is an header only class that can be used to help using containers more natural
 /// by allowing them to be treated as value types.
 template <class Ptr>
@@ -221,31 +253,38 @@ class container_ref : public container {
     container_ref(Ptr p) : impl_(p) {}
 #endif
 
-    // Pull in base class functions here so we don't need to define them again
-    using container::stop;
-    using container::connect;
-    using container::listen;
-    using container::open_receiver;
-    using container::open_sender;
-
     returned<connection> connect(const std::string& url, const connection_options& opts) { return impl_->connect(url, opts); }
+    returned<connection> connect(const std::string& url) { return impl_->connect(url); }
     listener listen(const std::string& url, listen_handler& l) { return impl_->listen(url, l); }
+    listener listen(const std::string& url, const connection_options& opts) { return impl_->listen(url, opts); }
+    listener listen(const std::string& url) { return impl_->listen(url); }
 
     void stop_listening(const std::string& url) { impl_->stop_listening(url); }
     void run() { impl_->run(); }
     void auto_stop(bool set) { impl_->auto_stop(set); }
 
     void stop(const error_condition& err) { impl_->stop(err); }
+    void stop() { impl_->stop(); }
 
     returned<sender> open_sender(
         const std::string &url,
         const class sender_options &o,
         const connection_options &c) { return impl_->open_sender(url, o, c); }
+    returned<sender> open_sender(
+        const std::string &url,
+        const class sender_options &o) { return impl_->open_sender(url, o); }
+    returned<sender> open_sender(
+        const std::string &url) { return impl_->open_sender(url); }
 
     returned<receiver> open_receiver(
         const std::string&url,
         const class receiver_options &o,
         const connection_options &c) { return impl_->open_receiver(url, o, c); }
+    returned<receiver> open_receiver(
+        const std::string&url,
+        const class receiver_options &o) { return impl_->open_receiver(url, o); }
+    returned<receiver> open_receiver(
+        const std::string&url) { return impl_->open_receiver(url); }
 
     std::string id() const { return impl_->id(); }
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b005b877/proton-c/bindings/cpp/include/proton/io/container_impl_base.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/io/container_impl_base.hpp b/proton-c/bindings/cpp/include/proton/io/container_impl_base.hpp
index 313e675..695125d 100644
--- a/proton-c/bindings/cpp/include/proton/io/container_impl_base.hpp
+++ b/proton-c/bindings/cpp/include/proton/io/container_impl_base.hpp
@@ -39,8 +39,12 @@ namespace io {
 ///
 /// You can ignore this class if you want to implement the functions
 /// in a different way.
-class container_impl_base : public container {
+class container_impl_base : public standard_container {
   public:
+    // Pull in base class functions here so that name search finds all the overloads
+    using standard_container::open_receiver;
+    using standard_container::open_sender;
+
     /// @copydoc container::client_connection_options
     void client_connection_options(const connection_options & opts) {
         store(client_copts_, opts);

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b005b877/proton-c/bindings/cpp/src/connection.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/connection.cpp b/proton-c/bindings/cpp/src/connection.cpp
index 9219517..45164fe 100644
--- a/proton-c/bindings/cpp/src/connection.cpp
+++ b/proton-c/bindings/cpp/src/connection.cpp
@@ -29,7 +29,6 @@
 #include "proton/transport.hpp"
 
 #include "connector.hpp"
-#include "container_impl.hpp"
 #include "contexts.hpp"
 #include "msg.hpp"
 #include "proton_bits.hpp"

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b005b877/proton-c/bindings/cpp/src/connector.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/connector.cpp b/proton-c/bindings/cpp/src/connector.cpp
index c03826c..d1b6936 100644
--- a/proton-c/bindings/cpp/src/connector.cpp
+++ b/proton-c/bindings/cpp/src/connector.cpp
@@ -20,7 +20,6 @@
  */
 
 #include "connector.hpp"
-#include "container_impl.hpp"
 
 #include "proton/connection.hpp"
 #include "proton/transport.hpp"

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b005b877/proton-c/bindings/cpp/src/container.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/container.cpp b/proton-c/bindings/cpp/src/container.cpp
index d8a6061..4ba6a6a 100644
--- a/proton-c/bindings/cpp/src/container.cpp
+++ b/proton-c/bindings/cpp/src/container.cpp
@@ -19,54 +19,35 @@
  *
  */
 
-#include "container_impl.hpp"
-
 #include "proton/container.hpp"
-#include "proton/connection.hpp"
-#include "proton/sender_options.hpp"
-#include "proton/receiver_options.hpp"
-#include "proton/session.hpp"
-#include "proton/error.hpp"
-#include "proton/receiver.hpp"
-#include "proton/receiver_options.hpp"
-#include "proton/sender.hpp"
-#include "proton/sender_options.hpp"
-#include "proton/task.hpp"
-#include "proton/url.hpp"
-
-#include "container_impl.hpp"
-#include "connector.hpp"
-#include "contexts.hpp"
-#include "messaging_adapter.hpp"
 
-#include <proton/connection.h>
-#include <proton/session.h>
+#include "proton/listen_handler.hpp"
 
 namespace proton {
 
 container::~container() {}
 
-/// Functions defined here are convenience overrides that can be triviall
+/// Functions defined here are convenience overrides that can be trivially
 /// defined in terms of other pure virtual functions on container. Don't make
 /// container implementers wade thru all this boiler-plate.
 
-returned<connection> container::connect(const std::string &url) {
+returned<connection> standard_container::connect(const std::string &url) {
     return connect(url, connection_options());
 }
 
-returned<sender> container::open_sender(const std::string &url) {
+returned<sender> standard_container::open_sender(const std::string &url) {
     return open_sender(url, proton::sender_options(), connection_options());
 }
 
-returned<sender> container::open_sender(const std::string &url, const proton::sender_options &lo) {
+returned<sender> standard_container::open_sender(const std::string &url, const proton::sender_options &lo) {
     return open_sender(url, lo, connection_options());
 }
 
-returned<receiver> container::open_receiver(const std::string &url) {
+returned<receiver> standard_container::open_receiver(const std::string &url) {
     return open_receiver(url, proton::receiver_options(), connection_options());
 }
 
-returned<receiver> container::open_receiver(const std::string &url, const proton::receiver_options &lo) {
+returned<receiver> standard_container::open_receiver(const std::string &url, const proton::receiver_options &lo) {
     return open_receiver(url, lo, connection_options());
 }
 
@@ -79,17 +60,17 @@ namespace{
     };
 }
 
-listener container::listen(const std::string& url, const connection_options& opts) {
+listener standard_container::listen(const std::string& url, const connection_options& opts) {
     // Note: listen_opts::on_close() calls delete(this) so this is not a leak.
     // The container will always call on_closed() even if there are errors or exceptions. 
     listen_opts* lh = new listen_opts(opts);
     return listen(url, *lh);
 }
 
-listener container::listen(const std::string &url) {
+listener standard_container::listen(const std::string &url) {
     return listen(url, connection_options());
 }
 
-void container::stop() { stop(error_condition()); }
+void standard_container::stop() { stop(error_condition()); }
 
 } // namespace proton

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b005b877/proton-c/bindings/cpp/src/container_impl.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/container_impl.hpp b/proton-c/bindings/cpp/src/container_impl.hpp
index 07f2563..9ffb7bb 100644
--- a/proton-c/bindings/cpp/src/container_impl.hpp
+++ b/proton-c/bindings/cpp/src/container_impl.hpp
@@ -49,8 +49,15 @@ class url;
 class task;
 class listen_handler;
 
-class container_impl : public container {
+class container_impl : public standard_container {
   public:
+    // Pull in base class functions here so that name search finds all the overloads
+    using standard_container::stop;
+    using standard_container::connect;
+    using standard_container::listen;
+    using standard_container::open_receiver;
+    using standard_container::open_sender;
+
     container_impl(const std::string& id, messaging_handler* = 0);
     ~container_impl();
     std::string id() const PN_CPP_OVERRIDE { return id_; }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b005b877/proton-c/bindings/cpp/src/link.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/link.cpp b/proton-c/bindings/cpp/src/link.cpp
index 6a00101..eb4ccb1 100644
--- a/proton-c/bindings/cpp/src/link.cpp
+++ b/proton-c/bindings/cpp/src/link.cpp
@@ -29,7 +29,6 @@
 #include <proton/session.h>
 #include <proton/link.h>
 
-#include "container_impl.hpp"
 #include "contexts.hpp"
 #include "msg.hpp"
 #include "proton_bits.hpp"

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b005b877/proton-c/bindings/cpp/src/messaging_adapter.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/messaging_adapter.cpp b/proton-c/bindings/cpp/src/messaging_adapter.cpp
index eba6c06..e74fa4e 100644
--- a/proton-c/bindings/cpp/src/messaging_adapter.cpp
+++ b/proton-c/bindings/cpp/src/messaging_adapter.cpp
@@ -27,7 +27,6 @@
 #include "proton/tracker.hpp"
 #include "proton/transport.hpp"
 
-#include "container_impl.hpp"
 #include "contexts.hpp"
 #include "msg.hpp"
 #include "proton_bits.hpp"

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b005b877/proton-c/bindings/cpp/src/session.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/session.cpp b/proton-c/bindings/cpp/src/session.cpp
index abb7399..03d8cd1 100644
--- a/proton-c/bindings/cpp/src/session.cpp
+++ b/proton-c/bindings/cpp/src/session.cpp
@@ -27,7 +27,6 @@
 #include "proton/session_options.hpp"
 
 #include "contexts.hpp"
-#include "container_impl.hpp"
 #include "proton_bits.hpp"
 
 #include <string>

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b005b877/proton-c/bindings/cpp/src/test_dummy_container.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/test_dummy_container.hpp b/proton-c/bindings/cpp/src/test_dummy_container.hpp
index 24bb415..4af432a 100644
--- a/proton-c/bindings/cpp/src/test_dummy_container.hpp
+++ b/proton-c/bindings/cpp/src/test_dummy_container.hpp
@@ -29,14 +29,20 @@ namespace test {
 using namespace proton;
 
 
-class dummy_container : public container {
+class dummy_container : public standard_container {
   public:
     dummy_container(const std::string cid="") :
         id_(cid), fail("not implemented for dummy_container") {}
 
+    // Pull in base class functions here so that name search finds all the overloads
+    using standard_container::stop;
+    using standard_container::connect;
+    using standard_container::listen;
+    using standard_container::open_receiver;
+    using standard_container::open_sender;
+
     returned<connection> connect(const std::string&, const connection_options&) { throw fail; }
     listener listen(const std::string& , listen_handler& ) { throw fail; }
-    listener listen(const std::string&, const connection_options&) { throw fail; }
     void stop_listening(const std::string&) { throw fail; }
     void run() { throw fail; }
     void auto_stop(bool) { throw fail; }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org