> On Oct. 30, 2015, 1:19 a.m., Alan Conway wrote:
> > I have what I think is a simpler implementation of connection options, I 
> > can't update the reviewboard look at:
> > https://github.com/alanconway/qpid-proton/commit/7eb1e87c1fdc8a72422b36770acbe0d3fa2deb1c
> > 
> > The logic is Cliff's (if I didn't miss anything) but the impl is shorter 
> > and I think more readable. If we like this we could do the same for link 
> > options.
> > 
> > NO-JIRA: Simpler implementation of connection options.
> > 
> > This is a simpler implementation of connection_options
> > 
> > - More compact, option tests and apply logic together in one apply() 
> > function.
> > - No limit on number of options that can be chained in call to connect()
> > - Simple value semantics. No need for virtual clone(), inheritance, 
> > pointers.
> > - Fewer heap allocations - one per option set, not per individual option.
> > 
> > Options class is pimpl with no virtuals so no binary compat issues adding 
> > new options.
> > 
> > /** Options for creating a connection.
> >  *
> >  * Options can be "chained" like this:
> >  *
> >  * c = container.connect(url, 
> > connection_options().handler(h).max_frame_size(1234));
> >  *
> >  * You can also create an options object with common settings and use it as 
> > a base
> >  * for different connections that have mostly the same settings:
> >  *
> >  * connection_options opts;
> >  * opts.idle_timeout(1000).max_frame_size(10000);
> >  * c1 = container.connect(url1, opts.handler(h1));
> >  * c2 = container.connect(url2, opts.handler(h2));
> >  *
> >  * Normal value semantics, copy or assign creates a separate copy of the 
> > options.
> >  */
> 
> Andrew Stitcher wrote:
>     I think I prefer Alan's implementation.
>     
>     I note that using variadic templates (in C++11 and on) you can get a 
> perhaps maore natural connection constructor allowing multiple options - 
> Either as a constructor for connection_options or at the end of the 
> connection constructor. So we should definately allow that in a modern C++ 
> compiler, but we can add that later.
>     
>     That would look like:
>     
>     Either
>       c = container.connect(url, handler(h), max_frame_size(1234));
>     Or
>       c = container.connect(url, 
> connection_options(handler(h).max_frame_size(1234)));
> 
> Andrew Stitcher wrote:
>     Oops - for that last I meant:
>       c = container.connect(url, connection_options(handler(h), 
> max_frame_size(1234)));

I'm assuming your Oops was meant to say:

    c = container.connect(url, 
connection_options().handler(h).max_frame_size(1234));

Also one issue with the varadic approach: presumably your option names would 
have to be in the global scope, so "handler" wouldn't work - it works in my 
approach because it is a member of connection_options. One way to deal with 
that would be to put the varadic versions in a namespace:

    namespace copts { 
        // define handler, max_frame_size etc.
    }
    
    // Now you have a choice:
    c = container.connect(url, copts::handler(h), copts::max_frame_size(1234))
    // OR
    using namespace copts;
    c = container.connect(url, handler(h), max_frame_size(1234))
    
That's how we managed the naming of boost optional arguments waaay back in the 
old days of the qpid::client.


- Alan


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/39694/#review104505
-----------------------------------------------------------


On Oct. 27, 2015, 6:21 p.m., Cliff Jansen wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/39694/
> -----------------------------------------------------------
> 
> (Updated Oct. 27, 2015, 6:21 p.m.)
> 
> 
> Review request for qpid, Alan Conway, Andrew Stitcher, and Justin Ross.
> 
> 
> Bugs: PROTON-865
>     https://issues.apache.org/jira/browse/PROTON-865
> 
> 
> Repository: qpid-proton-git
> 
> 
> Description
> -------
> 
> This provides connection options (broadly similar to link options).
> 
> As suggested by Alan, the collection connection_options is a subclass of the 
> base connection_option so that they can be grouped and nested.
> 
> They can also be copied and persisted via respective clone methods.  
> Reconnect and transport options need to live as long as the connection.  The 
> handler option is special and needs to be extracted before other options to 
> be available when the connection is created.
> 
> Incoming (listener) connection options are perhaps missing a feature.  You 
> can set global server connection options on a container, and you can set 
> separate ssl_domain creds per listener, but you cannot set other connection 
> options (idle_timeout/max_frame_size etc) per listener.  This is reflected in 
> Proton-C's acceptor and the readable events that it intercepts.  There is no 
> way to query the C API to find out which listener is the parent of an 
> incoming connection or transfer other listener-specific context to the 
> connection.
> 
> As suggested in the link options review, I attempted to provide an 
> initializer_list<foo> constructor and append, but that requires array 
> elements of identical size.  The varying size of the connection option types 
> is unhelpful here.  Maybe they should be counted_ptr based pimpl structs of 
> identical size.
> 
> This patch can also be viewed as the "reconnect" branch of 
> https://github.com/cliffjansen/qpid-proton.
> 
> 
> Diffs
> -----
> 
>   examples/cpp/CMakeLists.txt 34edb83 
>   examples/cpp/connection_options.cpp PRE-CREATION 
>   proton-c/bindings/cpp/CMakeLists.txt 9f423fb 
>   proton-c/bindings/cpp/include/proton/connection_options.hpp PRE-CREATION 
>   proton-c/bindings/cpp/include/proton/container.hpp 059416f 
>   proton-c/bindings/cpp/include/proton/reconnect_timer.hpp PRE-CREATION 
>   proton-c/bindings/cpp/include/proton/transport.hpp 3d602b7 
>   proton-c/bindings/cpp/src/blocking_connection_impl.cpp 8abd24b 
>   proton-c/bindings/cpp/src/connection.cpp 1b35e03 
>   proton-c/bindings/cpp/src/connection_options.cpp PRE-CREATION 
>   proton-c/bindings/cpp/src/connector.hpp b311cc9 
>   proton-c/bindings/cpp/src/connector.cpp 49660ea 
>   proton-c/bindings/cpp/src/container.cpp 13f12d9 
>   proton-c/bindings/cpp/src/container_impl.hpp ec356e2 
>   proton-c/bindings/cpp/src/container_impl.cpp fc97a3e 
>   proton-c/bindings/cpp/src/reconnect_timer.cpp PRE-CREATION 
>   proton-c/bindings/cpp/src/transport.cpp 58114ae 
> 
> Diff: https://reviews.apache.org/r/39694/diff/
> 
> 
> Testing
> -------
> 
> Linux only
> 
> 
> Thanks,
> 
> Cliff Jansen
> 
>

Reply via email to