C++ UNO Coding Hints
Author: Daniel Bölzle
I want to show some common hints and peephole optimizations concerning
C++ Any
and Reference<>
objects,
although most of them have formerly been posted on interface-announce.
Here we go:
don't use:
Any ret; ret <<= xFoo; return ret;
for better performance use:return makeAny( xFoo );
BTW: You can usemakeAny()
and<<=, >>=
with every C++-UNO type and the C++ bool, except forsal_Unicode
which conflicts withsal_uInt16
, e.g.return makeAny( static_cast< sal_Int64 >(42) ); return makeAny( Sequence< OUString >() ); return makeAny( false );
butsal_Unicode c = 'a'; return Any( &c, ::getCppuCharType() );
don't use:
Reference< XFoo > x; ... x = Reference< XFoo >( xSomething, UNO_QUERY );
for better performance use:Reference< XFoo > x; ... x.set( xSomething, UNO_QUERY );
The following code:
Any any; ... Reference< XFoo > x; any >>= x;
can alternatively be written as:Any any; ... Reference< XFoo > x( any, UNO_QUERY );
orReference< XFoo > x; ... x.set( any, UNO_QUERY );
Additionally I recommend using UNO_QUERY_THROW
(instead of UNO_QUERY
). This will throw a
::com::sun::star::uno::RuntimeException
with message
"unsatisfied query for interface of type ...!"
in case a query was not successful. Using UNO_QUERY_THROW
often leads to shorter code, e.g.
Reference< XFoo > xFoo( xBar, UNO_QUERY );
if (! xFoo.is())
{
throw RuntimeException(..."got no XFoo!"...);
}
xFoo->foo();
=>
Reference< XFoo >( xBar, UNO_QUERY_THROW )->foo();
Anything more you want to appear here? Write to us!
Last update: 16-Oct-2012