///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// 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_RBT_Functions
//
// Purpose:
//  This module contains the function definitions of the EPTF RedBlackTree feature
//
// Module Parameters:
//  -
//
// Module depends on:
//  <EPTF_CLL_Base_Functions>
//  <EPTF_CLL_RBT_Definitions>
//
// Current Owner:
//  Gabor Tatarka (EGBOTAT)
//
// Public functions:
//  - <f_EPTF_RBT_init_CT> (pl_selfName)
//  - <f_EPTF_RBT_createIntTree> (pl_name) return EPTF_RBT_TreeId
//  - <f_EPTF_RBT_createFloatTree> (pl_name) return EPTF_RBT_TreeId
//  - <f_EPTF_RBT_createCharstringTree> (pl_name) return EPTF_RBT_TreeId
//  - <f_EPTF_RBT_deleteTree> (pl_tree)
//  - <f_EPTF_RBT_getName> (pl_tree) return charstring
//  - <f_EPTF_RBT_insertIntItem> (pl_tree, pl_key) return EPTF_RBT_ItemIdx
//  - <f_EPTF_RBT_insertFloatItem> (pl_tree, pl_key) return EPTF_RBT_ItemIdx
//  - <f_EPTF_RBT_insertCharstringItem> (pl_tree, pl_key) return EPTF_RBT_ItemIdx
//  - <f_EPTF_RBT_removeItem> (pl_tree, pl_item)
//  - <f_EPTF_RBT_getItemWithSmallestKey> (pl_tree) return EPTF_RBT_ItemIdx
//  - <f_EPTF_RBT_getKeyOfIntItem> (pl_tree, pl_item) return integer
//  - <f_EPTF_RBT_getKeyOfFloatItem> (pl_tree, pl_item) return float
//  - <f_EPTF_RBT_getKeyOfCharstringItem> (pl_tree, pl_item) return float
//  - <f_EPTF_RBT_findFirstItemByIntKey> (pl_tree, pl_key) return EPTF_RBT_ItemIdx
//  - <f_EPTF_RBT_findFirstItemByFloatKey> (pl_tree, pl_key) return EPTF_RBT_ItemIdx
//  - <f_EPTF_RBT_findFirstItemByCharstringKey> (pl_tree, pl_key) return EPTF_RBT_ItemIdx
//  - <f_EPTF_RBT_getRoot> (pl_tree) return EPTF_RBT_ItemIdx
//  - <f_EPTF_RBT_getLeft> (pl_tree, pl_item) return EPTF_RBT_ItemIdx
//  - <f_EPTF_RBT_getRight> (pl_tree, pl_item) return EPTF_RBT_ItemIdx
//  - <f_EPTF_RBT_getParent> (pl_tree, pl_item) return EPTF_RBT_ItemIdx
//  - <f_EPTF_RBT_getNextInChain> (pl_tree, pl_item) return EPTF_RBT_ItemIdx
//  - <f_EPTF_RBT_getPrevInChain> (pl_tree, pl_item) return EPTF_RBT_ItemIdx
//  - <f_EPTF_RBT_iterateIncremental> (pl_tree, pl_item) return EPTF_RBT_ItemIdx
//  - <f_EPTF_RBT_sortIncremental> (pl_tree, pl_itemsSorted)
//  - <f_EPTF_RBT_isItemValid> (pl_tree, pl_item) return boolean
//  - <f_EPTF_RBT_dumpToPng> (pl_tree, pl_name)
//
// Last Review Date:
//  -
//
///////////////////////////////////////////////////////////////////////////////

module EPTF_CLL_RBT_Functions {

import from EPTF_CLL_Base_Functions all;
import from EPTF_CLL_RBT_Definitions all;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_NQueue_init_CT
// 
//  Purpose:
//    Initializes the RedBlackTree feature
//
//  Parameters:
//    pl_selfName - *in* *charstring* - EPTF self name
///////////////////////////////////////////////////////////
public function f_EPTF_RBT_init_CT(in charstring pl_selfName)
runs on EPTF_RBT_CT
{
  if(v_EPTF_RBT_initialized) { return }
  f_EPTF_Base_init_CT(pl_selfName);
  f_EPTF_Base_registerCleanup(refers(f_EPTF_RBT_cleanup_CT));
  f_EPTF_RBT_init();
  v_EPTF_RBT_initialized := true;
}

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_createIntTree
// 
//  Purpose:
//    Creates a new empty tree with integer key type
//
//  Parameters:
//    pl_name - *in* *charstring* - name of the tree, optional
//
//  Return Value:
//    <EPTF_RBT_TreeId> - the ID of the created tree
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_createIntTree(in charstring pl_name := "")
return EPTF_RBT_TreeId;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_createFloatTree
// 
//  Purpose:
//    Creates a new empty tree with float key type
//
//  Parameters:
//    pl_name - *in* *charstring* - name of the tree, optional
//
//  Return Value:
//    <EPTF_RBT_TreeId> - the ID of the created tree
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_createFloatTree(in charstring pl_name := "")
return EPTF_RBT_TreeId;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_createCharstringTree
// 
//  Purpose:
//    Creates a new empty tree with charstring key type
//
//  Parameters:
//    pl_name - *in* *charstring* - name of the tree, optional
//
//  Return Value:
//    <EPTF_RBT_TreeId> - the ID of the created tree
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_createCharstringTree(in charstring pl_name := "")
return EPTF_RBT_TreeId;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_deleteTree
// 
//  Purpose:
//    Deletes an existing tree and all the resources it uses
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//
//  Return Value:
//    -
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_deleteTree(in EPTF_RBT_TreeId pl_tree);

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_getName
// 
//  Purpose:
//    Returns the name of a tree
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//
//  Return Value:
//    *charstring* - name of the tree
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_getName(in EPTF_RBT_TreeId pl_tree)
return charstring;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_getItemCount
// 
//  Purpose:
//    Returns the number of items (node + chain) of a tree
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//
//  Return Value:
//    *integer* - number of items
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_getItemCount(in EPTF_RBT_TreeId pl_tree)
return integer;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_insertIntItem
// 
//  Purpose:
//    Inserts (creates) a new item into the tree with integer key type
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//    pl_key - *in* *integer* - the key of the new item
//
//  Return Value:
//    <EPTF_RBT_ItemIdx> - the ID of the created item
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_insertIntItem(
  in EPTF_RBT_TreeId pl_tree,
  in integer pl_key)
return EPTF_RBT_ItemIdx;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_insertFloatItem
// 
//  Purpose:
//    Inserts (creates) a new item into the tree with float key type
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//    pl_key - *in* *float* - the key of the new item
//
//  Return Value:
//    <EPTF_RBT_ItemIdx> - the ID of the created item
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_insertFloatItem(
  in EPTF_RBT_TreeId pl_tree,
  in float pl_key)
return EPTF_RBT_ItemIdx;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_insertCharstringItem
// 
//  Purpose:
//    Inserts (creates) a new item into the tree with charstring key type
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//    pl_key - *in* *charstring* - the key of the new item
//
//  Return Value:
//    <EPTF_RBT_ItemIdx> - the ID of the created item
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_insertCharstringItem(
  in EPTF_RBT_TreeId pl_tree,
  in charstring pl_key)
return EPTF_RBT_ItemIdx;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_removeItem
// 
//  Purpose:
//    Removes an item from the tree
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//    pl_key - *in* <EPTF_RBR_ItemIdx> - the index of the item to remove
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_removeItem(
  in EPTF_RBT_TreeId pl_tree,
  in EPTF_RBT_ItemIdx pl_item);

group RBT_Scheduler {
  friend module EPTF_CLL_RBTScheduler_Functions;
  friend external function f_EPTF_RBT_removeItemWithoutFree(
    in EPTF_RBT_TreeId pl_tree,
    in EPTF_RBT_ItemIdx pl_item);
  friend external function f_EPTF_RBT_freeInvalidItem(
    in EPTF_RBT_TreeId pl_tree,
    in EPTF_RBT_ItemIdx pl_item);
} // group RBT_Scheduler


///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_getItemWithSmallestKey
// 
//  Purpose:
//    Returns the item with the smallest key in the tree
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//
//  Return Value:
//    <EPTF_RBT_ItemIdx> - the ID of the item with smallest key, or -1 if empty tree
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_getItemWithSmallestKey(
  in EPTF_RBT_TreeId pl_tree)
return EPTF_RBT_ItemIdx;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_getKeyOfIntItem
// 
//  Purpose:
//    Returns the key of an item of the tree with integer key type
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//    pl_item - *in* <EPTF_RBT_ItemIdx> - the item index
//
//  Return Value:
//    *integer* - the key of the item
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_getKeyOfIntItem(
  in EPTF_RBT_TreeId pl_tree,
  in EPTF_RBT_ItemIdx pl_item)
return integer;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_getKeyOfFloatItem
// 
//  Purpose:
//    Returns the key of an item of the tree with float key type
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//    pl_item - *in* <EPTF_RBT_ItemIdx> - the item index
//
//  Return Value:
//    *float* - the key of the item
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_getKeyOfFloatItem(
  in EPTF_RBT_TreeId pl_tree,
  in EPTF_RBT_ItemIdx pl_item)
return float;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_getKeyOfCharstringItem
// 
//  Purpose:
//    Returns the key of an item of the tree with charstring key type
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//    pl_item - *in* <EPTF_RBT_ItemIdx> - the item index
//
//  Return Value:
//    *charstring* - the key of the item
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_getKeyOfCharstringItem(
  in EPTF_RBT_TreeId pl_tree,
  in EPTF_RBT_ItemIdx pl_item)
return charstring;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_findFirstItemByIntKey
// 
//  Purpose:
//    Returns the first item with the given integer key
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//    pl_key - *in* *integer* - the key
//
//  Return Value:
//    <EPTF_RBT_ItemIdx> - the index of the item, or -1 if not found
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_findFirstItemByIntKey(
  in EPTF_RBT_TreeId pl_tree,
  in integer pl_key)
return EPTF_RBT_ItemIdx;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_findFirstItemByFloatKey
// 
//  Purpose:
//    Returns the first item with the given float key
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//    pl_key - *in* *float* - the key
//
//  Return Value:
//    <EPTF_RBT_ItemIdx> - the index of the item, or -1 if not found
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_findFirstItemByFloatKey(
  in EPTF_RBT_TreeId pl_tree,
  in float pl_key)
return EPTF_RBT_ItemIdx;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_findFirstItemByCharstringKey
// 
//  Purpose:
//    Returns the first item with the given charstring key
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//    pl_key - *in* *charstring* - the key
//
//  Return Value:
//    <EPTF_RBT_ItemIdx> - the index of the item, or -1 if not found
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_findFirstItemByCharstringKey(
  in EPTF_RBT_TreeId pl_tree,
  in charstring pl_key)
return EPTF_RBT_ItemIdx;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_getRoot
// 
//  Purpose:
//    Returns the root node of the tree
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//
//  Return Value:
//    <EPTF_RBT_ItemIdx> - the root node, or -1 if empty tree
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_getRoot(
  in EPTF_RBT_TreeId pl_tree)
return EPTF_RBT_ItemIdx;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_getLeft
// 
//  Purpose:
//    Returns the left child of a node
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//    pl_item - *in* <EPTF_RBT_ItemIdx> - the starting item index
//
//  Return Value:
//    <EPTF_RBT_ItemIdx> - the left child node, or -1 if none (no child or chain item)
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_getLeft(
  in EPTF_RBT_TreeId pl_tree,
  in EPTF_RBT_ItemIdx pl_item)
return EPTF_RBT_ItemIdx;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_getRight
// 
//  Purpose:
//    Returns the right child of a node
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//    pl_item - *in* <EPTF_RBT_ItemIdx> - the starting item index
//
//  Return Value:
//    <EPTF_RBT_ItemIdx> - the right child node, or -1 if none (no child or chain item)
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_getRight(
  in EPTF_RBT_TreeId pl_tree,
  in EPTF_RBT_ItemIdx pl_item)
return EPTF_RBT_ItemIdx;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_getParent
// 
//  Purpose:
//    Returns the parent of a node
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//    pl_item - *in* <EPTF_RBT_ItemIdx> - the item index
//
//  Return Value:
//    <EPTF_RBT_ItemIdx> - the parent node, or -1 if no parent (i.e. root node or chain item)
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_getParent(
  in EPTF_RBT_TreeId pl_tree,
  in EPTF_RBT_ItemIdx pl_item)
return EPTF_RBT_ItemIdx;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_getNextInChain
// 
//  Purpose:
//    Returns the next item in the chain
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//    pl_item - *in* <EPTF_RBT_ItemIdx> - the starting item index
//
//  Return Value:
//    <EPTF_RBT_ItemIdx> - the next item in chain, or -1 if end of chain
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_getNextInChain(
  in EPTF_RBT_TreeId pl_tree,
  in EPTF_RBT_ItemIdx pl_item)
return EPTF_RBT_ItemIdx; // -1 if no more items (end of chain)

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_getPrevInChain
// 
//  Purpose:
//    Returns the previous item in the chain
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//    pl_item - *in* <EPTF_RBT_ItemIdx> - the starting item index
//
//  Return Value:
//    <EPTF_RBT_ItemIdx> - the previous item in chain, or -1 if pl_item is the node itself
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_getPrevInChain(
  in EPTF_RBT_TreeId pl_tree,
  in EPTF_RBT_ItemIdx pl_item)
return EPTF_RBT_ItemIdx;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_iterateIncremental
// 
//  Purpose:
//    Returns either the next element in chain or (if none) the first element with the next bigger key
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//    pl_item - *in* <EPTF_RBT_ItemIdx> - the starting item index
//
//  Return Value:
//    <EPTF_RBT_ItemIdx> - the next item
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_iterateIncremental(
  in EPTF_RBT_TreeId pl_tree,
  in EPTF_RBT_ItemIdx pl_item)
return EPTF_RBT_ItemIdx;

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_iterateDecremental
// 
//  Purpose:
//    Returns either the previous element in chain or (if none) the first element with the next smaller key
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//    pl_item - *in* <EPTF_RBT_ItemIdx> - the starting item index
//
//  Return Value:
//    <EPTF_RBT_ItemIdx> - the previous item
///////////////////////////////////////////////////////////
// TODO: implement
/*public external function f_EPTF_RBT_iterateDecremental(
  in EPTF_RBT_TreeId pl_tree,
  in EPTF_RBT_ItemIdx pl_item)
return EPTF_RBT_ItemIdx;*/

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_sortIncremental
// 
//  Purpose:
//    Returns the index list of the items in the tree in ascending order
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//    pl_itemsSorted - *out* <EPTF_RBT_ItemIdxList> - index list of the sorted items
//
//  Return Value:
//    -
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_sortIncremental(
  in EPTF_RBT_TreeId pl_tree,
  out EPTF_RBT_ItemIdxList pl_itemsSorted);

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_sortDecremental
// 
//  Purpose:
//    Returns the index list of the items in the tree in descending order
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//    pl_itemsSorted - *out* <EPTF_RBT_ItemIdxList> - index list of the sorted items
//
//  Return Value:
//    -
///////////////////////////////////////////////////////////
// TODO: implement
/*public external function f_EPTF_RBT_sortDecremental(
  in EPTF_RBT_TreeId pl_tree,
  out EPTF_RBT_ItemIdxList pl_itemsSorted);*/

///////////////////////////////////////////////////////////
//  Function: f_EPTF_RBT_isItemValid
// 
//  Purpose:
//    Returns true if item is valid: not free and not invalid
//
//  Parameters:
//    pl_tree - *in* <EPTF_RBT_TreeId> - the tree ID
//    pl_item - *in* <EPTF_RBT_ItemIdx> - the starting item index
//
//  Return Value:
//    *boolean* - true if item is valid
///////////////////////////////////////////////////////////
public external function f_EPTF_RBT_isItemValid(
  in EPTF_RBT_TreeId pl_tree,
  in EPTF_RBT_ItemIdx pl_item)
return boolean;

group RBT_Test {

friend module EPTF_RBT_Test;
friend external function f_EPTF_RBT_isTreeValid(in EPTF_RBT_TreeId pl_tree) return boolean;
friend external function f_EPTF_RBT_cloneTree(in EPTF_RBT_TreeId pl_src, in EPTF_RBT_TreeId pl_dst);// both must be existing trees (key type does not matter)
friend external function f_EPTF_RBT_createAndInitTree(in charstring pl_name, in EPTF_RBT_TreeInitNode pl_rootNode) return EPTF_RBT_TreeId; // returns -1 if invalid
friend external function f_EPTF_RBT_getItemType(in EPTF_RBT_TreeId pl_tree, in EPTF_RBT_ItemIdx pl_item) return EPTF_RBT_ItemType;

} // group RBT_Test

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

group EPTF_RBT_PrivateFunctions {

  private function f_EPTF_RBT_cleanup_CT()
  runs on EPTF_RBT_CT
  {
    if(not v_EPTF_RBT_initialized) { return }
    f_EPTF_RBT_cleanup();
    v_EPTF_RBT_initialized := false;
  }

  private external function f_EPTF_RBT_init();
  private external function f_EPTF_RBT_cleanup();

} // group EPTF_RBT_PrivateFunctions

} // module EPTF_CLL_RBT_Functions
