/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/


#ifndef _UNO_SEQUENCE2_H_
#define _UNO_SEQUENCE2_H_

#include <sal/types.h>
#include <uno/data.h>

#ifdef __cplusplus
extern "C"
{
#endif

struct _typelib_TypeDescriptionReference;
struct _typelib_TypeDescription;
typedef sal_Sequence uno_Sequence;

/** Assigns a sequence.

	@param ppDest		destinstaion sequence
	@param pSource		source sequence
	@param pTypeDescr	type description of the sequence and NOT of an element
	@param release		function called each time an interface needs to
                        be released; defaults (0) to uno
*/
void SAL_CALL uno_sequence_assign(
	uno_Sequence ** ppDest,
	uno_Sequence * pSource,
	struct _typelib_TypeDescription * pTypeDescr,
	uno_ReleaseFunc release )
	SAL_THROW_EXTERN_C();
/** Assigns a sequence.

	@param ppDest		destinstaion sequence
	@param pSource		source sequence
	@param pType		type of the sequence and NOT of an element
	@param release		function called each time an interface needs to
                        be released; defaults (0) to uno
*/
void SAL_CALL uno_type_sequence_assign(
	uno_Sequence ** ppDest,
	uno_Sequence * pSource,
	struct _typelib_TypeDescriptionReference * pType,
	uno_ReleaseFunc release )
	SAL_THROW_EXTERN_C();

/** Constructs a new sequence with given elements.

	@param ppSequence		  out parameter sequence;
                              0 if memory allocation has failed
	@param pTypeDescr		  type description of the sequence and NOT of an
                              element
	@param pElements		  if 0, then all elements are default constructed
	@param len				  number of elements
	@param acquire			  function called each time an interface needs to
                              be acquired; defaults (0) to uno
    @return                   false, if memoray allocation has failed
*/
sal_Bool SAL_CALL uno_sequence_construct(
	uno_Sequence ** ppSequence,
	struct _typelib_TypeDescription * pTypeDescr,
	void * pElements, sal_Int32 len,
	uno_AcquireFunc acquire )
	SAL_THROW_EXTERN_C();
/** Constructs a new sequence with given elements.

	@param ppSequence		  out parameter sequence;
                              0 if memory allocation has failed
	@param pType			  type of the sequence and NOT of an element
	@param pElements		  if 0, then all elements are default constructed
	@param len				  number of elements
	@param acquire			  function called each time an interface needs to
                              be acquired; defaults (0) to uno
    @return                   false, if memoray allocation has failed
*/
sal_Bool SAL_CALL uno_type_sequence_construct(
	uno_Sequence ** ppSequence,
	struct _typelib_TypeDescriptionReference * pType,
	void * pElements, sal_Int32 len,
	uno_AcquireFunc acquire )
	SAL_THROW_EXTERN_C();

/** Assures that the reference count of the given sequence is one.
    Otherwise a new copy of the sequence is created with a reference count
    of one.

	@param ppSequence		inout sequence
	@param pTypeDescr		type description of sequence
	@param acquire			function called each time an interface needs to
                            be acquired; defaults (0) to uno
	@param release			function called each time an interface needs to
                            be released; defaults (0) to uno
    @return                 false, if memoray allocation has failed
*/
sal_Bool SAL_CALL uno_sequence_reference2One(
	uno_Sequence ** ppSequence,
	struct _typelib_TypeDescription * pTypeDescr,
	uno_AcquireFunc acquire,
	uno_ReleaseFunc release )
	SAL_THROW_EXTERN_C();
/** Assures that the reference count of the given sequence is one.
    Otherwise a new copy of the sequence is created with a reference count
    of one.

	@param ppSequence		inout sequence
	@param pType			type of sequence
	@param acquire			function called each time an interface needs to
                            be acquired; defaults (0) to uno
	@param release			function called each time an interface needs to
                            be released; defaults (0) to uno
    @return                 false, if memoray allocation has failed
*/
sal_Bool SAL_CALL uno_type_sequence_reference2One(
	uno_Sequence ** ppSequence,
	struct _typelib_TypeDescriptionReference * pType,
	uno_AcquireFunc acquire,
	uno_ReleaseFunc release )
	SAL_THROW_EXTERN_C();

/** Reallocates length of a sequence. This truncates a sequence or enlarges
    it default constructing appended elements.

	@param ppSequence		inout sequence
	@param pTypeDescr		type description of sequence
	@param nSize			new size of sequence
	@param acquire			function called each time an interface needs to
                            be acquired; defaults (0) to uno
	@param release			function called each time an interface needs to
                            be released; defaults (0) to uno
    @return                 false, if memoray allocation has failed
*/
sal_Bool SAL_CALL uno_sequence_realloc(
	uno_Sequence ** ppSequence,
	struct _typelib_TypeDescription * pTypeDescr,
	sal_Int32 nSize,
	uno_AcquireFunc acquire,
	uno_ReleaseFunc release )
	SAL_THROW_EXTERN_C();
/** Reallocates length of a sequence. This truncates a sequence or enlarges
    it default constructing appended elements.

	@param ppSequence		inout sequence
	@param pType			type of sequence
	@param nSize			new size of sequence
	@param acquire			function called each time an interface needs to
                            be acquired; defaults (0) to uno
	@param release			function called each time an interface needs to
                            be released; defaults (0) to uno
    @return                 false, if memoray allocation has failed
*/
sal_Bool SAL_CALL uno_type_sequence_realloc(
	uno_Sequence ** ppSequence,
	struct _typelib_TypeDescriptionReference * pType,
	sal_Int32 nSize,
	uno_AcquireFunc acquire,
	uno_ReleaseFunc release )
	SAL_THROW_EXTERN_C();

#ifdef __cplusplus
}
#endif

#endif
