!--------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|-|
MODULE MsgTerminate
    USE MsgBase
    USE mpi
    IMPLICIT NONE

    CHARACTER( len=* ), PARAMETER :: MTT_msgName     = 'Terminate'
    INTEGER, PARAMETER            :: MTT_msgTag      = 61
    INTEGER                       :: MTT_mpiDatatype = MPI_DATATYPE_NULL

    !----|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|-|
    TYPE, EXTENDS( MsgBaseType ) :: MsgTerminateType
    CONTAINS
        PROCEDURE :: getMpiDatatype => MTT_getMpiDatatype
        PROCEDURE :: getMsgName => MTT_getName
        PROCEDURE :: str => MTT_getStr
        PROCEDURE :: getMsgTag => MTT_getMsgTag
        PROCEDURE, PRIVATE :: MTT_loadMpiDatatype
    END TYPE

CONTAINS

    !----|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|-|
    FUNCTION MTT_getMsgTag( self ) RESULT( response )
        CLASS( MsgTerminateType ) :: self
        INTEGER :: response
        response = MTT_msgTag
    END FUNCTION

    !----|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|-|
    FUNCTION MTT_getName( self ) RESULT( iName )
        CLASS( MsgTerminateType ), INTENT( in ) :: self
        CHARACTER( len=132 ) :: iName
        iName = MTT_msgName
    END FUNCTION

    !----|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|-|
    SUBROUTINE MTT_loadMpiDatatype( self )
        CLASS( MsgTerminateType ) :: self
        TYPE( MpiAssistType ) :: maType
        maType = MpiAssistType( 1 )
        CALL maType%MA_loadComponent( thisItem=self%baseId, itemNumber=1, itemCount=1, itemType=MPI_INTEGER )
        MTT_mpiDatatype = maType%MA_getType()
    END SUBROUTINE

    !----|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|-|
    FUNCTION MTT_getMpiDatatype( self )
        CLASS( MsgTerminateType ) :: self
        INTEGER :: MTT_getMpiDatatype
        IF( MPI_DATATYPE_NULL == MTT_mpiDatatype ) CALL self%MTT_loadMpiDatatype()
        MTT_getMpiDatatype = MTT_mpiDatatype
    END FUNCTION

    !----|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|-|
    FUNCTION MTT_getStr( self )
        CLASS( MsgTerminateType ), INTENT( in ) :: self
        CHARACTER( len=132 ) :: MTT_getStr
        IF( MPI_DATATYPE_NULL == MTT_mpiDatatype ) MTT_mpiDatatype = self%getMpiDatatype()
        WRITE( MTT_getStr, '("MTT:: datatype=", I0)' ) MTT_mpiDatatype
    END FUNCTION
END MODULE
!--------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|-|
