How to use the modifiable pointer descriptor — TPtr

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 .

Constructing a TPtr

A 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);
      

Replacing data through the TPtr

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).

Changing the length of data

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 after ptr.Zero() , the descriptor represents no data. Nevertheless, the maximum length remains unchanged.

Related concepts
Literal Descriptors