
; Copyright (c) 1999, Forschungszentrum Juelich GmbH ICG-1
; All rights reserved.
; Unauthorized reproduction prohibited.
; This software may be used, copied, or redistributed as long as it is not
; sold and this copyright notice is reproduced on each copy made.  This
; routine is provided as is without any express or implied warranties
; whatsoever.
;
;+
; NAME:
;   reform_struct
;
; PURPOSE:
;   This function is used to reform a structure
;
; CATEGORY:
;   PROGTOOLS/STRUCTURE
;
; CALLING SEQUENCE:
;   result=reform_struct(structure,dim1,[dim2],[dim3],[dim4],[dim5],[dim6],[dim7],[dim8],[/struct_array],[/tag_array]
;
; INPUTS:
;    structure: a structures
;    dim1:  the new dimension of the input structure (1D to 8D)
;
; OPTIONAL INPUTS:
;   dim2 to dim8: additional dimensions if not declared in dim1
;
; KEYWORD PARAMETERS:
;   struct_array: if is set output structure is an array
;   tag_array:    if is set output structure is 1D and tags are arrays
;  You have to set one of these keywords
;
; EXAMPLE:
;   data={a:findgen(10),b:sin(findgen(10))}
;   result=reform_struct(data,2,5,/struct_array)
;
; MODIFICATION HISTORY:
;   Written by:     R.Bauer (ICG-1), 1999-Apr-23
;-

FUNCTION reform_struct,struct,name=name,dim1,dim2,dim3,dim4,dim5,dim6,dim7,dim8,struct_array=struct_Array,tag_array=tag_array


   names=TAG_NAMES(struct)
   n=N_ELEMENTS(names)

   IF KEYWORD_SET(struct_Array) THEN BEGIN
      FOR i=0,n-1 DO build_structure,in_struct,names[i],struct.(i)[0]

      CASE N_PARAMS() OF
         2: BEGIN
            CASE N_ELEMENTS(dim1) OF
               1: in_struct=REPLICATE(in_struct,dim1[0])
               2 : in_struct=REPLICATE(in_struct,dim1[0],dim1[1])
               3 : in_struct=REPLICATE(in_struct,dim1[0],dim1[1],dim1[2])
               4 : in_struct=REPLICATE(in_struct,dim1[0],dim1[1],dim1[2],dim1[3])
               5 : in_struct=REPLICATE(in_struct,dim1[0],dim1[1],dim1[2],dim1[3],dim1[4])
               6 : in_struct=REPLICATE(in_struct,dim1[0],dim1[1],dim1[2],dim1[3],dim1[4],dim1[5])
               7 : in_struct=REPLICATE(in_struct,dim1[0],dim1[1],dim1[2],dim1[3],dim1[4],dim1[5],dim1[6])
               8 : in_struct=REPLICATE(in_struct,dim1[0],dim1[1],dim1[2],dim1[3],dim1[4],dim1[5],dim1[6],dim1[7])
               ELSE:
            ENDCASE

         END
         3: in_struct=REPLICATE(in_struct,dim1,dim2)
         4: in_struct=REPLICATE(in_struct,dim1,dim2,dim3)
         5: in_struct=REPLICATE(in_struct,dim1,dim2,dim3,dim4)
         6: in_struct=REPLICATE(in_struct,dim1,dim2,dim3,dim4,dim5)
         7: in_struct=REPLICATE(in_struct,dim1,dim2,dim3,dim4,dim5,dim6)
         8: in_struct=REPLICATE(in_struct,dim1,dim2,dim3,dim4,dim5,dim6,dim7)
         9: in_struct=REPLICATE(in_struct,dim1,dim2,dim3,dim4,dim5,dim6,dim7,dim8)
         ELSE:
      ENDCASE

      n=N_ELEMENTS(TAG_NAMES(struct))
      FOR i=0,n-1 DO  in_struct[*].(i)=struct.(i)


      RETURN,in_struct
   ENDIF

   IF KEYWORD_SET(tag_array) THEN BEGIN
      FOR i=0,n-1 DO BEGIN
         CASE N_PARAMS() OF
            2: build_Structure,in_struct,names[i],REFORM(struct.(i),dim1)
            3: build_Structure,in_struct,names[i],REFORM(struct.(i),dim1,dim2)
            4: build_Structure,in_struct,names[i],REFORM(struct.(i),dim1,dim2,dim3)
            5: build_Structure,in_struct,names[i],REFORM(struct.(i),dim1,dim2,dim3,dim4)
            6: build_Structure,in_struct,names[i],REFORM(struct.(i),dim1,dim2,dim3,dim4,dim5)
            7: build_Structure,in_struct,names[i],REFORM(struct.(i),dim1,dim2,dim3,dim4,dim5,dim6)
            8: build_Structure,in_struct,names[i],REFORM(struct.(i),dim1,dim2,dim3,dim4,dim5,dim6,dim7)
            9: build_Structure,in_struct,names[i],REFORM(struct.(i),dim1,dim2,dim3,dim4,dim5,dim6,dim7,dim8)
            ELSE:
         ENDCASE

      ENDFOR

      RETURN,in_Struct
   ENDIF

   IF N_ELEMENTS(in_Struct) EQ 0 THEN BEGIN
      MESSAGE,'Forgetten switch: /struct_array OR /tag_array',/info
      RETURN,struct
   ENDIF
END

