// /*-------------------------------------------------------------------*\
// | Concrete Template : Set_Kernel_2
// \*-------------------------------------------------------------------*/
#ifndef CT_SET_KERNEL_2
#define CT_SET_KERNEL_2 1
///---------------------------------------------------------------------
/// Global Context -----------------------------------------------------
///---------------------------------------------------------------------
#include "AT/Set/Kernel.h"
/*!
#include "AT/General/Is_Equal_To.h"
#include "AT/General/Hash.h"
!*/
#include "CT/Set/Kernel_1.h"
#include "CT/Static_Array/Kernel_1.h"
///---------------------------------------------------------------------
/// Interface ----------------------------------------------------------
///---------------------------------------------------------------------
concrete_template <
concrete_instance class Item,
/*!
implements
abstract_instance General_Is_Equal_To <Item>
!*/
concrete_instance utility_class Item_Hash,
/*!
implements
abstract_instance General_Hash <Item>
!*/
Integer_constant hash_table_size,
/*!
satisfies restriction
hash_table_size > 0
!*/
concrete_instance class Set_Of_Item =
Set_Kernel_1 <Item>,
concrete_instance class Static_Array_Of_Set_Of_Item =
Static_Array_Kernel_1 <
Set_Of_Item,
0,
hash_table_size - 1
>,
concrete_instance class Rep =
Representation <
Static_Array_Of_Set_Of_Item,
Integer
>
>
class Set_Kernel_2 :
implements
abstract_instance Set_Kernel <Item>,
encapsulates
concrete_instance Rep
{
private:
rep_field_name (Rep, 0, Static_Array_Of_Set_Of_Item, hash_table);
rep_field_name (Rep, 1, Integer, size);
/*!
convention
for all i: integer, s: finite set of Item
where ((i,s) is in self.hash_table)
(|s| = |elements (s)| and
for all x: Item
where (x is in elements (s))
(HASH_FUNCTION (x) mod hash_table_size = i)) and
self.size =
sum i: integer, s: finite set of Item
where ((i,s) is in self.hash_table)
(|s|)
correspondence
self =
union i: integer, s: finite set of Item
where ((i,s) is in self.hash_table)
(elements (s))
!*/
public:
standard_concrete_operations (Set_Kernel_2);
procedure_body Add (
consumes Item& x
)
{
object Integer k = Item_Hash::Hash (x) mod hash_table_size;
self[hash_table][k].Add (x);
self[size]++;
}
procedure_body Remove (
preserves Item& x,
produces Item& x_copy
)
{
object Integer k = Item_Hash::Hash (x) mod hash_table_size;
self[hash_table][k].Remove (x, x_copy);
self[size]--;
}
procedure_body Remove_Any (
produces Item& x
)
{
object Integer k;
while (self[hash_table][k].Size () == 0)
/*!
alters k
maintains
for all i: integer where (0 <= i < k)
((i, {}) is in self.hash_table.table)
decreases
hash_table_size - k
!*/
{
k++;
}
self[hash_table][k].Remove_Any (x);
self[size]--;
}
function_body Boolean Is_Member (
preserves Item& x
)
{
object Integer k = Item_Hash::Hash (x) mod hash_table_size;
return self[hash_table][k].Is_Member (x);
}
function_body Integer Size ()
{
return self[size];
}
};
#endif // CT_SET_KERNEL_2
Last modified: Thu Jan 11 17:05:57 EST 2007