Skip to content
Snippets Groups Projects
mtime_t_event.inc 6.99 KiB
  ! ================================================================================
  ! event section:
  ! ================================================================================

  ! generic assignment for constructors
  !
  FUNCTION t_event_assign_raw(name, referenceDate, firstdate, lastDate, interval, offset)
    TYPE(t_event) :: t_event_assign_raw
    CHARACTER(len=*), INTENT(in)           :: name
    CHARACTER(len=*), INTENT(in)           :: referenceDate
    CHARACTER(len=*), INTENT(in)           :: firstDate
    CHARACTER(len=*), INTENT(in)           :: lastDate
    CHARACTER(len=*), INTENT(in)           :: interval
    CHARACTER(len=*), INTENT(in), OPTIONAL :: offset

    CHARACTER(len=4)                       :: zeroOffset = "PT0S"

    t_event_assign_raw%eventName              = name
    t_event_assign_raw%eventReferenceDateTime = t_datetime(referenceDate)
    t_event_assign_raw%eventFirstDateTime     = t_datetime(firstDate)
    t_event_assign_raw%eventLastDateTime      = t_datetime(lastDate)
    t_event_assign_raw%eventInterval          = t_timedelta(interval)
    IF (PRESENT(offset)) THEN
      t_event_assign_raw%eventOffset = t_timedelta(offset)
    ELSE
      t_event_assign_raw%eventOffset = t_timedelta(zeroOffset)
    ENDIF

  END FUNCTION t_event_assign_raw

  FUNCTION t_event_assign_types(name, referenceDate, firstdate, lastDate, interval, offset)
    TYPE(t_event) :: t_event_assign_types
    CHARACTER(len=*), INTENT(in)            :: name
    TYPE(t_datetime), INTENT(in)            :: referenceDate
    TYPE(t_datetime), INTENT(in)            :: firstDate
    TYPE(t_datetime), INTENT(in)            :: lastDate
    TYPE(t_timedelta), INTENT(in)           :: interval
    TYPE(t_timedelta), INTENT(in), OPTIONAL :: offset

    CHARACTER(len=4)                       :: zeroOffset = "PT0S"

    t_event_assign_types%eventName              = name
    t_event_assign_types%eventReferenceDateTime = referenceDate
    t_event_assign_types%eventFirstDateTime     = firstDate
    t_event_assign_types%eventLastDateTime      = lastDate
    t_event_assign_types%eventInterval          = interval
    IF (PRESENT(offset)) THEN
      t_event_assign_types%eventOffset = offset
    ELSE
      t_event_assign_types%eventOffset = t_timedelta(zeroOffset)
    ENDIF

  END FUNCTION t_event_assign_types

  ! Iterate to next event in event group.
  !
  ! @return NULL() if no next event available.
  FUNCTION t_event_next_event(this)
    TYPE(t_event), POINTER :: t_event_next_event
    CLASS(t_event) :: this
    t_event_next_event => NULL()
    IF (ASSOCIATED(this%nextEventInGroup)) THEN
      t_event_next_event => this%nextEventInGroup
    ENDIF
  END FUNCTION t_event_next_event

  FUNCTION t_event_getId(this) RESULT(res)
    INTEGER(c_int64_t) :: res
    CLASS (t_event) :: this
    res = this%eventId
  END FUNCTION t_event_getId

  FUNCTION t_event_getName(this) RESULT(res)
    CHARACTER(len=max_event_str_len) :: res
    CLASS (t_event) :: this
    res = this%eventName
  END FUNCTION t_event_getName

  FUNCTION t_event_getFirstDatetime (this) RESULT(res)
    TYPE(t_datetime)        :: res
    CLASS(t_event)          :: this
    res = this%eventFirstDateTime
  END FUNCTION t_event_getFirstDatetime

  FUNCTION t_event_getInterval(this) RESULT(res)
    TYPE(t_timedelta)        :: res
    CLASS(t_event)           :: this
    res = this%eventInterval
  END FUNCTION t_event_getInterval

  FUNCTION t_event_getLastDatetime(this) RESULT(res)
    TYPE(t_datetime)        :: res
    CLASS(t_event)          :: this
    res = this%eventLastDateTime
  END FUNCTION t_event_getLastDatetime

  FUNCTION t_event_getNextOccurrenceDatetime(this, my_currentdatetime) RESULT(res)
    TYPE(t_datetime)             :: res
    CLASS(t_event)               :: this
    TYPE(t_datetime), INTENT(IN) :: my_currentdatetime
    res = this%triggerNextEventDateTime
  END FUNCTION t_event_getNextOccurrenceDatetime

  FUNCTION t_event_getPrevOccurrenceDatetime(this, my_currentdatetime) RESULT(res)
    TYPE(t_datetime)             :: res
    CLASS(t_event)               :: this
    TYPE(t_datetime), INTENT(IN) :: my_currentdatetime
    res = this%triggeredPreviousEventDateTime
  END FUNCTION t_event_getPrevOccurrenceDatetime


  FUNCTION t_event_is_active(this, my_datetime, plus_slack, minus_slack) result(ret)
    CLASS(t_event), TARGET      :: this
    TYPE(t_datetime)            :: my_datetime
    TYPE(t_timedelta), OPTIONAL :: plus_slack
    TYPE(t_timedelta), OPTIONAL :: minus_slack
    TYPE(t_event), POINTER      :: tmp_ev
    TYPE(c_ptr) :: tmp_dt, tmp_plus, tmp_minus
    logical(c_bool) :: ret

    tmp_ev => this
    tmp_dt = my_datetime%get_c_pointer()
    if (present(plus_slack)) then
      tmp_plus = plus_slack%get_c_pointer()
    else
      tmp_plus = c_null_ptr
    endif

    if (present(minus_slack)) then
      tmp_minus = minus_slack%get_c_pointer()
    else
      tmp_minus = c_null_ptr
    endif

    ret = my_isCurrentEventActive(c_loc(tmp_ev), tmp_dt, &
          &                       tmp_plus,  tmp_minus)

    CALL my_deallocatedatetime(tmp_dt)
    if (c_associated(tmp_plus))  CALL my_deallocatetimedelta(tmp_plus)
    if (c_associated(tmp_minus)) CALL my_deallocatetimedelta(tmp_minus)
  END FUNCTION t_event_is_active

  ! ================================================================================
  ! event group section:
  ! ================================================================================

  FUNCTION t_eventGroup_constructor(name) RESULT(this_event_group)
    TYPE(t_eventGroup) :: this_event_group
    CHARACTER(len=*), INTENT(in) :: name
    event_group_id                        = event_group_id + 1
    this_event_group%event_group_id       = event_group_id
    this_event_group%event_group_name     = name
    this_event_group%first_event_in_group => NULL()
    this_event_group%last_event_in_group  => NULL()
  END FUNCTION t_eventGroup_constructor

  SUBROUTINE t_eventGroup_addToGroup(this, event_to_add)
    CLASS (t_eventGroup) :: this
    TYPE(t_event), TARGET :: event_to_add
    IF (.NOT. ASSOCIATED(this%last_event_in_group)) THEN
      allocate(this%first_event_in_group, source=event_to_add)
      this%last_event_in_group => this%first_event_in_group
      NULLIFY(this%first_event_in_group%nextEventInGroup)
    ELSE
      allocate(this%last_event_in_group%nextEventInGroup, source=event_to_add)
      this%last_event_in_group => this%last_event_in_group%nextEventInGroup
    ENDIF
  END SUBROUTINE t_eventGroup_addToGroup

  FUNCTION t_eventGroup_getGroupId(this) RESULT(group_id)
    INTEGER :: group_id
    CLASS(t_eventGroup) ::this
    group_id = this%event_group_id
  END FUNCTION t_eventGroup_getGroupId

  FUNCTION t_eventGroup_getGroupName(this) RESULT(name)
    CHARACTER(len=max_groupname_str_len) :: name
    CLASS(t_eventGroup) :: this
    name = this%event_group_name
  END FUNCTION t_eventGroup_getGroupName

  FUNCTION t_eventGroup_getFirstEvent(this) RESULT(event_ptr)
    TYPE(t_event), POINTER :: event_ptr
    CLASS(t_eventGroup) :: this
    event_ptr => this%first_event_in_group
  END FUNCTION t_eventGroup_getFirstEvent