In this example, we create the MyArrayOper class, which merely wraps a pointer to an externally-created array. We overload the class’ _overloadSize, _overloadBracketsLeftSide, and _overloadBracketsRightSide methods.

The MyArrayOper_doc object definition and operator overloading code listed in this section is contained in the procedure file myarrayoper_doc__define.pro, and is located in the examples/doc/objects subdirectory of the IDL distribution. To view the file in an IDL editor window, enter .EDIT myarrayoper_doc__define.pro at the IDL command line.

For more information, refer to Overloading the SIZE and N_ELEMENTS Functions.

FUNCTION MyArrayOper_doc::Init, data
  self.pData = PTR_NEW(/ALLOCATE)
  IF (N_ELEMENTS(data) GT 0) THEN *self.pData = data
  RETURN, 1
END
 
FUNCTION MyArrayOper_doc::_overloadSize
  ; Just pretend that I am an array with multiple dimensions.
  RETURN, SIZE(*self.pData, /DIMENSIONS)
END
 
PRO MyArrayOper_doc::_overloadBracketsLeftSide, arg, value, $
  isRange, i1, i2, i3
 
  CASE (N_PARAMS()-3) OF
  1: (*self.pData)[i1] = value
  2: (*self.pData)[i1, i2] = value
  3: (*self.pData)[i1, i2, i3] = value
  ENDCASE
END
 
FUNCTION MyArrayOper_doc::_overloadBracketsRightSide, $
  isRange, i1, i2, i3
 
  CASE (N_PARAMS()-1) OF
  1: result = (*self.pData)[i1]
  2: result = (*self.pData)[i1, i2]
  3: result = (*self.pData)[i1, i2, i3]
  ENDCASE
  RETURN, result
END
 
PRO MyArrayOper_doc__define
  void = { MyArrayOper_doc, INHERITS IDL_Object, $
    pData: PTR_NEW() }
END

 

When we call the N_ELEMENTS and SIZE functions with the custom MyArrayOper object, these functions in turn query the MyArrayOper::_overloadSize function for dimension information.

 

a=MyArrayOper_doc(FINDGEN(10,7,8))
PRINT, N_ELEMENTS(a)

IDL prints:

560
 
 
PRINT, SIZE(a, /DIMENSIONS)

IDL prints:

          10           7           8
 
 
PRINT, a[0,0,0], a[3,4,5], a[9,6,7]

IDL prints:

     0.000000      393.000      559.000