187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk/*
287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk* Copyright 2006 Sony Computer Entertainment Inc.
387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk*
487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk* Licensed under the MIT Open Source License, for details please see license.txt or the website
587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk* http://www.opensource.org/licenses/mit-license.php
687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk*
787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk*/
887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk#ifndef __DAE_ARRAY_H__
1087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk#define __DAE_ARRAY_H__
1187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk#include <new>
1287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk#include <dae/daeMemorySystem.h>
1387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
1487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchoukclass daeAtomicType;
1587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
1687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk/**
1787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk * COLLADA C++ class that implements storage for resizable array containers.
1887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk */
1987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchoukclass daeArray
2087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk{
2187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchoukprotected:
2287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	size_t         _count;
2387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	size_t         _capacity;
2487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	daeMemoryRef   _data;
2587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	size_t         _elementSize;
2687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	daeAtomicType* _type;
2787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchoukpublic:
2887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
2987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Constructor
3087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
3187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	DLLSPEC daeArray();
3287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
3387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Destructor
3487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
3587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	virtual DLLSPEC ~daeArray();
3687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
3787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Clears the contents of the array. Do not use this function if the array contains @c daeSmartRef objects and the
3887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @c dom* class the array belongs to has a @c _contents member.
3987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 *
4087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Many @c dom* objects have a @c _contents member that stores the original creation order of the @c daeElements
4187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * that are their children.  If you use @c clear() on a @c daeArray of @c daeSmartRef derived objects, these
4287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * objects will not be removed from @c _contents, which can cause problems when you
4387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * save the data.  We recommended that @c clear() not be used on arrays that are part of a @c dom* object.
4487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
4587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	virtual DLLSPEC void clear() = 0;
4687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
4787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Sets the size of an element in the array. This clears and reinitializes the array.
4887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param elementSize Size of an element in the array.
4987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
5087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	DLLSPEC void setElementSize(size_t elementSize);
5187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
5287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Gets the size of an element in this array.
5387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @return Returns the size of an element in this array.
5487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
5587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	size_t getElementSize() const {return _elementSize;}
5687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
5787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Grows the array to the specified size and sets the @c daeArray to that size.
5887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param cnt Size to grow the array to.
5987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
6087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	virtual void setCount(size_t cnt) = 0;
6187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
6287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Gets the number of items stored in this @c daeArray.
6387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @return Returns the number of items stored in this @c daeArray.
6487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
6587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	size_t getCount() const {return _count;}
6687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
6787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Increases the capacity of the @c daeArray.
6887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param minCapacity The minimum array capacity (the actual resulting capacity may be higher).
6987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
7087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	virtual void grow(size_t minCapacity) = 0;
7187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
7287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Gets the current capacity of the array, the biggest it can get without incurring a realloc.
7387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @return Returns the capacity of the array.
7487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
7587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	size_t getCapacity() const {return _capacity;}
7687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
7787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Gets a pointer to the raw memory of a particular element.
7887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @return Returns a pointer to the memory for the raw data.
7987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
8087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	daeMemoryRef getRaw(size_t index) const {return _data + index*_elementSize;}
8187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
8287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Removes an item at a specific index in the @c daeArray.
8387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param index  Index number of the item to delete.
8487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @return Returns DAE_OK if success, a negative value defined in daeError.h otherwise.
8587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @note The @c daeElement objects sometimes list
8687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * objects in two places, the class member and the <i> @c _contents </i> array, when you remove something from the
8787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * dom, you must remove it from both places.
8887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
8987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	virtual daeInt removeIndex(size_t index) = 0;
9087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
9187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	// Provided for backward compatibility only. Don't use these.
9287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	void setRawCount(size_t cnt) { setCount(cnt); } // Use setCount instead
9387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	daeMemoryRef getRawData() const {return _data;} // Use getRaw instead
9487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk};
9587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
9687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk/**
9787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk * COLLADA C++ templated version of @c daeArray for storing items of various types.
9887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk */
9987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouktemplate <class T>
10087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchoukclass daeTArray : public daeArray
10187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk{
10287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchoukprotected:
10387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	T* prototype;
10487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchoukpublic:
10587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
10687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 *  Constructor.
10787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
10887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	daeTArray() {
10987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		_elementSize = sizeof( T );
11087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		prototype = NULL;
11187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
11287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
11387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 *  Constructor.
11487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
11587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	explicit daeTArray(T* prototype) : prototype(prototype) {
11687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		_elementSize = sizeof( T );
11787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
11887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
11987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Copy Constructor
12087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
12187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	daeTArray( const daeTArray<T> &cpy ) : daeArray() {
12287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		prototype = NULL;
12387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		*this = cpy;
12487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
12587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
12687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Constructor that takes one element and turns into an array
12787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
12887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	explicit daeTArray( const T &el ) {
12987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		_elementSize = sizeof(T);
13087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		prototype = NULL;
13187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		append( el );
13287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
13387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
13487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 *  Destructor.
13587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
13687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	virtual ~daeTArray() {
13787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		clear();
13887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		delete prototype;
13987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
14087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
14187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Frees the memory in this array and resets it to it's initial state.
14287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
14387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	virtual void clear()
14487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	{
14587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		for(size_t i=0;i<_count;i++)
14687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			((T*)_data + i)->~T();
14787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		free(_data);
14887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		_count = 0;
14987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		_capacity = 0;
15087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		_data = NULL;
15187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
15287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
15387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
15487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Increases the capacity of the @c daeArray.
15587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param minCapacity The minimum array capacity (the actual resulting capacity may be higher).
15687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
15787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	void grow(size_t minCapacity) {
15887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		if (minCapacity <= _capacity)
15987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			return;
16087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
16187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		size_t newCapacity = _capacity == 0 ? 1 : _capacity;
16287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		while(newCapacity < minCapacity)
16387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			newCapacity *= 2;
16487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
16587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		T* newData = (T*)malloc(newCapacity*_elementSize);
16687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		for (size_t i = 0; i < _count; i++) {
16787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			new (&newData[i]) T(get(i));
16887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			((T*)_data + i)->~T();
16987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		}
17087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
17187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		if (_data != NULL)
17287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			free(_data);
17387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
17487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		_data = (daeMemoryRef)newData;
17587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		_capacity = newCapacity;
17687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
17787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
17887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
17987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Removes an item at a specific index in the @c daeArray.
18087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param index  Index number of the item to delete.
18187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @return Returns DAE_OK if success, a negative value defined in daeError.h otherwise.
18287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @note The @c daeElement objects sometimes list
18387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * objects in two places, the class member and the <i> @c _contents </i> array, when you remove something from the
18487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * dom, you must remove it from both places.
18587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
18687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	virtual daeInt removeIndex(size_t index)
18787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	{
18887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		if (index >= _count)
18987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			return(DAE_ERR_INVALID_CALL);
19087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
19187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		for (size_t i = index; i < _count-1; i++)
19287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			*((T*)_data+i) = *((T*)_data+i+1);
19387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		((T*)_data+(_count-1))->~T();
19487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		_count--;
19587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		return DAE_OK;
19687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
19787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
19887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
19987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Resets the number of elements in the array. If the array increases in size, the new
20087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * elements will be initialized to the specified value.
20187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param nElements The new size of the array.
20287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param value The value new elements will be initialized to.
20387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @note Shrinking the array does NOT free up memory.
20487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
20587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	void setCount(size_t nElements, const T& value)
20687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	{
20787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		grow(nElements);
20887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		// Destruct the elements that are being chopped off
20987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		for (size_t i = nElements; i < _count; i++)
21087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			((T*)_data+i)->~T();
21187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		// Use value to initialize the new elements
21287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		for (size_t i = _count; i < nElements; i++)
21387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			new ((void*)((T*)_data+i)) T(value);
21487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		_count = nElements;
21587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
21687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
21787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
21887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Resets the number of elements in the array. If the array increases in size, the new
21987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * elements will be initialized with a default constructor.
22087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param nElements The new size of the array.
22187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @note Shrinking the array does NOT free up memory.
22287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
22387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	virtual void setCount(size_t nElements) {
22487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		if (prototype)
22587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			setCount(nElements, *prototype);
22687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		else
22787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			setCount(nElements, T());
22887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
22987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
23087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
23187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Sets a specific index in the @c daeArray, growing the array if necessary.
23287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param index Index of the object to set, asserts if the index is out of bounds.
23387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param value Value to store at index in the array.
23487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
23587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	void set(size_t index, const T& value) {
23687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		if (index >= _count)
23787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			setCount(index+1);
23887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		((T*)_data)[index] = value;
23987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
24087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
24187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
24287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Gets the object at a specific index in the @c daeArray.
24387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param index Index of the object to get, asserts if the index is out of bounds.
24487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @return Returns the object at index.
24587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
24687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	T& get(size_t index) {
24787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		assert(index < _count);
24887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		return ((T*)_data)[index]; }
24987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
25087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Gets the object at a specific index in the @c daeArray.
25187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param index Index of the object to get, asserts if the index is out of bounds.
25287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @return Returns the object at index.
25387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
25487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	const T& get(size_t index) const {
25587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		assert(index < _count);
25687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		return ((T*)_data)[index]; }
25787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
25887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
25987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Appends a new object to the end of the @c daeArray.
26087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param value Value of the object to append.
26187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @return Returns the index of the new object.
26287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
26387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	size_t append(const T& value) {
26487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set(_count, value);
26587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		return _count-1;
26687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
26787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
26887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
26987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Appends a unique object to the end of the @c daeArray.
27087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Functions the same as @c append(), but does nothing if the value is already in the @c daeArray.
27187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param value Value of the object to append.
27287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @return Returns the index where this value was appended. If the value already exists in the array,
27387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * returns the index in this array where the value was found.
27487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
27587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	size_t appendUnique(const T& value) {
27687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		size_t ret;
27787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		if (find(value,ret) != DAE_OK)
27887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			return append(value);
27987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		else
28087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			return ret;
28187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
28287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
28387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
28487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Adds a new item to the front of the @c daeArray.
28587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param value Item to be added.
28687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
28787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	void prepend(const T& value) {
28887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		insertAt(0, value);
28987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
29087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
29187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
29287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Removes an item from the @c daeArray.
29387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param value A reference to the item to delete.
29487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @return Returns DAE_OK if success, a negative value defined in daeError.h otherwise.
29587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @note The @c daeElement objects sometimes list
29687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * objects in two places, the class member and the <i> @c _contents </i> array, when you remove something from the
29787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * do, you must remove it from both places.
29887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
29987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	daeInt remove(const T& value, size_t *idx = NULL )
30087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	{
30187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		size_t index;
30287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		if(find(value,index) == DAE_OK)
30387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		{
30487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			if ( idx != NULL ) {
30587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk				*idx = index;
30687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			}
30787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			return(removeIndex( index ));
30887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		}
30987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		else
31087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		{
31187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			return(DAE_ERR_INVALID_CALL);
31287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		}
31387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
31487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
31587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Finds an item from the @c daeArray.
31687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param value A reference to the item to find.
31787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param index If the function returns DAE_OK, this is set to the index where the value appears in the array.
31887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @return Returns DAE_OK if no error or DAE_ERR_QUERY_NO_MATCH if the value was not found.
31987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
32087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	daeInt find(const T& value, size_t &index) const
32187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	{
32287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		size_t i;
32387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		for(i=0;i<_count;i++)
32487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		{
32587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			if (((T*)_data)[i] == value)
32687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			{
32787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk				index = i;
32887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk				return DAE_OK;
32987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			}
33087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		}
33187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
33287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		return DAE_ERR_QUERY_NO_MATCH;
33387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
33487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
33587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Just like the previous function, but has a more reasonable interface.
33687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param value The value to find.
33787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @return Returns a pointer to the value if found, null otherwise.
33887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
33987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	T* find(const T& value) const {
34087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		size_t i;
34187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		if (find(value, i) == DAE_OK)
34287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			return get(i);
34387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		return NULL;
34487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
34587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
34687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Gets the object at a specific index in the @c daeArray.
34787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param index Index of the object to get, asserts if the index is out of bounds.
34887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @return Returns the object at @c index.
34987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
35087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	T& operator[](size_t index) {
35187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		assert(index < _count);
35287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		return ((T*)_data)[index]; }
35387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
35487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Gets the object at a specific index in the @c daeArray.
35587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param index Index of the object to get, asserts if the index is out of bounds.
35687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @return Returns the object at @c index.
35787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
35887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	const T& operator[](size_t index) const {
35987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		assert(index < _count);
36087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		return ((T*)_data)[index]; }
36187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
36287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
36387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Inserts the specified number of elements at a specific location in the array.
36487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param index Index into the array where the elements will be inserted
36587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param n The number of elements to insert
36687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param val The value to insert
36787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
36887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	void insert(size_t index, size_t n, const T& val = T()) {
36987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		if (index >= _count) {
37087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			// Append to the end of the array
37187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			size_t oldCount = _count;
37287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			setCount(index + n);
37387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			for (size_t i = oldCount; i < _count; i++)
37487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk				get(i) = val;
37587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		}
37687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		else {
37787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			setCount(_count + n);
37887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			for (size_t i = _count-1; i >= index+n; i--)
37987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk				get(i) = get(i-n);
38087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			for (size_t i = index; i < index+n; i++)
38187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk				get(i) = val;
38287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		}
38387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
38487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
38587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
38687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Inserts an object at a specific index in the daeArray, growing the array if neccessary
38787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param index Index into the array for where to place the object
38887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param value The object to append
38987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
39087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	void insertAt(size_t index, const T& value) {
39187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		insert(index, 1);
39287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		get(index) = value;
39387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
39487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
39587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
39687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Overloaded assignment operator.
39787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param other A reference to the array to copy
39887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @return A reference to this object.
39987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
40087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	daeTArray<T> &operator=( const daeTArray<T> &other ) {
40187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		if (this != &other) {
40287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			clear();
40387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			_elementSize = other._elementSize;
40487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			_type = other._type;
40587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			grow(other._count);
40687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			for(size_t i=0;i<other._count;i++)
40787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk				append(other[i]);
40887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		}
40987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
41087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		return *this;
41187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
41287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
41387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
41487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Overloaded equality operator
41587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param other A reference to the other array.
41687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @return true if the arrays are equal, false otherwise.
41787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
41887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	bool operator==(const daeTArray<T>& other) {
41987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		if (getCount() != other.getCount())
42087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			return false;
42187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		for (size_t i = 0; i < getCount(); i++)
42287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			if (get(i) != other.get(i))
42387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk				return false;
42487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		return true;
42587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
42687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
42787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	//some helpers
42887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
42987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Sets the array to the contain the two values specified.
43087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param one The first value.
43187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param two The second value.
43287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
43387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	void set2( const T &one, const T &two )
43487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	{
43587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		setCount( 2 );
43687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( 0, one );
43787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( 1, two );
43887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
43987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
44087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Sets the array to the contain the three values specified.
44187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param one The first value.
44287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param two The second value.
44387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param three The third value.
44487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
44587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	void set3( const T &one, const T &two, const T &three )
44687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	{
44787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		setCount( 3 );
44887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( 0, one );
44987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( 1, two );
45087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( 2, three );
45187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
45287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
45387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Sets the array to the contain the four values specified.
45487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param one The first value.
45587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param two The second value.
45687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param three The third value.
45787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param four The fourth value.
45887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
45987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	void set4( const T &one, const T &two, const T &three, const T &four )
46087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	{
46187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		setCount( 4 );
46287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( 0, one );
46387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( 1, two );
46487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( 2, three );
46587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( 3, four );
46687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
46787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
46887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
46987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Sets the values in the array at the specified location to the contain the two
47087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * values specified. This function will grow the array if needed.
47187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param index The position in the array to start setting.
47287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param one The first value.
47387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param two The second value.
47487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
47587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	void set2at( size_t index, const T &one, const T &two )
47687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	{
47787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( index, one );
47887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( index+1, two );
47987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
48087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
48187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Sets the values in the array at the specified location to the contain the three
48287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * values specified. This function will grow the array if needed.
48387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param index The position in the array to start setting.
48487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param one The first value.
48587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param two The second value.
48687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param three The third value.
48787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
48887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	void set3at( size_t index, const T &one, const T &two, const T &three )
48987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	{
49087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( index, one );
49187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( index+1, two );
49287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( index+2, three );
49387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
49487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
49587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Sets the values in the array at the specified location to the contain the four
49687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * values specified. This function will grow the array if needed.
49787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param index The position in the array to start setting.
49887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param one The first value.
49987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param two The second value.
50087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param three The third value.
50187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param four The fourth value.
50287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
50387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	void set4at( size_t index, const T &one, const T &two, const T &three, const T &four )
50487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	{
50587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( index, one );
50687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( index+1, two );
50787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( index+2, three );
50887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( index+3, four );
50987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
51087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
51187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
51287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Appends two values to the array.
51387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param one The first value.
51487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param two The second value.
51587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
51687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	void append2( const T &one, const T &two )
51787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	{
51887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		append( one );
51987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		append( two );
52087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
52187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
52287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Appends three values to the array.
52387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param one The first value.
52487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param two The second value.
52587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param three The third value.
52687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
52787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	void append3( const T &one, const T &two, const T &three )
52887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	{
52987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		append( one );
53087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		append( two );
53187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		append( three );
53287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
53387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
53487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Appends four values to the array.
53587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param one The first value.
53687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param two The second value.
53787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param three The third value.
53887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param four The fourth value.
53987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
54087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	void append4( const T &one, const T &two, const T &three, const T &four )
54187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	{
54287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		append( one );
54387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		append( two );
54487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		append( three );
54587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		append( four );
54687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
54787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
54887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
54987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Inserts two values into the array at the specified location.
55087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param index The position in the array to start inserting.
55187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param one The first value.
55287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param two The second value.
55387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
55487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	void insert2at( size_t index, const T &one, const T &two )
55587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	{
55687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		insert(index, 2);
55787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set(index, one);
55887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set(index+1, two);
55987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
56087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
56187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Inserts three values into the array at the specified location.
56287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param index The position in the array to start inserting.
56387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param one The first value.
56487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param two The second value.
56587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param three The third value.
56687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
56787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	void insert3at( size_t index, const T &one, const T &two, const T &three )
56887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	{
56987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		insert(index, 3);
57087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( index, one );
57187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( index+1, two );
57287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( index+2, three );
57387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
57487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
57587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Inserts four values into the array at the specified location.
57687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param index The position in the array to start inserting.
57787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param one The first value.
57887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param two The second value.
57987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param three The third value.
58087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param four The fourth value.
58187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
58287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	void insert4at( size_t index, const T &one, const T &two, const T &three, const T &four )
58387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	{
58487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		insert(index, 4);
58587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( index, one );
58687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( index+1, two );
58787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( index+2, three );
58887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		set( index+4, four );
58987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
59087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
59187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
59287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Gets two values from the array at the specified location.
59387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param index The position in the array to start getting.
59487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param one Variable to store the first value.
59587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param two Variable to store the second value.
59687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @return Returns The number of elements retrieved.
59787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
59887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	daeInt get2at( size_t index, T &one, T &two )
59987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	{
60087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		daeInt retVal = 0;
60187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		if ( index < _count )
60287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		{
60387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			one = get(index);
60487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			retVal++;
60587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		}
60687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		if ( index+1 < _count )
60787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		{
60887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			two = get(index+1);
60987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			retVal++;
61087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		}
61187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		return retVal;
61287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
61387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
61487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Gets three values from the array at the specified location.
61587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param index The position in the array to start getting.
61687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param one Variable to store the first value.
61787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param two Variable to store the second value.
61887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param three Variable to store the third value.
61987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @return Returns The number of elements retrieved.
62087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
62187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	daeInt get3at( size_t index, T &one, T &two, T &three )
62287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	{
62387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		daeInt retVal = 0;
62487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		if ( index < _count )
62587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		{
62687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			one = get(index);
62787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			retVal++;
62887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		}
62987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		if ( index+1 < _count )
63087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		{
63187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			two = get(index+1);
63287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			retVal++;
63387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		}
63487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		if ( index+2 < _count )
63587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		{
63687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			three = get(index+2);
63787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			retVal++;
63887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		}
63987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		return retVal;
64087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
64187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
64287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Gets four values from the array at the specified location.
64387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param index The position in the array to start getting.
64487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param one Variable to store the first value.
64587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param two Variable to store the second value.
64687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param three Variable to store the third value.
64787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param four Variable to store the fourth value.
64887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @return Returns The number of elements retrieved.
64987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
65087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	daeInt get4at( size_t index, T &one, T &two, T &three, T &four )
65187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	{
65287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		daeInt retVal = 0;
65387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		if ( index < _count )
65487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		{
65587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			one = get(index);
65687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			retVal++;
65787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		}
65887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		if ( index+1 < _count )
65987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		{
66087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			two = get(index+1);
66187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			retVal++;
66287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		}
66387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		if ( index+2 < _count )
66487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		{
66587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			three = get(index+2);
66687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			retVal++;
66787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		}
66887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		if ( index+3 < _count )
66987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		{
67087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			four = get(index+3);
67187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			retVal++;
67287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		}
67387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		return retVal;
67487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
67587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
67687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
67787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Appends a number of elements to this array from a C native array.
67887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param num The number of elements to append.
67987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param array The C native array that contains the values to append.
68087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
68187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	void appendArray( size_t num, T *array )
68287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	{
68387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		if ( array == NULL )
68487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			return;
68587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
68687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		for ( size_t i = 0; i < num; i++ )
68787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			append( array[i] );
68887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
68987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	/**
69087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * Appends a number of elements to this array from another daeTArray.
69187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 * @param array The daeTArray that contains the values to append.
69287ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	 */
69387ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	void appendArray( const daeTArray<T> &array ){
69487ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		size_t num = array.getCount();
69587ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk		for ( size_t i = 0; i < num; i++ )
69687ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk			append( array[i] );
69787ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk	}
69887ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk};
69987ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
70087ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk
70187ac3e2db6d5ae163131102c066e9d19bdfdc139Alex Sakhartchouk#endif //__DAE_ARRAY_H__
702