Mapping of Sequence Types
An IDL sequence is mapped to:
template< class t > com::sun::star::uno::Sequence< t >
The sequence class is a reference to a reference counted handle that is allocated on the heap.
The sequence follows a copy-on-modify strategy. If a sequence is about to be modified, it is checked if the reference count of the sequence is 1. If this is the case, it gets modified directly, otherwise a copy of the sequence is created that has a reference count of 1.
A sequence can be created with an arbitrary UNO type as element type, but do not use a non-UNO type. The full reflection data provided by the type library are needed for construction, destruction and comparison.
You can construct a sequence with an initial number of elements. Each element is default constructed.
{ // create an integer sequence with 3 elements, // elements default to zero. Sequence< sal_Int32 > seqInt( 3 ); // get a read/write array pointer (this method checks for // the refcount and does a copy on demand). sal_Int32 *pArray = seqInt.getArray(); // if you know, that the refocunt is one // as in this case, where the sequence has just been // constructed, you could avoid the check, // which is a C-call overhead, // by writing sal_Int32 *pArray = (sal_Int32*) seqInt.getConstArray(); // modify the members pArray[0] = 4; pArray[1] = 5; pArray[2] = 3; }
You can also initialize a sequence from an array of the same type by using a different constructor. The new sequence is allocated on the heap and all elements are copied from the source.
{ sal_Int32 sourceArray[3] = {3,5,3}; // result is the same as above, but we initialize from a buffer. Sequence< sal_Int32 > seqInt( sourceArray , 3 ); }
Complex UNO types like structs can be stored within sequences, too:
{ // construct a sequence of Property structs, // the structs are default constructed Sequence< Property > seqProperty(2); seqProperty[0].Name = OUString::createFromAscii( "A" ); seqProperty[0].Handle = 0; seqProperty[1].Name = OUString::createFromAscii( "B" ); seqProperty[1].Handle = 1; // copy construct the sequence (The refcount is raised) Sequence< Property > seqProperty2 = seqProperty; // access a sequence for( sal_Int32 i = 0 ; i < seqProperty.getLength() ; i ++ ) { // Please NOTE : seqProperty.getArray() would also work, but // it is more expensive, because a // unnessecary copy construction // of the sequence takes place. printf( "%d\n" , seqProperty.getConstArray()[i].Handle ); } }
The size of sequences can be changed using the realloc()
method, which takes the new number of elements as a parameter. For instance:
// construct an empty sequence Sequence < Any > anySequence; // get your enumeration from somewhere Reference< XEnumeration > rEnum = ...; // iterate over the enumeration while( rEnum->hasMoreElements() ) { anySequence.realloc( anySequence.getLength() + 1 ); anySequence[anySequence.getLength()-1] = rEnum->nextElement(); }
The above code shows an enumeration is transformed into a sequence, using an inefficient method. The realloc()
default constructs a new element at the end of the sequence. If the sequence is shrunk by realloc
, the elements at the end are destroyed.
The sequence is meant as a transportation container only, therefore it lacks methods for efficient insertion and removal of elements. Use a C++ Standard Template Library vector as an intermediate container to manipulate a list of elements and finally copy the elements into the sequence.
Sequences of a specific type are a fully supported UNO type. There can also be a sequence of sequences. This is similar to a multidimensional array with the exception that each row may vary in length. For instance:
{ sal_Int32 a[ ] = { 1,2,3 }, b[] = {4,5,6}, c[] = {7,8,9,10}; Sequence< Sequence< sal_Int32 > > aaSeq ( 3 ); aaSeq[0] = Sequence< sal_Int32 >( a , 3 ); aaSeq[1] = Sequence< sal_Int32 >( b , 3 ); aaSeq[2] = Sequence< sal_Int32 >( c , 4 ); }
is a valid sequence of sequence< sal_Int32>
.
The maximal length of a com::sun::star::uno::Sequence
is limited; therefore, it is an error if a UNO sequence that is too long is used in the context of the C++ language binding.
Content on this page is licensed under the Public Documentation License (PDL). |