Using TArray<class T>

This document covers important issues in using TArray

Using TArray to avoid the need for overloaded variants

The use of a TArray object can avoid the need for the member function of an end-user class to have overloaded variants to handle all possible types of arrays of <class T> elements.

The following example illustrates the point. It constructs a fixed flat array, a variable flat array and a packed array of <TElement> objects.

By taking a TArray<TElement> argument, the CTot::Total() member function can access array elements regardless of the type of array containing them.

       
        
       
       class TElement                 // array elements
 {
 public:
  TElement();
  inline TInt GetValue() const;
  void SetValue(TInt aVal);
 private :
  TInt iValue;
 };
      
       
        
       
       class CTot : public CBase           
 {
 public :
  void Total(const TArray<TElement>& anArray);
 private :
  TInt iTotalElements;
  TInt iTotalValue;
 };
      
       
        
       
       TElement::TElement()
 : iValue(0)
 {}
      
       
        
       
       inline TInt TElement::GetValue() const
 {
 return iValue;
 }
      
       
        
       
       void TElement::SetValue(TInt aVal)
 {
 iValue = aVal;
 }
      
       
        
       
       void CTot::Total(const TArray<TElement>& anArray)
 {
 TInt count = anArray.Count();
 
 for (TInt jj = 0; jj < count; jj++)
  iTotalValue += anArray[jj].GetValue();
 
 iTotalElements += count;
 }
      

Then some code using these could be:

       
        
       
       //           main body

CArrayFixFlat<TElement>* fix;
CArrayVarFlat<TElement>* var;
CArrayPakFlat<TElement>* pak;
TElement x;
CTot* ptr;

ptr = new CTot;

fix = new CArrayFixFlat<TElement>(2);
var = new CArrayVarFlat<TElement>(2);
pak = new CArrayPakFlat<TElement>(2);

x.SetValue(1);
fix->AppendL(x);
x.SetValue(2);
var->AppendL(x,sizeof(x));
x.SetValue(3);
pak->AppendL(x,sizeof(x));

ptr->Total(fix->Array());
ptr->Total(var->Array());
ptr->Total(pak->Array());
      

Without the use of TArray , the Total() member function would need overloaded variants to handle all the possible array types which it might expect. The CTot class would need redefining as:

       
        
       
       class CTot : public CBase           
 {
 public :
  void Total(const CArrayFixFlat<TElement>& anArray);
  void Total(const CArrayFixSeg<TElement>& anArray);
  void Total(const CArrayVarFlat<TElement>& anArray);
  void Total(const CArrayVarSeg<TElement>& anArray);
  void Total(const CArrayPakFlat<TElement>& anArray);
 private :
  TInt iTotalElements;
  TInt iTotalValue;
 };
      

To allow the Total() function to handle arrays composed of different types of element, (i.e. arrays constructed with different template values), then a separate variant of Total() is required for each element type. For example, to handle arrays of <TElement1> elements and arrays of <TElement2> elements, the CTot class might be defined as:

       
        
       
       class CTot : public CBase           
 {
 public :
  void TotalA(const TArray<TElement1>& anArray);
  void TotalB(const TArray<TElement2>& anArray);
 private :
  TInt iTotalElements;
  TInt iTotalValue;
 };
      

One important point to note; the referenced TElement returned by operator[] is declared as const . This means that any member function of TElement must also be declared as const , as shown in this example.