///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Copyright (c) 2000-2017 Ericsson Telecom AB                               //
//                                                                           //
// All rights reserved. This program and the accompanying materials          //
// are made available under the terms of the Eclipse Public License v1.0     //
// which accompanies this distribution, and is available at                  //
// http://www.eclipse.org/legal/epl-v10.html                                 //
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////  Detailed Comments:
//    Int2Int HashMap is a representation of the HashMap for integer keys and integer data.
//    Supported hashmap type in this module(key/data): integer -> integer
//    Most of the functions if the int2int HashMap are implemented as external functions.
//
//    Public functions:
//      <f_EPTF_int2int_HashMap_DumpByID> - Dump the content of a hash table by ID.
//      <f_EPTF_int2int_HashMap_Dump> - Dump the content of a hash table.
//      <f_EPTF_int2int_HashMap_DumpAll> - Dump the content of every hash table.
//      <f_EPTF_int2int_HashMap_New> - Creates a new hashmap.
//      <f_EPTF_int2int_HashMap_GetID> - To get the ID of the hashmap from the name.
//      <f_EPTF_int2int_HashMap_Delete> - Deletes the hashmap.
//      <f_EPTF_int2int_HashMap_DeleteById> - Deletes the hashmap by ID.
//      <f_EPTF_int2int_HashMap_Assign> - Assignment of one hashmap to another.
//      <f_EPTF_int2int_HashMap_Insert> - Inserts an element to hashmap.
//      <f_EPTF_int2int_HashMap_Update> - Updates an element in hashmap.
//      <f_EPTF_int2int_HashMap_Find> - Finds an element in hashmap.
//      <f_EPTF_int2int_HashMap_Erase> - Erases an element from hashmap.
//      <f_EPTF_int2int_HashMap_Clear> - Clear all elements from hashmap.
//      <f_EPTF_int2int_HashMap_Size> - Returns the size of hashmap. Size = the used buckets
//      <f_EPTF_int2int_HashMap_MaxSize> - Returns the maximum size of hashmap(largest possible size).
//      <f_EPTF_int2int_HashMap_CallHashFunc> - Calls the hash function of a given hashmap.
//      <f_EPTF_int2int_HashMap_Empty> - Check whether the hashmap is empty. true if the hash_map's size is 
//      <f_EPTF_int2int_HashMap_BucketCount> - Returns the number of buckets used by the hash_map.
//      <f_EPTF_int2int_HashMap_Begin> - To get the first element of hashmap. 
//      <f_EPTF_int2int_HashMap_Next> - To get the next element of hashmap.
//
//   Deprecated functions:
//      <f_EPTF_int2int_HashMap_Init> - Initializes the hash table. DEPRECATED!!! Use <f_EPTF_HashMap_init_CT> instead!
//      <f_EPTF_int2int_HashMap_Cleanup> - Deletes all hashmaps. KEPT FOR BACKWARD COMPATIBILITY. DO NOT USE IT!
//      <f_EPTF_int2int_HashMap_Resize> - Increases the bucket count to at least pl_hashsize. KEPT FOR BACKWARD COMPATIBILITY. DO NOT USE IT!
//
/////////////////////////////////////////////////////////////
module EPTF_CLL_HashMapInt2Int_Functions {

import from EPTF_CLL_HashMap_Definitions all;
import from EPTF_CLL_HashMap_Functions all;
import from EPTF_CLL_Common_Functions all;
import from EPTF_CLL_Base_Functions all;

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_DumpByID
// 
// Purpose:
//   External function call to dump the content of a specific hashmap.
// 
// Parameters:
//   pl_id - *in* *integer* - the id of the hashmap
// 
// Return Value:
//   -
//
//  Errors:
//   If HashMap ID (pl_id) is not valid.
///////////////////////////////////////////////////////////
public external function f_EPTF_int2int_HashMap_DumpByID (
  in integer pl_id );

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_Dump
// 
// Purpose:
//   External function call to dump the content of a specific hashmap.
// 
// Parameters:
//   pl_name - *in* *charstring* - the name of the hashmap
// 
// Return Value:
//   -
//
//  Errors:
//   -
///////////////////////////////////////////////////////////
public external function f_EPTF_int2int_HashMap_Dump (
  in charstring pl_name );

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_DumpAll
// 
// Purpose:
//   External function call to dump the content of all existing hashmap.
// 
// Parameters:
//   -
// 
// Return Value:
//   -
//
//  Errors:
//   -
///////////////////////////////////////////////////////////
public external function f_EPTF_int2int_HashMap_DumpAll ();

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_Init
// 
// Purpose:
//   Function call to initialize the hash table.
//   This function is DEPRECATED! Will be removed after this release!
// 
// Parameters:
//   -
// Return Value:
//   -
//
//  Errors:
//   -
///////////////////////////////////////////////////////////
public function f_EPTF_int2int_HashMap_Init (in charstring pl_selfName := "") runs on EPTF_HashMap_CT {
  if (pl_selfName == "" and not f_EPTF_Base_cleanupIsInProgress()) {
    f_EPTF_Common_error(%definitionId&": Error: f_EPTF_Base_init_CT should be called before this function or use f_EPTF_HashMap_init_CT");
    f_EPTF_Base_stopAll(none);
  }
  f_EPTF_HashMap_init_CT(pl_selfName);
}

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_Cleanup
// 
// Purpose:
//   External function for deleting ALL hashmaps.
//   DEPRECATED! Do not use it!
// 
// Parameters:
//   -
// Return Value:
//   -
//
//  Errors:
//   -
///////////////////////////////////////////////////////////

public function f_EPTF_int2int_HashMap_Cleanup(){
//do not need to do anything
};

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_New
// 
// Purpose:
//   External function call to create a new hashmap.
// 
// Parameters:
//   pl_name - *in* *charstring* - the name of the hashmap
// 
// Return Value:
//   integer - the ID of the hashmap
//
//  Errors:
//   -
///////////////////////////////////////////////////////////
public external function f_EPTF_int2int_HashMap_New (
  in charstring pl_name ) return integer;

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_GetID
// 
// Purpose:
//   External function call to get the ID of the hashmap from the name.
// 
// Parameters:
//   pl_name - *in* *charstring* - the name of the hashmap
//   pl_id - *out* *integer* - the ID of the hashmap
// 
// Return Value:
//   boolean - true if ID found
//
//  Errors:
//   -
///////////////////////////////////////////////////////////
public external function f_EPTF_int2int_HashMap_GetID (
  in charstring pl_name,
  out integer pl_id) return boolean;

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_Delete
// 
// Purpose:
//   External function call to delete the hashmap.
// 
// Parameters:
//   pl_name - *in* *charstring* - the name of the hashmap
// 
// Return Value:
//   -
//
//  Errors:
//   -
///////////////////////////////////////////////////////////
public external function f_EPTF_int2int_HashMap_Delete (
  in charstring pl_name );

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_DeleteById
// 
// Purpose:
//   External function call to delete the hashmap by Id.
// 
// Parameters:
//   pl_id - *in* *integer* - the id of the hashmap returned by
//      <f_EPTF_int2int_HashMap_New>, or <f_EPTF_int2int_HashMap_GetID>
// 
// Return Value:
//   -
//
//  Errors:
//   -
///////////////////////////////////////////////////////////
public external function f_EPTF_int2int_HashMap_DeleteById (
  in integer pl_id );

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_Assign
// 
// Purpose:
//   External function call for assignment of one hashmap to another.
//   pl_id1 := pl_id2. 
// 
// Parameters:
//   pl_id1 - *in* *integer* - the ID of the hashmap1
//   pl_id2 - *in* *integer* - the ID of the hashmap2
// 
// Return Value:
//   -
//
//  Errors:
//   If HashMap ID (pl_id) is not valid.
///////////////////////////////////////////////////////////
public external function f_EPTF_int2int_HashMap_Assign (
  in integer pl_id1,
  in integer pl_id2 );

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_Insert
// 
// Purpose:
//   External function call to insert an element to hashmap.
// 
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap
//   pl_key - *in* *integer* - the key of the hashmap
//   pl_data - *in* *integer* - the data to be inserted
// 
// Return Value:
//   -
//
//  Errors:
//   If HashMap ID (pl_id) is not valid.
///////////////////////////////////////////////////////////
public external function f_EPTF_int2int_HashMap_Insert (
  in integer pl_id,
  in integer pl_key,
  in integer pl_data );

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_Update
// 
// Purpose:
//   External function call for Updating an element in HashMap. Checks whether the key is exists.
//   If the key not exists insert the <key,data> pair. If exists updates the data to
//   the new value.
// 
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap
//   pl_key - *in* *integer* - the key of the hashmap
//   pl_data - *in* *integer* - the data to be inserted
// 
// Return Value:
//   -
//
//  Errors:
//   If HashMap ID (pl_id) is not valid.
///////////////////////////////////////////////////////////
public external function f_EPTF_int2int_HashMap_Update (
  in integer pl_id,
  in integer pl_key,
  in integer pl_data );

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_Find
// 
// Purpose:
//   External function call to find an element in hashmap.
// 
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap
//   pl_key - *in* *integer* - the key of the hashmap
//   pl_data - *out* *integer* - the searched data
// 
// Return Value:
//   boolean - if we found the data
//
//  Errors:
//   If HashMap ID (pl_id) is not valid.
///////////////////////////////////////////////////////////
public external function f_EPTF_int2int_HashMap_Find (
  in integer pl_id,
  in integer pl_key,
  out integer pl_data ) return boolean;

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_Erase
// 
// Purpose:
//   External function call to erase an element from hashmap.
// 
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap
//   pl_key - *in* *integer* - the key of the hashmap
// 
// Return Value:
//   -
//
//  Errors:
//   If HashMap ID (pl_id) is not valid.
////////////////////////////////////////////////////////
public external function f_EPTF_int2int_HashMap_Erase (
  in integer pl_id,
  in integer pl_key );

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_Clear
// 
// Purpose:
//   External function call to clear all elements from hashmap.
// 
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap
// 
// Return Value:
//   -
//
//  Errors:
//   If HashMap ID (pl_id) is not valid.
/////////////////////////////////////////////////////////
public external function f_EPTF_int2int_HashMap_Clear (
  in integer pl_id );

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_Size
// 
// Purpose:
//   External function call to return the size of hashmap. 
//   Size = the used buckets.
// 
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap
// 
// Return Value:
//   integer - the size of hashmap
//
//  Errors:
//   If HashMap ID (pl_id) is not valid.
//////////////////////////////////////////////////////////
public external function f_EPTF_int2int_HashMap_Size (
  in integer pl_id ) return integer;

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_MaxSize
// 
// Purpose:
//   External function call to return the maximum size of hashmap. 
// 
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap
// 
// Return Value:
//   float - the maximum size of hashmap
//
//  Errors:
//   If HashMap ID (pl_id) is not valid.
//////////////////////////////////////////////////////////
public external function f_EPTF_int2int_HashMap_MaxSize (
  in integer pl_id ) return float;

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_CallHashFunc
// 
// Purpose:
//   External function call to call the hash function of a given hashmap. 
// 
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap, which hashfunction we use
//   pl_key - *in* *integer* - the key of the hashmap
// 
// Return Value:
//   integer - the hashvalue of key
//
//  Errors:
//   If HashMap ID (pl_id) is not valid.
//////////////////////////////////////////////////////////
public external function f_EPTF_int2int_HashMap_CallHashFunc (
  in integer pl_id,
  in integer pl_key ) return integer;

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_Empty
// 
// Purpose:
//   External function call to check whether the hashmap is empty. 
//   true if the hash_map's size is 0.
// 
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap
// 
// Return Value:
//   boolean - true if the hash_map's size is 0.
//
//  Errors:
//   If HashMap ID (pl_id) is not valid.
//////////////////////////////////////////////////////////
public external function f_EPTF_int2int_HashMap_Empty (
  in integer pl_id ) return boolean;

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_Resize
// 
// Purpose:
//   External function call to increase the bucket count to at least pl_hashsize.
// 
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap
//   pl_hashsize - *in* *integer* - the new bucketsize 
// 
// Return Value:
//   -
//
//  Errors:
//   If HashMap ID (pl_id) is not valid.
/////////////////////////////////////////////////////////
public external function f_EPTF_int2int_HashMap_Resize (
  in integer pl_id,
  in integer pl_hashsize );

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_BucketCount
// 
// Purpose:
//   External function call to return the number of buckets used by the hash_map. 
//   This is the booked size.
//   It contains empty buckets also.
// 
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap 
// 
// Return Value:
//   integer - the bucketsize
//
//  Errors:
//   If HashMap ID (pl_id) is not valid.
//////////////////////////////////////////////////////////
public external function f_EPTF_int2int_HashMap_BucketCount (
  in integer pl_id ) return integer;

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_Begin
// 
// Purpose:
//   External function call to get the first element of hashmap. 
//   In TTCN we can't use iterators, so we get back the first key element.
// 
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap
//   pl_key - *out* *integer* - the first key in hashmap
// 
// Return Value:
//   boolean - false if the hashmap is empty
//
//  Errors:
//   If HashMap ID (pl_id) is not valid.
//////////////////////////////////////////////////////////
public external function f_EPTF_int2int_HashMap_Begin (
  in integer pl_id,
  out integer pl_key) return boolean;

///////////////////////////////////////////////////////////
// Function: f_EPTF_int2int_HashMap_Next
// 
// Purpose:
//   External function call to get the next element of hashmap. 
//   In TTCN we can't use iterators, so we get back a key element's next key element.
// 
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap
//   pl_iter - *inout* *integer* - in = the iterator of the hashmap (iterator = key)
//                                    out = the next key in hashmap
// 
// Return Value:
//   boolean - false if no next key in hashmap
//
//  Errors:
//   If HashMap ID (pl_id) is not valid.
//////////////////////////////////////////////////////////
public external function f_EPTF_int2int_HashMap_Next (
  in integer pl_id,
  inout integer pl_iter) return boolean;

} // end of module EPTF_CLL_HashMapInt2Int_Functions
