INIT

 (Available in 00 TS Tools(Base) - TS_Tools_PointerSafe)

Purpose

Create a 'TS_PointerSafe' instance

Syntax

oPointerSafe:=TS_PointerSafe{ [oOwner], 10, _SIZEOF( _WinGUID ) }

Arguments

uoOwner
NIL, OBJECT
dwItemMax
DWORD
dwItemSize
DWORD
udwItemStepSize
DWORD

Description

The object can be used to dynamicly un-allocate static allocated memory. When the 'TS_PointerSafe' object is no longer accessable then the memory allocated will be freed.

Example

oPointerSafe:=TS_PointerSafe{ oOwner, 10, _SIZEOF( _WinGUID ) }
FOR X:=1 UPTO 10
   pGUID:=oPointerSafe:ItemPointer( X )
// Do something with the GUID-pointer
   ... 
NEXT

Source

METHOD INIT( uoOwner, dwItemMax, dwItemSize, udwItemStepSize ) CLASS TS_PointerSafe
LOCAL cAccessTypeList AS STRING
LOCAL dwItemStepSize AS DWORD
LOCAL lInit AS LOGIC
   TSTrace Enter CREATE
   IF LOGIC( _CAST, _AND( SELF:_ObjectStat1, TS_OBJSTAT1_ININIT  ; ...
  ... ) )
      SELF:_ObjectStat1+=TS_OBJSTAT1_COUNTVALUE
      cAccessTypeList:=TS_AccessTypeList( uoOwner, dwItemMax, dwItemSize, udwItemStepSize  ; ...
     ... )
      DO CASE
      CASE cAccessTypeList=="UNNU" .OR. cAccessTypeList=="UNNN"
         SELF:_ItemMax:=DWORD( dwItemMax )
         SELF:_ItemSize:=DWORD( dwItemSize )
         lInit:=TRUE
      CASE cAccessTypeList=="ONNU" .OR. cAccessTypeList=="ONNN"
         SELF:_ItemMax:=DWORD( dwItemMax )
         SELF:_ItemSize:=DWORD( dwItemSize )
         lInit:=TRUE
      OTHERWISE
         TSTrace Warning "Invalid parameter(s), Expected 'U|O', 'N(DW)', 'N(DW)' " ; ...
        ... +"and 'U|N(DW)', Found '"+cAccessTypeList+"'"
         SELF:_BytesAllocated:=0
         SELF:_BytesPointer:=NULL_PTR
         SELF:InvalidateObject( )
         lInit:=FALSE
      END
      IF lInit
         SUPER:INIT( uoOwner, NIL, NIL )
         DO CASE
         CASE SELF:IsInvalidated
            TSTrace Warning "SELF:IsInvalidated"
            SELF:InvalidateObject( )
         CASE SELF:_ItemSize<1
            TSTrace Warning "SELF:_ItemSize<1"
            SELF:InvalidateObject( )
         CASE SELF:_ItemMax<1
            TSTrace Warning "SELF:_ItemMax<1"
            SELF:InvalidateObject( )
         OTHERWISE
            IF IsLong( udwItemStepSize )
               dwItemStepSize:=TS_SafeDWORD( udwItemStepSize, NULL_PTR )
               IF dwItemStepSize>10U
                  SELF:_ItemStepSize:=dwItemStepSize
               END
            END
            SELF:_BytesPointer:=MemAlloc( SELF:_ItemSize ; ...
           ... *SELF:_ItemMax )
            IF SELF:_BytesPointer==NULL_PTR
               TSTrace Fatal "MemAlloc(SELF:_BytesAllocated)==NULL_PTR"
               SELF:_BytesAllocated:=0
               SELF:_BytesPointer:=NULL_PTR
               SELF:InvalidateObject( )
            ELSE
               SELF:_BytesAllocated:=SELF:_ItemSize ; ...
              ... *SELF:_ItemMax
               IF IsDynPtr( PTR( _CAST, SELF ) )
                  SELF:RegisterAxit( )
               END
            END
         END
      END
      SELF:_ObjectStat1-=TS_OBJSTAT1_COUNTVALUE
      IF _AND( SELF:_ObjectStat1, TS_OBJSTAT1_NEWTEST )==TS_OBJSTAT1_NEEDNEW
         SELF:_ObjectStat1:=_AND( SELF:_ObjectStat1 ; ...
        ... , _NOT( TS_OBJSTAT1_NEEDNEW ) )
         IF SELF:IsValidObject
            SELF:NEW( uoOwner, dwItemMax, dwItemSize  ; ...
           ... )
         ELSE
            TSTrace Warning TS_TEXT_GEN_CAN_NOT_INITIALIZE
            SELF:InvalidateObject( )
         END
      END
   ELSE
      TSTrace Warning "!LOGIC(_CAST,_And(SELF:_ObjectStat1,TS_OBJECT_STATUS_ININIT))"
   END
   TSTrace Leave
RETURN SELF