///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// 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                                 //
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////  Purpose:
//    Provide implementation of external c++ functions of oct2int HashMaps.
//
///////////////////////////////////////////////////////////////

//#include "EPTF_CLL_HashMap_Functions.hh"
#include "EPTF_CLL_HashMap_ExternalFunctions.hh"

#ifdef EPTF_DEBUG
#define HASHMAP_OCT2INT_DEBUG_MEMLEAK // enable memleak debug
#endif

#ifdef HASHMAP_OCT2INT_DEBUG_MEMLEAK
#include "EPTF_CLL_Common_Definitions.hh"
#endif


//EPTF__CLL__HashMap__Functions
namespace EPTF__CLL__HashMapOct2Int__Functions {
using namespace EPTF__CLL__HashMap__Functions;


struct EPTF_HashMap_hash
{
size_t
      operator()(const OCTETSTRING& cs) const
  {
    unsigned long __h = 0;
    const unsigned char* __s=cs;
    const unsigned char* end = __s + cs.lengthof();
    for ( ; __s<end; ++__s)
      __h = 5 * __h + *__s;
    return size_t(__h);
  }
};

///////////////////////////////////////////////////////////
// Type: Oct2IntHashMapType
//
// Purpose:
//   Type of hashmap. octetstring -> int
//
// Elements:
//   key - key of hashmap
//   data - data of hashmap
//   hashfcn - hashfunction of hashmap, built in, can be changed
//   equalkey -  equality function of hashmap, EPTF__oct2int__HashMap__Eqint
//
///////////////////////////////////////////////////////////

typedef HashMapTypeCT<OCTETSTRING, EPTF_HashMap_hash, EPTF_HashMap_EqDef<OCTETSTRING> > Oct2IntHashMapType;

///////////////////////////////////////////////////////////
// Type: Oct2IntHashMapTypePtr
//
// Purpose:
//   Pointer to hashmap.
//
///////////////////////////////////////////////////////////

typedef Oct2IntHashMapType* Oct2IntHashMapTypePtr;

///////////////////////////////////////////////////////////
// Variable: v_Oct2IntHashMap
//
// Purpose:
//   Octetstring->Integer type HashMap variable
//
///////////////////////////////////////////////////////////

Oct2IntHashMapTypePtr v_Oct2IntHashMap = NULL;

///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_HashMap_Cleanup
//
// Purpose:
//   External function for deleting ALL hashmaps.
//
// Parameters:
//   -
// Return Value:
//   -
//
//  Errors:
//   -
///////////////////////////////////////////////////////////

void f_EPTF_oct2int_HashMap_Cleanup()
{
  delete v_Oct2IntHashMap;
  v_Oct2IntHashMap = NULL;
}

///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_HashMap_Init
//
// Purpose:
//   Initializes the hashmap.
//   This function is DEPRECATED! Will be removed after this release!
//
// Parameters:
//   -
// Return Value:
//   -
///////////////////////////////////////////////////////////

void f_EPTF_oct2int_HashMap_Init()
{
  if (NULL != v_Oct2IntHashMap) {
    f_EPTF_oct2int_HashMap_Cleanup();
  }
  v_Oct2IntHashMap = new Oct2IntHashMapType;
}

///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_HashMap_New
//
// Purpose:
//   Creates a new hashmap.
//
// Parameters:
//   pl_name - *in* *charstring* - the name of the hashmap
//
// Return Value:
//   integer - the ID of the hashmap
///////////////////////////////////////////////////////////

INTEGER f__EPTF__oct2int__HashMap__New (
  const CHARSTRING& pl_name)
{
  if ( v_Oct2IntHashMap )
  {
    return v_Oct2IntHashMap->newHashmap(pl_name);
  }
  return -1;
}

///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_HashMap_GetID
//
// Purpose:
//   To get the ID of the hashmap from the name.
//
// Parameters:
//   pl_name - *in* *charstring* - the name of the hashmap
//   pl_id - *inout* *integer* - the ID of the hashmap
//
// Return Value:
//   boolean - true if ID found
///////////////////////////////////////////////////////////

BOOLEAN f__EPTF__oct2int__HashMap__GetID (
  const CHARSTRING& pl_name,
  INTEGER& pl_id)
{
	  if ( v_Oct2IntHashMap )
	  {
	    return v_Oct2IntHashMap->getID(pl_name, pl_id);
	  }
return false;
}

///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_HashMap_Delete
//
// Purpose:
//   Deletes the hashmap.
//
// Parameters:
//   pl_name - *in* *charstring* - the name of the hashmap
//
// Return Value:
//   -
///////////////////////////////////////////////////////////

void f__EPTF__oct2int__HashMap__Delete (
  const CHARSTRING& pl_name)
{
	  if ( v_Oct2IntHashMap )
	  {
	    v_Oct2IntHashMap->deleteHashMap(pl_name);
	  }
}

///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_HashMap_DeleteById
//
// Purpose:
//   Deletes the hashmap.
//
// Parameters:
//   pl_id - *in* *integer* - the id of the hashmap
//
// Return Value:
//   -
///////////////////////////////////////////////////////////

void f__EPTF__oct2int__HashMap__DeleteById (
  const INTEGER& pl_id)
{
	  if ( v_Oct2IntHashMap )
	  {
	    v_Oct2IntHashMap->deleteHashMap(pl_id);
	  }
}

///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_HashMap_DumpByID
//
// Purpose:
//   Dump the content of a specific hashmap by ID.
//
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap
//
// Return Value:
//   -
///////////////////////////////////////////////////////////

void f__EPTF__oct2int__HashMap__DumpByID (
  const INTEGER& pl_id)
{
	  if ( v_Oct2IntHashMap )
	  {
	    v_Oct2IntHashMap->dumpByID(pl_id);
	  }
}

///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_HashMap_Dump
//
// Purpose:
//   Dump the content of a specific hashmap by name.
//
// Parameters:
//   pl_name - *in* *charstring* - the name of the hashmap
//
// Return Value:
//   -
///////////////////////////////////////////////////////////

void f__EPTF__oct2int__HashMap__Dump (
  const CHARSTRING& pl_name)
{
	  if ( v_Oct2IntHashMap )
	  {
	    v_Oct2IntHashMap->dump(pl_name);
	  }
}

///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_HashMap_DumpAll
//
// Purpose:
//   Dump the content of all hashmaps.
//
// Parameters:
//   -
//
// Return Value:
//   -
///////////////////////////////////////////////////////////

void f__EPTF__oct2int__HashMap__DumpAll ()
{
	  if ( v_Oct2IntHashMap )
	  {
	    v_Oct2IntHashMap->dumpAll();
	  }
}

///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_HashMap_Assign
//
// Purpose:
//   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:
//   -
///////////////////////////////////////////////////////////

void f__EPTF__oct2int__HashMap__Assign (
  const INTEGER& pl_id1,
  const INTEGER& pl_id2)
{
	  if ( v_Oct2IntHashMap )
	  {
	    v_Oct2IntHashMap->assign(pl_id1, pl_id2);
	  }
}



///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_HashMap_Insert
//
// Purpose:
//   Inserts an element to hashmap.
//   In C++ STL:
//               std::pair<iterator, bool>
//               insert(const value_type& x)
//
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap
//   pl_key - *in* *octetstring* - the key of the hashmap
//   pl_data - *in* *integer* - the data to be inserted
//
// Return Value:
//   -
///////////////////////////////////////////////////////////

void f__EPTF__oct2int__HashMap__Insert (
  const INTEGER& pl_id,
  const OCTETSTRING& pl_key,
  const INTEGER& pl_data )
{
	  if ( v_Oct2IntHashMap )
	  {
	    v_Oct2IntHashMap->insert<OCTETSTRING>(pl_id, pl_key, pl_data);
	  }
};

///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_HashMap_Update
//
// Purpose:
//   Updates an element in hashmap.
//
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap
//   pl_key - *in* *octetstring* - the key of the hashmap
//   pl_data - *in* *integer* - the data to be inserted
//
// Return Value:
//   -
///////////////////////////////////////////////////////////

void f__EPTF__oct2int__HashMap__Update (
  const INTEGER& pl_id,
  const OCTETSTRING& pl_key,
  const INTEGER& pl_data )
{
	  if ( v_Oct2IntHashMap )
	  {
	    v_Oct2IntHashMap->update<OCTETSTRING>(pl_id, pl_key, pl_data);
	  }
};

///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_HashMap_Find
//
// Purpose:
//   Finds an element in hashmap.
//   In C++ STL:
//               iterator find(const key_type& k)
//
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap
//   pl_key - *in* *octetstring* - the key of the hashmap
//   pl_data - *out* *integer* - the searched data
//
// Return Value:
//   boolean - if we found the data
///////////////////////////////////////////////////////////

BOOLEAN f__EPTF__oct2int__HashMap__Find (
  const INTEGER& pl_id,
  const OCTETSTRING& pl_key,
  INTEGER& pl_data )
{
	  if ( v_Oct2IntHashMap )
	  {
	    return v_Oct2IntHashMap->find<OCTETSTRING>(pl_id, pl_key, pl_data);
	  }
	  return false;
}

///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_HashMap_Erase
//
// Purpose:
//   Erases an element from hashmap.
//   In C++ STL:
//               size_type erase(const key_type& k)
//
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap
//   pl_key - *in* *octetstring* - the key of the hashmap
//
// Return Value:
//   -
/////////////////////////////////////////////////////////

void f__EPTF__oct2int__HashMap__Erase (
  const INTEGER& pl_id,
  const OCTETSTRING& pl_key )
{
	  if ( v_Oct2IntHashMap )
	  {
	    v_Oct2IntHashMap->erase<OCTETSTRING>(pl_id,pl_key);
	  }
}

///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_HashMap_Clear
//
// Purpose:
//   Clear all elements from hashmap.
//   In C++ STL:
//               void clear()
//
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap
//
// Return Value:
//   -
/////////////////////////////////////////////////////////

void f__EPTF__oct2int__HashMap__Clear (
  const INTEGER& pl_id )
{
	  if ( v_Oct2IntHashMap )
	  {
	    v_Oct2IntHashMap->clear(pl_id);
	  }
}

///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_HashMap_Size
//
// Purpose:
//   Returns the size of hashmap. Size = the used buckets.
//   In C++ STL:
//               size_type size() const
//
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap
//
// Return Value:
//   integer - the size of hashmap
//////////////////////////////////////////////////////////

INTEGER f__EPTF__oct2int__HashMap__Size (
 const INTEGER& pl_id )
{
	  if ( v_Oct2IntHashMap )
	  {
	    return v_Oct2IntHashMap->size(pl_id);
	  }
	  return 0;
}

///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_HashMap_MaxSize
//
// Purpose:
//   Returns the maximum size of hashmap.
//   In C++ STL:
//               size_type max_size() const
//
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap
//
// Return Value:
//   float - the maximum size of hashmap
//////////////////////////////////////////////////////////

FLOAT f__EPTF__oct2int__HashMap__MaxSize (
 const INTEGER& pl_id )
{
	  if ( v_Oct2IntHashMap )
	  {
	    return v_Oct2IntHashMap->maxSize(pl_id);
	  }
	  return -1;
}

///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_HashMap_CallHashFunc
//
// Purpose:
//   Calls the hash function of a given hashmap.
//
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap, which hashfunction we use
//   pl_key - *in* *octetstring* - the key of the hashmap
//
// Return Value:
//   integer - the hashvalue of key
//////////////////////////////////////////////////////////
INTEGER f__EPTF__oct2int__HashMap__CallHashFunc(
  const INTEGER& pl_id,
  const OCTETSTRING& pl_key)
{
	  if ( v_Oct2IntHashMap )
	  {
	    return v_Oct2IntHashMap->callHashFunc<OCTETSTRING>(pl_id, pl_key);
	  }
	  return -1;
}

///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_HashMap_Empty
//
// Purpose:
//   Check whether the hashmap is empty. true if the unordered_map's size is 0.
//   In C++ STL:
//               bool empty() cons
//
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap
//
// Return Value:
//   boolean - true if the unordered_map's size is 0.
//////////////////////////////////////////////////////////

BOOLEAN f__EPTF__oct2int__HashMap__Empty (
  const INTEGER& pl_id )
{
	  if ( v_Oct2IntHashMap )
	  {
	    return v_Oct2IntHashMap->empty(pl_id);
	  }
	  return false;
}

///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_HashMap_Resize
//
// Purpose:
//   Increases the bucket count to at least pl_hashsize.
//   In C++ STL:
//               void resize(size_type n)
//
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap
//   pl_hashsize - *in* *integer* - the new bucketsize
//
// Return Value:
//   -
//////////////////////////////////////////////////////////

void f__EPTF__oct2int__HashMap__Resize (
  const INTEGER& pl_id,
  const INTEGER& pl_hashsize)
{
	  /*if ( v_Oct2IntHashMap )
	  {
	    v_Oct2IntHashMap->resize(pl_id,pl_hashsize);
	  }*/
};

///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_HashMap_BucketCount
//
// Purpose:
//   Returns the number of buckets used by the unordered_map. This is the booked size.
//   It contains empty buckets also.
//   In C++ STL:
//               size_type bucket_count() const
//
// Parameters:
//   pl_id - *in* *integer* - the ID of the hashmap
//
// Return Value:
//   integer - the bucketsize
//////////////////////////////////////////////////////////

INTEGER f__EPTF__oct2int__HashMap__BucketCount (
  const INTEGER& pl_id )
{
	  if ( v_Oct2IntHashMap )
	  {
	    return v_Oct2IntHashMap->bucketCount(pl_id);
	  }
	  return -1;
};

///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_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 - *inout* *octetstring* - the first key in hashmap
//
// Return Value:
//   boolean - false if the hashmap is empty
//////////////////////////////////////////////////////////

BOOLEAN f__EPTF__oct2int__HashMap__Begin(
  const INTEGER& pl_id,
  OCTETSTRING& pl_key)
{
	  if ( v_Oct2IntHashMap )
	  {
	    return v_Oct2IntHashMap->begin<OCTETSTRING>(pl_id, pl_key);
	  }
	  return false;
}

///////////////////////////////////////////////////////////
// Function: f_EPTF_oct2int_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* *octetstring* - in = the iterator of the hashmap (iterator = key)
//                                    out = the next key in hashmap
//
// Return Value:
//   boolean - false if no next key in hashmap
//////////////////////////////////////////////////////////

BOOLEAN f__EPTF__oct2int__HashMap__Next(
  const INTEGER& pl_id,
  OCTETSTRING& pl_iter)
{
	  if ( v_Oct2IntHashMap )
	  {
	    return v_Oct2IntHashMap->next<OCTETSTRING>(pl_id, pl_iter);
	  }
	  return false;
}

}
