///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Copyright (c) 2000-2019 Ericsson Telecom AB                               //
//                                                                           //
// All rights reserved. This program and the accompanying materials          //
// are made available under the terms of the Eclipse Public License v2.0     //
// which accompanies this distribution, and is available at                  //
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html                                 //
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
// Module: EPTF_CLL_NQueue_Functions
//
// Purpose:
//  This module contains the function definitions of the EPTF NQueue feature
//
// Module Parameters:
//  -
//
// Module depends on:
//  <EPTF_CLL_Base_Functions>
//  <EPTF_CLL_NQueue_Definitions>
//
// Current Owner:
//  Gabor Tatarka (EGBOTAT)
//
// Public functions:
//  - <f_EPTF_NQueue_init_CT> (pl_selfName)
//  - <f_EPTF_NQueue_createQueue> (pl_name) return EPTF_NQueue_QueueId
//  - <f_EPTF_NQueue_deleteQueue> (pl_queue)
//  - <f_EPTF_NQueue_getNameOfQueue> (pl_queue) return charstring
//  - <f_EPTF_NQueue_createChain> (pl_queue) return EPTF_NQueue_ChainId
//  - <f_EPTF_NQueue_createItemAtChainHead> (pl_queue, pl_chain) return EPTF_NQueue_ItemIdx
//  - <f_EPTF_NQueue_createItemAtChainTail> (pl_queue, pl_chain) return EPTF_NQueue_ItemIdx
//  - <f_EPTF_NQueue_createItemAfter> (pl_queue, pl_afterIdx) return EPTF_NQueue_ItemIdx
//  - <f_EPTF_NQueue_createItemBefore> (pl_queue, pl_beforeIdx) return EPTF_NQueue_ItemIdx
//  - <f_EPTF_NQueue_createItemsAtChainHead> (pl_queue, pl_chain, pl_count)
//  - <f_EPTF_NQueue_createItemsAtChainTail> (pl_queue, pl_chain, pl_count)
//  - <f_EPTF_NQueue_moveToHead> (pl_queue, pl_toChain, pl_item)
//  - <f_EPTF_NQueue_moveToTail> (pl_queue, pl_toChain, pl_item)
//  - <f_EPTF_NQueue_moveAfter> (pl_queue, pl_afterIdx, pl_item)
//  - <f_EPTF_NQueue_moveBefore> (pl_queue, pl_beforeIdx, pl_item)
//  - <f_EPTF_NQueue_getChainOfItem> (pl_queue, pl_item) return EPTF_NQueue_ChainId
//  - <f_EPTF_NQueue_getLengthOfQueue> (pl_queue) return integer
//  - <f_EPTF_NQueue_getLengthOfChain> (pl_queue, pl_chain) return integer
//  - <f_EPTF_NQueue_getHeadOfChain> (pl_queue, pl_chain) return EPTF_NQueue_ItemIdx
//  - <f_EPTF_NQueue_getTailOfChain> (pl_queue, pl_chain) return EPTF_NQueue_ItemIdx
//  - <f_EPTF_NQueue_getNextItemIdx> (pl_queue, pl_item) return boolean
//  - <f_EPTF_NQueue_getPrevItemIdx> (pl_queue, pl_item) return boolean
//  - <f_EPTF_NQueue_logQueue> (pl_queue)
//  - <f_EPTF_NQueue_logChain> (pl_queue, pl_chain)
//  - <f_EPTF_NQueue_logChainFields> (pl_queue, pl_chain)
//  - <f_EPTF_NQueue_dumpToPng> (pl_queue, pl_name)
//
// Last Review Date:
//  2011-02-03
//
///////////////////////////////////////////////////////////////////////////////

module EPTF_CLL_NQueue_Functions {

import from EPTF_CLL_Base_Functions all;
import from EPTF_CLL_NQueue_Definitions all;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_init_CT
// 
//  Purpose:
//    Initializes the NQueue feature
//
//  Parameters:
//    pl_selfName - *in* *charstring* - EPTF self name
///////////////////////////////////////////////////////////
public function f_EPTF_NQueue_init_CT(in charstring pl_selfName)
runs on EPTF_NQueue_CT
{
  if(v_EPTF_NQueue_initialized) { return }
  f_EPTF_Base_init_CT(pl_selfName);
  f_EPTF_Base_registerCleanup(refers(f_EPTF_NQueue_cleanup_CT));
  f_EPTF_NQueue_init();
  v_EPTF_NQueue_initialized := true;
}

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_createQueue
// 
//  Purpose:
//    Creates a new empty queue
//
//  Parameters:
//    pl_name - *in* *charstring* - optional name for the queue
//
//  Return Value:
//    <EPTF_NQueue_QueueId> - the ID of the created queue
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_createQueue(
  in charstring pl_name := "")
return EPTF_NQueue_QueueId;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_deleteQueue
// 
//  Purpose:
//    Deletes an existing queue and all the resources it uses
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the ID of the queue to delete
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_deleteQueue(
  in EPTF_NQueue_QueueId pl_queue);

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_getNameOfQueue
// 
//  Purpose:
//    Returns the name of a queue
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the ID of the queue
//
//  Return Value:
//    *charstring* - the name of the queue
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_getNameOfQueue(
  in EPTF_NQueue_QueueId pl_queue)
return charstring;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_createChain
// 
//  Purpose:
//    Creates a new chain in an existing queue
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the queue ID
//
//  Return Value:
//    <EPTF_NQueue_ChainId> - the ID of the created chain
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_createChain(
  in EPTF_NQueue_QueueId pl_queue)
return EPTF_NQueue_ChainId;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_createItemAtChainHead
// 
//  Purpose:
//    Creates a new item at the head of a chain
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the queue ID
//    pl_chain - *in* <EPTF_NQueue_ChainId> - the chain ID
//
//  Return Value:
//    <EPTF_NQueue_ItemIdx> - the index of the created item
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_createItemAtChainHead(
  in EPTF_NQueue_QueueId pl_queue,
  in EPTF_NQueue_ChainId pl_chain)
return EPTF_NQueue_ItemIdx;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_createItemAtChainTail
// 
//  Purpose:
//    Creates a new item at the tail of a chain
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the queue ID
//    pl_chain - *in* <EPTF_NQueue_ChainId> - the chain ID
//
//  Return Value:
//    <EPTF_NQueue_ItemIdx> - the index of the created item
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_createItemAtChainTail(
  in EPTF_NQueue_QueueId pl_queue,
  in EPTF_NQueue_ChainId pl_chain)
return EPTF_NQueue_ItemIdx;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_createItemAfter
// 
//  Purpose:
//    Creates a new item after another item (and in its chain)
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the queue ID
//    pl_afterIdx - *in* <EPTF_NQueue_ItemIdx> - the item index after which to create the item
//
//  Return Value:
//    <EPTF_NQueue_ItemIdx> - the index of the created item
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_createItemAfter(
  in EPTF_NQueue_QueueId pl_queue,
  in EPTF_NQueue_ItemIdx pl_afterIdx)
return EPTF_NQueue_ItemIdx;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_createItemBefore
// 
//  Purpose:
//    Creates a new item before another item (and in its chain)
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the queue ID
//    pl_beforeIdx - *in* <EPTF_NQueue_ItemIdx> - the item index before which to create the item
//
//  Return Value:
//    <EPTF_NQueue_ItemIdx> - the index of the created item
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_createItemBefore(
  in EPTF_NQueue_QueueId pl_queue,
  in EPTF_NQueue_ItemIdx pl_beforeIdx)
return EPTF_NQueue_ItemIdx;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_createItemsAtChainHead
// 
//  Purpose:
//    Creates items at the head of a chain
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the queue ID
//    pl_chain - *in* <EPTF_NQueue_ChainId> - the chain ID
//    pl_count - *in* *integer* - the number of items to create
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_createItemsAtChainHead(
  in EPTF_NQueue_QueueId pl_queue,
  in EPTF_NQueue_ChainId pl_chain,
  in integer pl_count);

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_createItemsAtChainTail
// 
//  Purpose:
//    Creates items at the tail of a chain
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the queue ID
//    pl_chain - *in* <EPTF_NQueue_ChainId> - the chain ID
//    pl_count - *in* *integer* - the number of items to create
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_createItemsAtChainTail(
  in EPTF_NQueue_QueueId pl_queue,
  in EPTF_NQueue_ChainId pl_chain,
  in integer pl_count);

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_moveToHead
// 
//  Purpose:
//    Moves an item to the head of a chain
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the queue ID
//    pl_toChain - *in* <EPTF_NQueue_ChainId> - the target chain ID
//    pl_item - *in* <EPTF_NQueue_ItemIdx> - the item index
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_moveToHead(
  in EPTF_NQueue_QueueId pl_queue,
  in EPTF_NQueue_ChainId pl_toChain, // note: can be the same chain -> move to front
  in EPTF_NQueue_ItemIdx pl_item);

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_moveToTail
// 
//  Purpose:
//    Moves an item to the tail of a chain
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the queue ID
//    pl_toChain - *in* <EPTF_NQueue_ChainId> - the target chain ID
//    pl_item - *in* <EPTF_NQueue_ItemIdx> - the item index
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_moveToTail(
  in EPTF_NQueue_QueueId pl_queue,
  in EPTF_NQueue_ChainId pl_toChain, // note: can be the same chain -> move to back
  in EPTF_NQueue_ItemIdx pl_item);

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_moveAfter
// 
//  Purpose:
//    Moves an item after another item (and to its chain)
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the queue ID
//    pl_afterIdx - *in* <EPTF_NQueue_ItemIdx> - the item index after which to move pl_item
//    pl_item - *in* <EPTF_NQueue_ItemIdx> - the index of the item to move
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_moveAfter(
  in EPTF_NQueue_QueueId pl_queue,
  in EPTF_NQueue_ItemIdx pl_afterIdx, // index of the item after which to move item pl_item
  in EPTF_NQueue_ItemIdx pl_item);

// note: target chain is the chain of the item at pl_beforeIdx
///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_moveBefore
// 
//  Purpose:
//    Moves an item before another item (and to its chain)
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the queue ID
//    pl_beforeIdx - *in* <EPTF_NQueue_ItemIdx> - the item index before which to move pl_item
//    pl_item - *in* <EPTF_NQueue_ItemIdx> - the index of the item to move
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_moveBefore(
  in EPTF_NQueue_QueueId pl_queue,
  in EPTF_NQueue_ItemIdx pl_beforeIdx, // index of the item before which to move item pl_idx
  in EPTF_NQueue_ItemIdx pl_item); // FIXME: pl_item

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_getChainOfItem
// 
//  Purpose:
//    Returns the chain ID of an item
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the queue ID
//    pl_item - *in* <EPTF_NQueue_ItemIdx> - the item index
//
//  Return Value:
//    <EPTF_NQueue_ChainId> - the chain ID of the item
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_getChainOfItem(
  in EPTF_NQueue_QueueId pl_queue,
  in EPTF_NQueue_ItemIdx pl_item)
return EPTF_NQueue_ChainId;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_getLengthOfQueue
// 
//  Purpose:
//    Returns the length (total number of items) of the queue
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the queue ID
//
//  Return Value:
//    *integer* - the length of the queue
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_getLengthOfQueue(
  in EPTF_NQueue_QueueId pl_queue)
return integer;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_getLengthOfChain
// 
//  Purpose:
//    Returns the length of a chain
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the queue ID
//    pl_chain - *in* <EPTF_NQueue_ChainId> - the chain ID
//
//  Return Value:
//    *integer* - the length of the chain
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_getLengthOfChain(
  in EPTF_NQueue_QueueId pl_queue,
  in EPTF_NQueue_ChainId pl_chain)
return integer;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_getHeadOfChain
// 
//  Purpose:
//    Returns the head item index of the chain or -1 if empty
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the queue ID
//    pl_chain - *in* <EPTF_NQueue_ChainId> - the chain ID
//
//  Return Value:
//    <EPTF_NQueue_ItemIdx> - the head item index or -1 if empty
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_getHeadOfChain(
  in EPTF_NQueue_QueueId pl_queue,
  in EPTF_NQueue_ChainId pl_chain)
return EPTF_NQueue_ItemIdx;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_getTailOfChain
// 
//  Purpose:
//    Returns the tail item index of the chain or -1 if empty
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the queue ID
//    pl_chain - *in* <EPTF_NQueue_ChainId> - the chain ID
//
//  Return Value:
//    <EPTF_NQueue_ItemIdx> - the tail item index or -1 if empty
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_getTailOfChain(
  in EPTF_NQueue_QueueId pl_queue,
  in EPTF_NQueue_ChainId pl_chain)
return EPTF_NQueue_ItemIdx;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_getNextItemIdx
// 
//  Purpose:
//    Gets the next item index in a chain
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the queue ID
//    pl_item - *inout* <EPTF_NQueue_ItemIdx> - the item index
//
//  Return Value:
//    *boolean* - true if pl_item changed, false if end of chain reached
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_getNextItemIdx(
  in EPTF_NQueue_QueueId pl_queue,
  inout EPTF_NQueue_ItemIdx pl_item) // changed to next item index if any
return boolean;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_getPrevItemIdx
// 
//  Purpose:
//    Gets the previous item index in a chain
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the queue ID
//    pl_item - *inout* <EPTF_NQueue_ItemIdx> - the item index
//
//  Return Value:
//    *boolean* - true if pl_item changed, false if start of chain reached
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_getPrevItemIdx(
  in EPTF_NQueue_QueueId pl_queue,
  inout EPTF_NQueue_ItemIdx pl_item) // changed to previous item index if any
return boolean;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_logQueue
// 
//  Purpose:
//    Logs a queue
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the queue ID
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_logQueue(
  in EPTF_NQueue_QueueId pl_queue);

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_logChain
// 
//  Purpose:
//    Logs a chain including its items
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the queue ID
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_logChain(
  in EPTF_NQueue_QueueId pl_queue,
  in EPTF_NQueue_ChainId pl_chain);

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_logChainFields
// 
//  Purpose:
//    Logs the header fields of a chain
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the queue ID
//    pl_chain - *in* <EPTF_NQueue_ChainId> - the chain ID
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_logChainFields(
  in EPTF_NQueue_QueueId pl_queue,
  in EPTF_NQueue_ChainId pl_chain);

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_dumpToPng
// 
//  Purpose:
//    Dumps the queue to dot and PNG files (requires `dot` to be installed)
//
//  Parameters:
//    pl_queue - *in* <EPTF_NQueue_QueueId> - the queue ID
//    pl_name - *in* *charstring* - file name *without extension*
//
//  Detailed Comments:
//    For testing purposes, number of items in the queue should not
//    be too large, due to the limitations of `dot`
///////////////////////////////////////////////////////////
public external function f_EPTF_NQueue_dumpToPng(
  in EPTF_NQueue_QueueId pl_queue,
  in charstring pl_name);


group EPTF_NQueue_PrivateFunctions {

  private function f_EPTF_NQueue_cleanup_CT()
  runs on EPTF_NQueue_CT
  {
    if(not v_EPTF_NQueue_initialized) { return }
    f_EPTF_NQueue_cleanup();
    v_EPTF_NQueue_initialized := false;
  }

  private external function f_EPTF_NQueue_init();
  private external function f_EPTF_NQueue_cleanup();

} // group EPTF_NQueue_PrivateFunctions

} // module
