;+
; Project     : SOLAR-B - EIS
;
; Name        : EIS_CPT_store_class__define
;
; Purpose     : Generates object EIS_CPT_store_class.
;
; Explanation : EIS_CPT_store_class.
;
;               Tags are :-
;                   store        : STRUCTURE ARRAY of type EIS_CPT_store
;                                  Tags are :-
;                                    time     : DOUBLE TAI time.
;                                    seq_name : STRING sequence name.
;                                    text     : STRARR(50) sequence text.
;                                    ntext    : INT no. of lines of text.
;                   number       : LONG no. of items in store
;
;               Methods are :-
;                   add          : Adds item to the store.
;                        Use         : <res = self->add(time, seq_name, text)>
;                        Inputs      : time      : DOUBLE TAI time
;                                      seq_name  : STRING sequence name.
;                                      text      : STRARR[] sequence text.
;                        Outputs     : res       : INT 1 or 0 indicating success or failure.
;                   reorder      : Rearranges store items into time order.
;                        Use         : <self->reorder, LIST=list>
;                        Keywords    : list      : LONARR[] order indexes.
;                   process      : Outputs items as text array.
;                        Use         : <res = self->process(text, REORDER=reorder)>
;                        Outputs     : res       : INT 1 or 0 indicating success or failure.
;                                      text      : STRARR[] text from sequences.
;                        Keywords    : reorder   : INT flag indicating should time order sequences.
;                   getNumber    : Returns no. of items in store.
;                        Use         : <num = self->getNumber()>
;                        Outputs     : num       : LONG no. of items in store.
;                   getTimes     : Returns times of items in store.
;                        Use         : <times = self->getTimes()>
;                        Outputs     : times       : DBLARR[] TAI times or [-1] if no sequences.
;                   getNames     : Gets names of sequences.
;                        Use         : <name = self->getNames()>
;                        Outputs     : names       : STRARR[] sequence names or ''.
;                   chkName      : Checks if name in store.
;                        Use         : <res = self->chkName(name)>
;                        Inputs      : name      : STRING sequence name.
;                        Outputs     : res       : INT 1 or 0 indicating in store or not.
;
; Use         : <dummy = {EIS_CPT_store_class}>
;
; Inputs      : None.
;
; Opt. Inputs : None.
;
; Outputs     : Sets up class structure.
;
; Opt. Outputs: None.
;
; Keywords    : None,
;
; Calls       : None.
;
; Common      : None.
;
; Restrictions: None.
;
; Side effects: None.
;
; Category    : EIS_CPT.
;
; Prev. Hist. : None.
;
; Written     : Martin Carter RAL 27/04/07, MKC
;
; Modified    : Version 0.0, 27/04/07, MKC
;               Version 0.1, 31/01/08, MKC
;                 Hardcoded size of store.
;                 Modified error messages.
;
; Version     : 0.1, 31/01/08
;-
;**********************************************************

FUNCTION eis_cpt_store_class::add, time, seq_name, text

  ; get no of text lines

  ntext = N_ELEMENTS(text)

  ; check not exceeded store capacity

  IF self.number EQ N_ELEMENTS(self.store) THEN BEGIN

    ; print error

    eis_cpt_message, 'ORL STORE NUMBER EXCEEDED', /INFORMATIONAL

    GOTO, error

  ENDIF

  ; check not exceeded no. of commands

  IF ntext GT N_ELEMENTS(self.store[0].text) THEN BEGIN

    eis_cpt_message, 'ORL STORE TEXT SIZE EXCEEDED', /INFORMATIONAL

    GOTO, error

  ENDIF

  ; set up new timed sequence

  self.store[self.number].time = time

  self.store[self.number].seq_name = seq_name

  IF ntext GT 0 THEN self.store[self.number].text[0:ntext-1] = text

  self.store[self.number].ntext = ntext

  ; increment number of items in store

  self.number = self.number + 1

  ; return finished OK flag

  RETURN, 1

error :

  ; issue routine name

  MESSAGE, 'ERROR', /INFORMATIONAL

  ; return error flag

  RETURN, 0

END

PRO eis_cpt_store_class::reorder, LIST=list

  ; order store according to time

  IF self.number GT 0 THEN BEGIN

    list = SORT(self.store[0:self.number-1].time)

    self.store[0:self.number-1] = self.store[list]

  ENDIF ELSE BEGIN

   list = [-1]

  ENDELSE

END

FUNCTION eis_cpt_store_class::process, text, REORDER=reorder

  ; check if reorder flag set

  IF KEYWORD_SET(reorder) THEN self->reorder

  ; loop through ORL sequences adding sequence commands to text

  FOR k = 0, self.number-1 DO BEGIN

    ; add to sequence text

    eis_cpt_add, text, self.store[k].text[0:self.store[k].ntext-1]

  ENDFOR

  ; return finished OK flag

  RETURN, 1

error :

  ; issue routine name

  MESSAGE, 'ERROR', /INFORMATIONAL

  ; return error flag

  RETURN, 0

END

FUNCTION eis_cpt_store_class::getNumber

  ; return number property of Object

  RETURN, self.number

END

FUNCTION eis_cpt_store_class::getTimes

  ; return times property of Object or [-1]

  IF self.number EQ 0 THEN RETURN, -1 ELSE RETURN, self.store[0:self.number-1].time

END

FUNCTION eis_cpt_store_class::getNames

  ; return seq_name property of Object or ''

  IF self.number EQ 0 THEN RETURN, '' ELSE RETURN, self.store[0:self.number-1].seq_name

END

FUNCTION eis_cpt_store_class::chkName, name

  ; return flag indicating if name in store

  IF self.number EQ 0 THEN RETURN, 0 ELSE BEGIN

    ; check for name

    dummy = WHERE(name EQ self.store[0:self.number-1].seq_name, count)

    IF count EQ 0 THEN RETURN, 0 ELSE $
    IF count EQ 1 THEN RETURN, 1 ELSE MESSAGE, 'IMPLEMENTATION ERROR'

  ENDELSE

END

PRO eis_cpt_store__define

  dummy = {EIS_CPT_store, time:0.0D0, seq_name:'', text:STRARR(50), ntext:0}

END

PRO eis_cpt_store_class__define

  ; NB set size of store to some suitable number
  ; should be the same as size used in OG commands class
  ; ideally the store size would be a variable determied on initialization
  ; but do not believe this can be done in IDL i.e have to reserve heap for each instance
  ; of the object

  dummy = {EIS_CPT_store_class, store:REPLICATE({EIS_CPT_store},100), number:0L }

END



