  
/*
 * Copyright 2019-present Infosys Limited  
 *   
 * SPDX-License-Identifier: Apache-2.0    
 */
 
/**************************************
 * defaultMmeState.cpp
 * This is an auto generated file.
 * Please do not edit this file.
 * All edits to be made through template source file
 * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
 **************************************/

#include "smEnumTypes.h"
#include "actionTable.h"
#include "actionHandlers/actionHandlers.h"

#include "mmeStates/defaultMmeState.h"

using namespace mme;
using namespace SM;

/******************************************************************************
* Constructor
******************************************************************************/
DefaultMmeState::DefaultMmeState():State(State_e::default_mme_state)
{
}

/******************************************************************************
* Destructor
******************************************************************************/
DefaultMmeState::~DefaultMmeState()
{
}

/******************************************************************************
* creates and returns static instance
******************************************************************************/
DefaultMmeState* DefaultMmeState::Instance()
{
        static DefaultMmeState state;
        return &state;
}

/******************************************************************************
* initializes eventToActionsMap
******************************************************************************/
void DefaultMmeState::initialize()
{
        {
                ActionTable actionTable;
                actionTable.addAction(&ActionHandlers::default_attach_req_handler);
                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::ATTACH_REQ_FROM_UE, actionTable));
        }
        {
                ActionTable actionTable;
                actionTable.addAction(&ActionHandlers::default_detach_req_handler);
                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::DETACH_REQ_FROM_UE, actionTable));
        }
        {
                ActionTable actionTable;
                actionTable.addAction(&ActionHandlers::default_s1_release_req_handler);
                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::S1_REL_REQ_FROM_UE, actionTable));
        }
        {
                ActionTable actionTable;
                actionTable.addAction(&ActionHandlers::default_ddn_handler);
                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::DDN_FROM_SGW, actionTable));
        }
        {
                ActionTable actionTable;
                actionTable.addAction(&ActionHandlers::default_service_req_handler);
                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::SERVICE_REQUEST_FROM_UE, actionTable));
        }
        {
                ActionTable actionTable;
                actionTable.addAction(&ActionHandlers::default_cancel_loc_req_handler);
                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::CLR_FROM_HSS, actionTable));
        }
        {
                ActionTable actionTable;
                actionTable.addAction(&ActionHandlers::default_tau_req_handler);
                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::TAU_REQUEST_FROM_UE, actionTable));
        }
}
