Modifiable pointer descriptors are useful for referencing strings or data which can be accessed and changed.
For text data, it is usual to construct a TPtr type
and allow the appropriate variant, either a TPtr or a
TPtrC to be selected at build time.
For binary data, an explicit TPtr8 is used.
It is rare to use an explicit TPtr16.
TPtrA modifiable pointer descriptor can be constructed in a number of ways:
another modifiable pointer descriptor.
from a non-modifiable buffer descriptor using the
Des() function
from an explicit pointer into memory and specifying a maximum length.
from an explicit pointer into memory and specifying the length of the data and a maximum length.
The following code fragment constructs a TPtr to
represent the data already represented by another TPtr:
TPtr ptr1;
...
TPtr ptr2(ptr1);
...
The following code fragment constructs a TPtr for a
non-modifiable buffer descriptor, a TBufC<TInt>, using the
Des() function. Data that would normally be unmodifiable through
the TBufC<TInt> can be changed through the
TPtr.
The source are literals which are converted to descriptor type.
_LIT(KText,"Hello World!");
_LIT(KExtraText," & Hi");
...
TBufC<16> buf1(KText);
...
TPtr ptr = buf1.Des();
...
ptr.Delete((ptr.Length()-1),1);
ptr.Append(KExtraText);
Define a TText area initialised to contain the string
"Have a nice day":
The following code fragments show the construction of a
TPtr using a pointer and specifying a length and a maximum length.
This technique is not commonly used. Literals are a much better way of defining
string constants.
TText str[16] = {'H', 'a', 'v', 'e', ' ', 'a',
' ', 'n', 'i', 'c', 'e',
' ', 'd', 'a', 'y', '\0'};
TPtr ptr(&str[0],15,16);
The descriptor ptr represents the data in
str and is constructed to have a current length of 15 (the length
of the text, excluding the zero terminator) and a maximum length of 16 (the
actual length of str). Once the descriptor has been constructed,
it has no further use for the zero terminator.
TPtr ptr(&str[0],15,16);
Data can be completely replaced using the assignment operator or the Copy() function.:
_LIT(KText,"Hi there");
...
ptr = KText;
...
ptr.Copy(KText);
Note the use of the _LIT macro to define the source string.
A literal is converted into a descriptor type.
The length of ptr is now 8 but the maximum length remains
unchanged. The size depends on the build variant. In a non-Unicode build, this
is 8 but in a Unicode build, this becomes 16 (two bytes for every
character).
The length of the data represented can be changed.
_LIT(KText,"Hi there");
...
ptr = KText;
ptr.SetLength(2);
ptr.Zero();
For example, after ptr.SetLength(2), the descriptor
represents the string "Hi". The length can even be set to zero so that
afterptr.Zero(), the descriptor represents no data. Nevertheless,
the maximum length remains unchanged.