///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// 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_RNA_Definitions
//
// Purpose:
//   This module contains the types of Random N Array
//
// Module Parameters:
//     tsp_debug_RNA - boolean := false; 
//              set it to true for debugging
//
//
//  Module depends on:
//    <EPTF_CLL_Common_Definitions>
//
// Current Owner:
//   Bence Molnar (EBENMOL)
//
// Last Review Date:
//   2009-02-20
//
///////////////////////////////////////////////////////////

module EPTF_CLL_RNA_Definitions {

import from EPTF_CLL_Common_Definitions all;

modulepar {
  boolean tsp_debug_RNA := false;
}


///////////////////////////////////////////////////////////
// Type: EPTF_RNA_idxMapPtr
//
// Purpose:
//   Data structure of Random N array
//
// Elements:
//   listCoord - *integer* - the list where the index stored
//   sizeCoord  - *integer* - the Nr of the element in the list
//
///////////////////////////////////////////////////////////
type record EPTF_RNA_idxMapPtr {
  integer listCoord,
  integer sizeCoord
}

type record of EPTF_RNA_idxMapPtr EPTF_RNA_idxMap;

///////////////////////////////////////////////////////////
// Type: EPTF_RNA_RandomNArray
//
// Purpose:
//   Data structure of Random N array
//
// Elements:
//   numOfLists - *integer* - number of list in RNA
//   slotSize  - <EPTF_IntegerList> - size of each list
//   slotList - <EPTF_IntegerArray2D> - slots storing element indices in the lists
//   idxMap  - <EPTF_RNA_idxMap> - indices to the slots in the 2D list
//
///////////////////////////////////////////////////////////

type record EPTF_RNA_RandomNArray {
  integer numOfLists,
  EPTF_IntegerList slotSize,  
  EPTF_IntegerArray2D slotList,
  EPTF_RNA_idxMap idxMap
}

///////////////////////////////////////////////////////////
// Constant: c_EPTF_RNA_emptyRandomNArray
//
// Purpose:
//   Empty Random N Array structure
///////////////////////////////////////////////////////////

const EPTF_RNA_RandomNArray c_EPTF_RNA_emptyRandomNArray := {
  numOfLists := 0,
  slotSize := {},
  slotList := {},
  idxMap := {}
}

///////////////////////////////////////////////////////////
// Constant: c_EPTF_RNA_freeIndex, c_EPTF_RNA_busyIndex 
//
// Purpose:
//   constants for the index of free list and busy list
///////////////////////////////////////////////////////////

const integer c_EPTF_RNA_freeIndex := 0
const integer c_EPTF_RNA_busyIndex := 1

} //module
