3.15.1 Array


Auxiliary Structure and Function

Data structure and function in this section will be used in our example code. Make sure you have included <Origin.h> and <Array.h> before running these examples.

#include <Origin.h>
#include <Array.h>
  • Structure used to hold data in our example code.
class POINTEX
{
public:
	POINTEX(int n)
	{
		m_n = n;
		printf("Constructor\n");
	}
	
	~POINTEX()
	{
		printf("Destructor, n = %d\n", m_n);
	}
	
	int m_n;
};
  • This function simply set the size of the array as 3 with values {1,2,3}
static void _perpare_array(Array<POINTEX&> &myArray)
{	
	// Add elements to the array.
	int		ii;
	int		nSize = 3;
	for(ii = 0; ii < nSize; ii++)
	{		
		POINTEX		*pp = new POINTEX(ii+1);
		myArray.Add(*pp);
	}	
}

Access data objects

Append or set a object

This example show how to add objects to the array

//Method 1:
// add at the end of the array
void	Array_add_item_at_end()
{
	Array<POINTEX&> myArray;
	myArray.SetAsOwner(true);
	_perpare_array(myArray);
	
	POINTEX		*pObj = new POINTEX(211);
	myArray.Add(*pObj);
}
//Method 2:
// add at any place, might replace other object if the place is occupied already
void	Array_set_or_add_one_item( int nToSet = 0 )
{
	Array<POINTEX&> myArray;
	myArray.SetAsOwner(true);
	_perpare_array(myArray);
	
	POINTEX		*pObj = new POINTEX( 200 );
	myArray.SetAtGrow( nToSet, *pObj );//if nToSet is bigger than 2, Array will resize itself as to hold newly added object
}

Get and set an object

This example show how to get an object and modify its value

//Method 1:
// get object reference by Array::GetAt(int nIndex) and then modify this reference
void	Array_modify_one_item_1(int nToModify = 0)
{
	Array<POINTEX&> myArray;
	myArray.SetAsOwner(true);
	_perpare_array(myArray);
	
	POINTEX&	obj = myArray.GetAt(nToModify);
	if( obj )
		obj.m_n = 100;
}

//Method 2:
// create a new object and set it to Array to replace old item, Array::SetAt will destruct old object firstly whatever Set Owner TRUE or FALSE
void	Array_modify_one_item_2(int nToModify = 0)
{
	Array<POINTEX&> myArray;
	myArray.SetAsOwner(true);
	_perpare_array(myArray);
	
	POINTEX		*pNew = new POINTEX(100);	
	myArray.SetAt(nToModify, *pNew);
}

Get and set size

This example show how to get and set the size of the array

//////////////// Get the size of this list ////////////////
void	Array_get_size_of_the_array()
{
	Array<POINTEX&> myArray;
	myArray.SetAsOwner(true);
	_perpare_array(myArray);

	int nSize = myArray.GetSize();
	ASSERT( 3 == nSize );
	
	POINTEX		*pObj = new POINTEX(20);
	myArray.Add( *pObj );
	nSize = myArray.GetSize();//nSize should be 4
	ASSERT( 4 == nSize );
	
	POINTEX		*pObjTwo = new POINTEX(22);
	myArray.SetAtGrow( 8, *pObjTwo );
	nSize = myArray.GetSize();//nSize should be 9 since we added an object to the place indexed as 8 and array resize itself as 9
	ASSERT( 9 == nSize );
}

//////////////// Set the size of this list ////////////////
void	Array_set_size_of_the_array()
{
	Array<POINTEX&> myArray;
	myArray.SetAsOwner(true);
	_perpare_array(myArray);

	myArray.SetSize(8);// following code myArray.GetSize() should return 8 after set size here
	ASSERT( 8 == myArray.GetSize() );
	
	myArray.SetSize(2);// myArray.GetSize() should return 2 following this line
	ASSERT( 2 == myArray.GetSize() );
	
}

Storage relative

If set array as the owner, objects in it will be deleted when destructor of Array is called or on reducing the size of the array

//////////////// Set the list as the owner of objects' memory ////////////////
void	Array_set_as_owner()
{
	Array<POINTEX&> myArray;
	myArray.SetAsOwner(true);
	_perpare_array(myArray);

	BOOL bOwner = TRUE;
	myArray.SetAsOwner( bOwner );//following myArray.IsOwner() should return true if this function is called successfully
	ASSERT( myArray.IsOwner() );
	
	bOwner = FALSE;
	myArray.SetAsOwner( bOwner );//following myArray.IsOwner() should return false;
	ASSERT( !myArray.IsOwner() );
}