Daniel,

I tend to disagree here, you are certainly free to rely on some interfaces to be available, but you are _not_ allowed to just crash in cases of unavailability, which, if I understand correctly, would / could happen in case of using assertions.

So, I suggest to go with UNO_QUERY_THROW stuff (or similar) anyway.

Kay

Daniel Boelzle wrote:
Hi Frank,

personally, I don't like those _THROW enums anymore and think I was
wrong to add them some years ago. Sure, the need to enforce API
constraints programmatically is still a valid point, e.g. a method
returning a null reference though the API stated the returned ref is
never null has to lead to a RuntimeException.
But I rather would like this decoupled, e.g.

Reference<foo::XBar> x(y->baz()[, UNO_QUERY]);
assureNotNull(x);

IMO more verbose, but clearer to read.

my 2 cents,
-Daniel


Hi,

consider the following C++ code fragment:

  Reference< XFooSupplier > xSupplyFoo( xSomething, UNO_QUERY );
  Reference< XFoo > xFoo;
  if ( xSupplyFoo.is() )
    xFoo = xSupplyFoo->getFoo();
  if ( !xFoo.is() )
    handle_very_serious_contract_breach();

Assume that both xSomething *not* supporting XFooSupplier, and xFoo
*not* returning a non-NULL foo is a serious breach of xSomething's
contract [1].

Now the above code is rather laborious to write. Since quite a while, it
could be shortened to

  Reference< XFooSupplier > xSupplyFoo( xSomething, UNO_QUERY_THROW );
  Reference< XFoo > xFoo( xSupplyFoo->getFoo() );
  if ( !xFoo.is() )
    handle_very_serious_contract_breach();

The UNO_QUERY_THROW here relieves us from testing xSupplyFoo for NULL,
since it will throw a RuntimeException when the interface is not
supported. Nice.

Even shorter:
  Reference< XFooSupplier > xSupplyFoo( xSomething, UNO_QUERY_THROW );
  Reference< XFoo > xFoo( xSupplyFoo->getFoo(), UNO_QUERY_THROW );

This relieves us from *all* checks: A RuntimeException will be thrown
whenever the contract of xSomething is not fulfilled.

The crux here: Creating xFoo involves an additional, unnecessary
queryInterface call. Since those tend to be expensive, that's something
I'd like to avoid where possible.

So, here goes my suggestion: What about introducing some UNO_SET_THROW,
whose usage would look like:

  Reference< XFooSupplier > xSupplyFoo( xSomething, UNO_QUERY_THROW );
  Reference< XFoo > xFoo( xSupplyFoo->getFoo(), UNO_SET_THROW );

, and which would only *set*, but not *query* for the given interface
type. This way, the original code fragment could be ultimately
shortened, by still keeping it as performant as before.

Opinions?

Ciao
Frank

[1] Could we please, this time, refrain from the discussion whether it
    is better to simply crash here when accessing the NULL pointer?
    Thanks.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to