Difference between revisions of "Documentation/DevGuide/ProUNO/C++/Mapping of Sequence Types"

From Apache OpenOffice Wiki
Jump to: navigation, search
(Initial author Sun Microsystems, Inc.)
 
(Removed duplicated text)
(5 intermediate revisions by 3 users not shown)
Line 7: Line 7:
 
|NextPage=Documentation/DevGuide/ProUNO/C++/Mapping of Services
 
|NextPage=Documentation/DevGuide/ProUNO/C++/Mapping of Services
 
}}
 
}}
 +
{{Documentation/DevGuideLanguages|Documentation/DevGuide/ProUNO/C++/{{SUBPAGENAME}}}}
 
{{DISPLAYTITLE:Mapping of Sequence Types}}
 
{{DISPLAYTITLE:Mapping of Sequence Types}}
  
Line 110: Line 111:
 
The maximal length of a <code>com::sun::star::uno::Sequence</code> 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.
 
The maximal length of a <code>com::sun::star::uno::Sequence</code> 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.
  
=== Mapping of Sequence Types ===
+
{{PDL1}}
  
An IDL ''sequence'' is mapped to:
+
[[Category:Documentation/Developer's Guide/Professional UNO]]
 
+
  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 <code>realloc()</code> 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 <code>realloc()</code> default constructs a new element at the end of the sequence. If the sequence is shrunk by <code>realloc</code>, 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 <code>sequence< sal_Int32></code>.
+
 
+
The maximal length of a <code>com::sun::star::uno::Sequence</code> 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.
+
 
+
{{PDL1}}
+
[[Category: Professional UNO]]
+

Revision as of 13:42, 16 August 2013



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).
Personal tools
In other languages