diff -r 89d6a7a84779 -r 25a17d01db0c Symbian3/PDK/Source/GUID-4F8B0675-AC8D-529A-903D-DA31C8236A98.dita --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/PDK/Source/GUID-4F8B0675-AC8D-529A-903D-DA31C8236A98.dita Fri Jan 22 18:26:19 2010 +0000 @@ -0,0 +1,117 @@ + + + + + +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.

+
\ No newline at end of file