1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_UNO_SEQUENCE_H_ 24*b1cdbd2cSJim Jagielski #define _COM_SUN_STAR_UNO_SEQUENCE_H_ 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielski #include "typelib/typedescription.h" 27*b1cdbd2cSJim Jagielski #include "uno/sequence2.h" 28*b1cdbd2cSJim Jagielski #include "com/sun/star/uno/Type.h" 29*b1cdbd2cSJim Jagielski #include "rtl/alloc.h" 30*b1cdbd2cSJim Jagielski 31*b1cdbd2cSJim Jagielski #if ! defined EXCEPTIONS_OFF 32*b1cdbd2cSJim Jagielski #include <new> 33*b1cdbd2cSJim Jagielski #endif 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski 36*b1cdbd2cSJim Jagielski namespace rtl 37*b1cdbd2cSJim Jagielski { 38*b1cdbd2cSJim Jagielski class ByteSequence; 39*b1cdbd2cSJim Jagielski } 40*b1cdbd2cSJim Jagielski 41*b1cdbd2cSJim Jagielski namespace com 42*b1cdbd2cSJim Jagielski { 43*b1cdbd2cSJim Jagielski namespace sun 44*b1cdbd2cSJim Jagielski { 45*b1cdbd2cSJim Jagielski namespace star 46*b1cdbd2cSJim Jagielski { 47*b1cdbd2cSJim Jagielski namespace uno 48*b1cdbd2cSJim Jagielski { 49*b1cdbd2cSJim Jagielski 50*b1cdbd2cSJim Jagielski /** Template C++ class representing an IDL sequence. Template argument is the 51*b1cdbd2cSJim Jagielski sequence element type. C++ Sequences are reference counted and shared, 52*b1cdbd2cSJim Jagielski so the sequence keeps a handle to its data. To keep value semantics, 53*b1cdbd2cSJim Jagielski copies are only generated if the sequence is to be modified (new handle). 54*b1cdbd2cSJim Jagielski 55*b1cdbd2cSJim Jagielski @tplparam E element type of sequence 56*b1cdbd2cSJim Jagielski */ 57*b1cdbd2cSJim Jagielski template< class E > 58*b1cdbd2cSJim Jagielski class Sequence 59*b1cdbd2cSJim Jagielski { 60*b1cdbd2cSJim Jagielski /** sequence handle 61*b1cdbd2cSJim Jagielski @internal 62*b1cdbd2cSJim Jagielski */ 63*b1cdbd2cSJim Jagielski uno_Sequence * _pSequence; 64*b1cdbd2cSJim Jagielski 65*b1cdbd2cSJim Jagielski public: 66*b1cdbd2cSJim Jagielski // these are here to force memory de/allocation to sal lib. 67*b1cdbd2cSJim Jagielski /** @internal */ operator new(size_t nSize)68*b1cdbd2cSJim Jagielski inline static void * SAL_CALL operator new ( size_t nSize ) 69*b1cdbd2cSJim Jagielski SAL_THROW( () ) 70*b1cdbd2cSJim Jagielski { return ::rtl_allocateMemory( nSize ); } 71*b1cdbd2cSJim Jagielski /** @internal */ operator delete(void * pMem)72*b1cdbd2cSJim Jagielski inline static void SAL_CALL operator delete ( void * pMem ) 73*b1cdbd2cSJim Jagielski SAL_THROW( () ) 74*b1cdbd2cSJim Jagielski { ::rtl_freeMemory( pMem ); } 75*b1cdbd2cSJim Jagielski /** @internal */ operator new(size_t,void * pMem)76*b1cdbd2cSJim Jagielski inline static void * SAL_CALL operator new ( size_t, void * pMem ) 77*b1cdbd2cSJim Jagielski SAL_THROW( () ) 78*b1cdbd2cSJim Jagielski { return pMem; } 79*b1cdbd2cSJim Jagielski /** @internal */ operator delete(void *,void *)80*b1cdbd2cSJim Jagielski inline static void SAL_CALL operator delete ( void *, void * ) 81*b1cdbd2cSJim Jagielski SAL_THROW( () ) 82*b1cdbd2cSJim Jagielski {} 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski /** Static pointer to typelib type of sequence. 85*b1cdbd2cSJim Jagielski Don't use directly, call getCppuType(). 86*b1cdbd2cSJim Jagielski @internal 87*b1cdbd2cSJim Jagielski */ 88*b1cdbd2cSJim Jagielski static typelib_TypeDescriptionReference * s_pType; 89*b1cdbd2cSJim Jagielski 90*b1cdbd2cSJim Jagielski /** typedefs the element type of the sequence 91*b1cdbd2cSJim Jagielski */ 92*b1cdbd2cSJim Jagielski typedef E ElementType; 93*b1cdbd2cSJim Jagielski 94*b1cdbd2cSJim Jagielski /** Default constructor: Creates an empty sequence. 95*b1cdbd2cSJim Jagielski */ 96*b1cdbd2cSJim Jagielski inline Sequence() SAL_THROW( () ); 97*b1cdbd2cSJim Jagielski 98*b1cdbd2cSJim Jagielski /** Copy constructor: Creates a copy of given sequence. 99*b1cdbd2cSJim Jagielski 100*b1cdbd2cSJim Jagielski @param rSeq another sequence of same type 101*b1cdbd2cSJim Jagielski */ 102*b1cdbd2cSJim Jagielski inline Sequence( const Sequence< E > & rSeq ) SAL_THROW( () ); 103*b1cdbd2cSJim Jagielski 104*b1cdbd2cSJim Jagielski /** Constructor: Takes over ownership of given sequence. 105*b1cdbd2cSJim Jagielski 106*b1cdbd2cSJim Jagielski @param pSequence a sequence 107*b1cdbd2cSJim Jagielski @param dummy SAL_NO_ACQUIRE to force obvious distinction to other 108*b1cdbd2cSJim Jagielski constructors 109*b1cdbd2cSJim Jagielski */ 110*b1cdbd2cSJim Jagielski inline Sequence( uno_Sequence * pSequence, __sal_NoAcquire ) 111*b1cdbd2cSJim Jagielski SAL_THROW( () ); 112*b1cdbd2cSJim Jagielski 113*b1cdbd2cSJim Jagielski /** Constructor: Creates a copy of given elements. 114*b1cdbd2cSJim Jagielski 115*b1cdbd2cSJim Jagielski @param pElement an array of elements 116*b1cdbd2cSJim Jagielski @param len length of array 117*b1cdbd2cSJim Jagielski */ 118*b1cdbd2cSJim Jagielski inline Sequence( const E * pElements, sal_Int32 len ); 119*b1cdbd2cSJim Jagielski 120*b1cdbd2cSJim Jagielski /** Constructor: Creates a default constructed sequence of given length. 121*b1cdbd2cSJim Jagielski 122*b1cdbd2cSJim Jagielski @param len initial sequence length 123*b1cdbd2cSJim Jagielski */ 124*b1cdbd2cSJim Jagielski inline explicit Sequence( sal_Int32 len ); 125*b1cdbd2cSJim Jagielski 126*b1cdbd2cSJim Jagielski /** Destructor: Releases sequence handle. Last handle will destruct 127*b1cdbd2cSJim Jagielski elements and free memory. 128*b1cdbd2cSJim Jagielski */ 129*b1cdbd2cSJim Jagielski inline ~Sequence() SAL_THROW( () ); 130*b1cdbd2cSJim Jagielski 131*b1cdbd2cSJim Jagielski /** Assignment operator: Acquires given sequence handle and releases 132*b1cdbd2cSJim Jagielski previously set handle. 133*b1cdbd2cSJim Jagielski 134*b1cdbd2cSJim Jagielski @param rSeq another sequence of same type 135*b1cdbd2cSJim Jagielski @return this sequence 136*b1cdbd2cSJim Jagielski */ 137*b1cdbd2cSJim Jagielski inline Sequence< E > & SAL_CALL operator = ( const Sequence< E > & rSeq ) 138*b1cdbd2cSJim Jagielski SAL_THROW( () ); 139*b1cdbd2cSJim Jagielski 140*b1cdbd2cSJim Jagielski /** Gets length of the sequence. 141*b1cdbd2cSJim Jagielski 142*b1cdbd2cSJim Jagielski @return length of sequence 143*b1cdbd2cSJim Jagielski */ getLength() const144*b1cdbd2cSJim Jagielski inline sal_Int32 SAL_CALL getLength() const SAL_THROW( () ) 145*b1cdbd2cSJim Jagielski { return _pSequence->nElements; } 146*b1cdbd2cSJim Jagielski 147*b1cdbd2cSJim Jagielski /** Tests whether the sequence has elements, i.e. elements count is 148*b1cdbd2cSJim Jagielski greater than zero. 149*b1cdbd2cSJim Jagielski 150*b1cdbd2cSJim Jagielski @return true, if elements count is greater than zero 151*b1cdbd2cSJim Jagielski */ hasElements() const152*b1cdbd2cSJim Jagielski inline sal_Bool SAL_CALL hasElements() const SAL_THROW( () ) 153*b1cdbd2cSJim Jagielski { return (_pSequence->nElements > 0); } 154*b1cdbd2cSJim Jagielski 155*b1cdbd2cSJim Jagielski /** Gets a pointer to elements array for reading. 156*b1cdbd2cSJim Jagielski If the sequence has a length of 0, then the returned pointer is 157*b1cdbd2cSJim Jagielski undefined. 158*b1cdbd2cSJim Jagielski 159*b1cdbd2cSJim Jagielski @return pointer to elements array 160*b1cdbd2cSJim Jagielski */ getConstArray() const161*b1cdbd2cSJim Jagielski inline const E * SAL_CALL getConstArray() const SAL_THROW( () ) 162*b1cdbd2cSJim Jagielski { return reinterpret_cast< const E * >( _pSequence->elements ); } 163*b1cdbd2cSJim Jagielski 164*b1cdbd2cSJim Jagielski /** Gets a pointer to elements array for reading and writing. 165*b1cdbd2cSJim Jagielski In general if the sequence has a handle acquired by other sequences 166*b1cdbd2cSJim Jagielski (reference count > 1), then a new sequence is created copy constructing 167*b1cdbd2cSJim Jagielski all elements to keep value semantics! 168*b1cdbd2cSJim Jagielski If the sequence has a length of 0, then the returned pointer is 169*b1cdbd2cSJim Jagielski undefined. 170*b1cdbd2cSJim Jagielski 171*b1cdbd2cSJim Jagielski @return pointer to elements array 172*b1cdbd2cSJim Jagielski */ 173*b1cdbd2cSJim Jagielski inline E * SAL_CALL getArray(); 174*b1cdbd2cSJim Jagielski 175*b1cdbd2cSJim Jagielski /** Non-const index operator: Obtains a reference to element indexed at 176*b1cdbd2cSJim Jagielski given position. 177*b1cdbd2cSJim Jagielski The implementation does not check for array bounds! 178*b1cdbd2cSJim Jagielski In general if the sequence has a handle acquired by other sequences 179*b1cdbd2cSJim Jagielski (reference count > 1), then a new sequence is created copy constructing 180*b1cdbd2cSJim Jagielski all elements to keep value semantics! 181*b1cdbd2cSJim Jagielski 182*b1cdbd2cSJim Jagielski @param nIndex index 183*b1cdbd2cSJim Jagielski @return non-const C++ reference to element 184*b1cdbd2cSJim Jagielski */ 185*b1cdbd2cSJim Jagielski inline E & SAL_CALL operator [] ( sal_Int32 nIndex ); 186*b1cdbd2cSJim Jagielski 187*b1cdbd2cSJim Jagielski /** Const index operator: Obtains a reference to element indexed at 188*b1cdbd2cSJim Jagielski given position. The implementation does not check for array bounds! 189*b1cdbd2cSJim Jagielski 190*b1cdbd2cSJim Jagielski @param nIndex index 191*b1cdbd2cSJim Jagielski @return const C++ reference to element 192*b1cdbd2cSJim Jagielski */ 193*b1cdbd2cSJim Jagielski inline const E & SAL_CALL operator [] ( sal_Int32 nIndex ) const 194*b1cdbd2cSJim Jagielski SAL_THROW( () ); 195*b1cdbd2cSJim Jagielski 196*b1cdbd2cSJim Jagielski /** Equality operator: Compares two sequences. 197*b1cdbd2cSJim Jagielski 198*b1cdbd2cSJim Jagielski @param rSeq another sequence of same type (right side) 199*b1cdbd2cSJim Jagielski @return true if both sequences are equal, false otherwise 200*b1cdbd2cSJim Jagielski */ 201*b1cdbd2cSJim Jagielski inline sal_Bool SAL_CALL operator == ( const Sequence< E > & rSeq ) const 202*b1cdbd2cSJim Jagielski SAL_THROW( () ); 203*b1cdbd2cSJim Jagielski 204*b1cdbd2cSJim Jagielski /** Unequality operator: Compares two sequences. 205*b1cdbd2cSJim Jagielski 206*b1cdbd2cSJim Jagielski @param rSeq another sequence of same type (right side) 207*b1cdbd2cSJim Jagielski @return false if both sequences are equal, true otherwise 208*b1cdbd2cSJim Jagielski */ 209*b1cdbd2cSJim Jagielski inline sal_Bool SAL_CALL operator != ( const Sequence< E > & rSeq ) const 210*b1cdbd2cSJim Jagielski SAL_THROW( () ); 211*b1cdbd2cSJim Jagielski 212*b1cdbd2cSJim Jagielski /** Reallocates sequence to new length. 213*b1cdbd2cSJim Jagielski If the new length is smaller than the former, then upper elements will 214*b1cdbd2cSJim Jagielski be destructed (and their memory freed). If the new length is greater 215*b1cdbd2cSJim Jagielski than the former, then upper (new) elements are default constructed. 216*b1cdbd2cSJim Jagielski If the sequence has a handle acquired by other sequences 217*b1cdbd2cSJim Jagielski (reference count > 1), then the remaining elements are copy constructed 218*b1cdbd2cSJim Jagielski to a new sequence handle to keep value semantics! 219*b1cdbd2cSJim Jagielski 220*b1cdbd2cSJim Jagielski @param nSize new size of sequence 221*b1cdbd2cSJim Jagielski */ 222*b1cdbd2cSJim Jagielski inline void SAL_CALL realloc( sal_Int32 nSize ); 223*b1cdbd2cSJim Jagielski 224*b1cdbd2cSJim Jagielski /** Provides UNacquired sequence handle. 225*b1cdbd2cSJim Jagielski 226*b1cdbd2cSJim Jagielski @return UNacquired sequence handle 227*b1cdbd2cSJim Jagielski */ get() const228*b1cdbd2cSJim Jagielski inline uno_Sequence * SAL_CALL get() const SAL_THROW( () ) 229*b1cdbd2cSJim Jagielski { return _pSequence; } 230*b1cdbd2cSJim Jagielski }; 231*b1cdbd2cSJim Jagielski 232*b1cdbd2cSJim Jagielski /** Creates a UNO byte sequence from a SAL byte sequence. 233*b1cdbd2cSJim Jagielski 234*b1cdbd2cSJim Jagielski @param rByteSequence a byte sequence 235*b1cdbd2cSJim Jagielski @return a UNO byte sequence 236*b1cdbd2cSJim Jagielski */ 237*b1cdbd2cSJim Jagielski inline ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL toUnoSequence( 238*b1cdbd2cSJim Jagielski const ::rtl::ByteSequence & rByteSequence ) SAL_THROW( () ); 239*b1cdbd2cSJim Jagielski 240*b1cdbd2cSJim Jagielski } 241*b1cdbd2cSJim Jagielski } 242*b1cdbd2cSJim Jagielski } 243*b1cdbd2cSJim Jagielski } 244*b1cdbd2cSJim Jagielski 245*b1cdbd2cSJim Jagielski /** Gets the meta type of IDL sequence. 246*b1cdbd2cSJim Jagielski 247*b1cdbd2cSJim Jagielski There are cases (involving templates) where uses of getCppuType are known to 248*b1cdbd2cSJim Jagielski not compile. Use cppu::UnoType or cppu::getTypeFavourUnsigned instead. 249*b1cdbd2cSJim Jagielski 250*b1cdbd2cSJim Jagielski @tplparam E element type of sequence 251*b1cdbd2cSJim Jagielski @param dummy typed pointer for function signature 252*b1cdbd2cSJim Jagielski @return type of IDL sequence 253*b1cdbd2cSJim Jagielski */ 254*b1cdbd2cSJim Jagielski template< class E > 255*b1cdbd2cSJim Jagielski inline const ::com::sun::star::uno::Type & 256*b1cdbd2cSJim Jagielski SAL_CALL getCppuType( const ::com::sun::star::uno::Sequence< E > * ) 257*b1cdbd2cSJim Jagielski SAL_THROW( () ); 258*b1cdbd2cSJim Jagielski 259*b1cdbd2cSJim Jagielski /** Gets the meta type of IDL sequence. 260*b1cdbd2cSJim Jagielski This function has been introduced, because one cannot get the (templated) 261*b1cdbd2cSJim Jagielski cppu type out of C++ array types. Array types have special 262*b1cdbd2cSJim Jagielski getCppuArrayTypeN() functions. 263*b1cdbd2cSJim Jagielski 264*b1cdbd2cSJim Jagielski @attention 265*b1cdbd2cSJim Jagielski the given element type must be the same as the template argument type! 266*b1cdbd2cSJim Jagielski @tplparam E element type of sequence 267*b1cdbd2cSJim Jagielski @param rElementType element type of sequence 268*b1cdbd2cSJim Jagielski @return type of IDL sequence 269*b1cdbd2cSJim Jagielski */ 270*b1cdbd2cSJim Jagielski template< class E > 271*b1cdbd2cSJim Jagielski inline const ::com::sun::star::uno::Type & 272*b1cdbd2cSJim Jagielski SAL_CALL getCppuSequenceType( const ::com::sun::star::uno::Type & rElementType ) 273*b1cdbd2cSJim Jagielski SAL_THROW( () ); 274*b1cdbd2cSJim Jagielski 275*b1cdbd2cSJim Jagielski /** Gets the meta type of IDL sequence< char >. 276*b1cdbd2cSJim Jagielski This function has been introduced due to ambiguities with unsigned short. 277*b1cdbd2cSJim Jagielski 278*b1cdbd2cSJim Jagielski @param dummy typed pointer for function signature 279*b1cdbd2cSJim Jagielski @return type of IDL sequence< char > 280*b1cdbd2cSJim Jagielski */ 281*b1cdbd2cSJim Jagielski inline const ::com::sun::star::uno::Type & 282*b1cdbd2cSJim Jagielski SAL_CALL getCharSequenceCppuType() SAL_THROW( () ); 283*b1cdbd2cSJim Jagielski 284*b1cdbd2cSJim Jagielski #endif 285