blob: 1c2e7d34ead689077be4f65702367ff73395aacc [file] [log] [blame]
///////////////////////////////////////////////////////////////////////////////
// //
// 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_RBtree_Definitions
//
// Purpose:
// This module provides constants and types for TTCN-3 Red-Black tree implementation.
//
// Module depends on:
// <EPTF_CLL_Common_Definitions>
//
// Current Owner:
// Rita Kovacs (ERITKOV)
//
// Last Review Date:
// 2007-12-06
//
// Detailed Comments:
// The event chain is the balanced binary red-black tree itself. The nodes are described within the tree by color (red or black) and
// their place in the tree (left and right children and parent item). All operations on the tree maintain red-black tree properties:
// 1. Every node is colored red or black.
// 2. Every leaf is a NIL node, and is colored black.
// 3. If a node is red, then both its children are black.
// 4. Every simple path from a node to a descendant leaf contains the same number of black nodes.
// This implementation of the red-black tree algorithm includes sentinel nodes as a convenient means of flagging that you have reached
// a leaf node. Tree root is a special sentinel item, 'real' tree root is root.left.
// During insert and delete operations, nodes may be rotated to maintain tree balance.
// Both average and worst-case search time is O(lg n).
//
// The elements of the nodes list in the tree shall be ordered by and indexed via a corresponding floatKeyData list. (That is,
// elements of this record_of structure of nodes has a bijective mapping to/from elements of a corresponding floatKeyData list.)
// Root item of tree is 'cached' at all times in EPTF_Float_RedBlackTree.root value.
// Events of equal key values are stored in a cluster chain within the tree and, considering tree management, they are regarded as
// only one tree node. EPTF_RBTreeNode.fwd is used as a forward chaining pointer index, EPTF_RBTreeNode.bwd is used as a backward chaining
// pointer index for cluster chain items. EPTF_RBTreeNode.isHeadInSameKeysCluster shows if item is head of such a cluster chain.
//
// After removal of an event from the tree, the node's color is set 'invalid' while processing and event is not member of the tree
// nor the free queue.
//
// After processing the event, the node's color is set 'unused' and node is put to the free-nodes chain, a series of bothway
// linked free slots within the record structure of the tree (i.e., a list). Now, EPTF_RBTreeNode.right is used as a forward chaining
// pointer index, EPTF_RBTreeNode.left is used as a backward chaining pointer index for free chain items. EPTF_Float_RedBlackTree.freeHead is the
// first, EPTF_Float_RedBlackTree.freeTail is the last index of chain of free slots. Smallest tree index's 'cache' is valid only if flag
// EPTF_Float_RedBlackTree.isSmallestCacheValid is set true.
//
//
///////////////////////////////////////////////////////////
module EPTF_CLL_RBtree_Definitions {
import from EPTF_CLL_Common_Definitions all;
///////////////////////////////////////////////////////////
// Constant: c_EPTF_emptyRBTNode
//
// Purpose:
// Useful constant to init a EPTF_RBTreeNode at once
//
// References:
// <EPTF_RBTreeNode> := {color := red,left := -1,right := -1,parent := -1,fwd :=-1,bwd:= -1,isHeadInSameKeysCluster := false,isSentinel := false}
///////////////////////////////////////////////////////////
const EPTF_RBTreeNode c_EPTF_emptyRBTNode := {
color := red,
left := -1,
right := -1,
parent := -1,
fwd := -1,
bwd := -1,
isHeadInSameKeysCluster := false,
isSentinel := false,
startOfClusterIdx := -1,
endOfClusterIdx := -1
}
///////////////////////////////////////////////////////////
// Type: EPTF_TreeColor
//
// Purpose:
// enumerated type for tree node coloring
//
// Elements:
// black - is used to denote slots that are linked into the busy chain (that is the tree itself) and black
//
// red - is used to denote slots that are linked into the busy chain and red
//
// invalid - is used to denote slots that are not linked into any chain
//
// unused - is used to denote slots that are linked into the free chain
//
// incluster - is used to denote slots that are linked into the chain 'busy' and belong to a cluster of events of equal key values
//
// Detailed Comments:
// Possible extension of this type in later releases!
//
///////////////////////////////////////////////////////////
type enumerated EPTF_TreeColor { black (0), red(1), invalid(2), unused(3), incluster(4)};
///////////////////////////////////////////////////////////
// Type: EPTF_RBTreeNode
//
// Purpose:
// This is the definition of EPTF_RBTreeNode, which is a record of
// the node's generic attributes
//
// Elements:
// color - <EPTF_TreeColor> - tree node color
//
// left - *integer* - index of the left child of the node, also bwd pointer of free (invalid) queue
//
// right - *integer* - index of the right child of the node, also fwd pointer of free (invalid) queue
//
// parent - *integer* - parent index of tree node (-1 if root)
//
// fwd - *integer* - index pointer to forward in cluster chain
//
// bwd - *integer* - index pointer to backward in cluster chain
//
// isHeadInSameKeysCluster - *boolean* - denotes if node is head of a cluster chain
//
// isSentinel - *boolean* - denotes if node is a leaf node
//
// Detailed Comments:
// NOTE: If (color==invalid) all record fields are out of use.
// If (color==incluster) then left, right and parent are invalid.
// If (color==unused) then color, parent, fwd, bwd and isHeadInSameKeysCluster are invalid.
///////////////////////////////////////////////////////////
type record EPTF_RBTreeNode {
EPTF_TreeColor color,
integer left,
integer right,
integer parent,
integer fwd,
integer bwd,
boolean isHeadInSameKeysCluster,
boolean isSentinel,
integer startOfClusterIdx, // valid only if node is in cluster (isHeadInSameKeysCluster==true or color==incluster)
integer endOfClusterIdx // valid only if node is in cluster
};
///////////////////////////////////////////////////////////
// Type: EPTF_RBTreeNodeList
//
// Purpose:
// A record containing the items of RBTree nodes
//
// Elements:
// record of <EPTF_RBTreeNode>
///////////////////////////////////////////////////////////
type record of EPTF_RBTreeNode EPTF_RBTreeNodeList;
///////////////////////////////////////////////////////////
// Group: FloatRBTreeImpl
//
// Purpose:
// Group for definitons of FloatRBTree-s
//
// Detailed Comments:
///////////////////////////////////////////////////////////
group FloatRBTreeImpl {
///////////////////////////////////////////////////////////
// Type: EPTF_FloatNode
//
// Purpose:
// This is the float-specific attributes' definition of EPTF_RBTreeNode.
//
// Elements:
// key - *integer* - float key value of the node (when)
//
// data - <EPTF_IntegerList> - data items that belong to the node identified by key field
///////////////////////////////////////////////////////////
type record EPTF_FloatNode {
float key,
EPTF_IntegerList data
};
///////////////////////////////////////////////////////////
// Type: EPTF_FloatNodeList
//
// Purpose:
// A record containing the items of nodes with float key field
//
// Elements:
// record of <EPTF_FloatNode>
//
///////////////////////////////////////////////////////////
type record of EPTF_FloatNode EPTF_FloatNodeList;
///////////////////////////////////////////////////////////
// Type: EPTF_Float_RedBlackTree
//
// Purpose:
// Definition of the float red-black tree.
//
// Elements:
// nodes - <EPTF_RBTreeNodeList> - list of items of all chains
//
// floatKeyData - <EPTF_FloatNodeList> - float key and data values of nodes of all chains
//
// nodesCurMaxIndex - *integer* - end index of nodes array
//
// root - *integer* - root item index of tree, -1 if empty tree
//
// freeHead - *integer* - head of free chain
//
// freeTail - *integer* - tail of free chain
//
// smallestKeyIndex - *integer* - index of item of smallest key value
//
// isSmallestCacheValid - *boolean* - true if value of smallestKeyIndex is valid
//
// nOfElements - *integer* - stores how many elements are in the tree currently
//
// acceptableMaxSize - *integer* - max size for debugging memory leak
///////////////////////////////////////////////////////////
type record EPTF_Float_RedBlackTree {
EPTF_RBTreeNodeList nodes,
EPTF_FloatNodeList floatKeyData,
integer nodesCurMaxIndex,
integer root,
integer nil,
integer freeHead,
integer freeTail,
integer smallestKeyIndex,
boolean isSmallestCacheValid,
integer nOfElements,
integer acceptableMaxSize
};
///////////////////////////////////////////////////////////
// Constant: c_EPTF_emptyFloatNode
//
// Purpose:
// Useful constant to init EPTF_FloatNode at once
//
// References:
// <EPTF_FloatNode> := {key := 0.0, data := {}}
///////////////////////////////////////////////////////////
const EPTF_FloatNode c_EPTF_emptyFloatNode := {
key := 0.0,
data := {}
}
///////////////////////////////////////////////////////////
// Constant: c_EPTF_emptyFloatRBTree
//
// Purpose:
// Useful constant to init EPTF_Float_RedBlackTree at once
//
// References:
// <EPTF_Float_RedBlackTree> := {nodes := {},floatKeyData := {}
// ,nodesCurMaxIndex := -1,root := -1,freeHead := -1,
// freeTail := -1,smallestKeyIndex := -1,
// isSmallestCacheValid := false,nOfElements := 0,acceptableMaxSize := -1}
///////////////////////////////////////////////////////////
const EPTF_Float_RedBlackTree c_EPTF_emptyFloatRBTree := {
nodes := {},
floatKeyData := {},
nodesCurMaxIndex := -1,
root := -1,
nil := -1,
freeHead := -1,
freeTail := -1,
smallestKeyIndex := -1,
isSmallestCacheValid := false,
nOfElements := 0,
acceptableMaxSize := -1
}
} //group FloatRBTreeImpl
///////////////////////////////////////////////////////////
// Group: IntegerRBTreeImpl
//
// Purpose:
// Group for definitons of IntegerRBTree-s
//
// Detailed Comments:
///////////////////////////////////////////////////////////
group IntegerRBTreeImpl {
///////////////////////////////////////////////////////////
// Type: EPTF_IntegerNode
//
// Purpose:
// This is the integer-specific attributes' definition of EPTF_RBTreeNode.
//
// Elements:
// key - *integer* - integer key value of the node (when)
//
// data - <EPTF_IntegerList> - data items that belong to the node identified by key field
///////////////////////////////////////////////////////////
type record EPTF_IntegerNode {
integer key,
EPTF_IntegerList data
};
///////////////////////////////////////////////////////////
// Type: EPTF_IntegerNodeList
//
// Purpose:
// A record containing the items of nodes with integer key field
//
// Elements:
// record of <EPTF_IntegerNode>
//
///////////////////////////////////////////////////////////
type record of EPTF_IntegerNode EPTF_IntegerNodeList;
///////////////////////////////////////////////////////////
// Type: EPTF_Integer_RedBlackTree
//
// Purpose:
// Definition of the integer red-black tree.
//
// Elements:
// nodes - <EPTF_RBTreeNodeList> - list of items of all chains
//
// integerKeyData - <EPTF_IntegerNodeList> - integer key and data values of nodes of all chains
//
// nodesCurMaxIndex - *integer* - end index of nodes array
//
// root - *integer* - root item index of tree, -1 if empty tree
//
// freeHead - *integer* - head of free chain
//
// freeTail - *integer* - tail of free chain
//
// smallestKeyIndex - *integer* - index of item of smallest key value
//
// isSmallestCacheValid - *boolean* - true if value of smallestKeyIndex is valid
//
// nOfElements - *integer* - stores how many elements are in the tree currently
//
// acceptableMaxSize - *integer* - max size for debugging memory leak
///////////////////////////////////////////////////////////
type record EPTF_Integer_RedBlackTree {
EPTF_RBTreeNodeList nodes,
EPTF_IntegerNodeList integerKeyData,
integer nodesCurMaxIndex,
integer root,
integer nil,
integer freeHead,
integer freeTail,
integer smallestKeyIndex,
boolean isSmallestCacheValid,
integer nOfElements,
integer acceptableMaxSize
};
///////////////////////////////////////////////////////////
// Constant: c_EPTF_emptyIntegerNode
//
// Purpose:
// Useful constant to init EPTF_IntegerNode at once
//
// References:
// <EPTF_IntegerNode> := {key := 0.0, data := {}}
///////////////////////////////////////////////////////////
const EPTF_IntegerNode c_EPTF_emptyIntegerNode := {
key := 0,
data := {}
}
} //group IntegerRBTreeImpl
}