;$Id: pointer_recursive_cleanup.pro,v 1.2 2005/02/03 18:04:12 azuah Exp $
;###############################################################################
; LICENSE:
;  The software in this file is written by an employee of 
;  National Institute of Standards and Technology 
;  as part of the DAVE software project.
;
;  The DAVE software package is not subject to copyright protection
;  and is in the public domain. It should be considered as an
;  experimental neutron scattering data reduction, visualization, and
;  analysis system. As such, the authors assume no responsibility
;  whatsoever for its use, and make no guarantees, expressed or
;  implied, about its quality, reliability, or any other
;  characteristic. The use of certain trade names or commercial
;  products does not imply any endorsement of a particular product,
;  nor does it imply that the named product is necessarily the best
;  product for the stated purpose. We would appreciate acknowledgment
;  if the DAVE software is used of if the code in this file is
;  included in another product.
;
;###############################################################################
;*******************************************************************************
;23456789 123456789 123456789 123465798 123456789 123456789 123465789 123456789
;       10        20        30        40        50        60        70        80
;*******************************************************************************
; Pointer_recursive_cleanup frees pointers recursively.
; By Sungil Park. Feb. 25, 2002.
;*******************************************************************************
pro Pointer_recursive_cleanup, Ptr

	case n_elements( Ptr ) of
		0: return
		1: ptr = ptr[0]
		else: begin
			for i = 0, n_elements( Ptr ) - 1 do begin
				Pointer_recursive_cleanup, Ptr[i]
			endfor
			return
		end
	endcase

	if ( ptr_valid( Ptr ) )[0] then begin

		case size( *Ptr, /tname ) of

			'STRUCT': begin
				for j = 0, n_tags( *Ptr ) - 1 do begin
					Pointer_recursive_cleanup, (*Ptr).(j)
				endfor
			end
			'POINTER': begin
				Pointer_recursive_cleanup, *Ptr
			end
			'OBJREF': begin
				obj_destroy, *Ptr
			end

			else: begin
				; print, size( *Ptr, /tname )
			end

		endcase

		ptr_free, Ptr

	endif

end
;*******************************************************************************
;23456789 123456789 123456789 123465798 123456789 123456789 123465789 123456789
;       10        20        30        40        50        60        70        80
;*******************************************************************************
