// /*----------------------------------------------------------------------*\
// | Concrete Template : Sorting_Machine_Kernel_1
// \*----------------------------------------------------------------------*/
#ifndef CT_SORTING_MACHINE_KERNEL_1
#define CT_SORTING_MACHINE_KERNEL_1 1
///------------------------------------------------------------------------
/// Global Context --------------------------------------------------------
///------------------------------------------------------------------------
#include "AT/Sorting_Machine/Kernel.h"
#include "CT/Queue/Kernel_1a.h"
///---------------------------------------------------------------------
/// Interface ----------------------------------------------------------
///---------------------------------------------------------------------
concrete_template <
concrete_instance class Item,
concrete_instance utility_class Item_Are_In_Order,
/*!
implements
abstract_instance General_Are_In_Order <Item>
!*/
concrete_instance class Queue_Of_Item =
Queue_Kernel_1a <Item>,
concrete_instance class Rep =
Representation <
Boolean,
Queue_Of_Item
>
>
class Sorting_Machine_Kernel_1 :
implements
abstract_instance Sorting_Machine_Kernel <Item, Item_Are_In_Order>,
encapsulates
concrete_instance Rep
{
private:
rep_field_name (Rep, 0, Boolean, inserting_rep);
rep_field_name (Rep, 1, Queue_Of_Item, contents_rep);
/*!
correspondence
self.inserting = self.inserting_rep and
self.contents = multiset_elements (self.contents_rep)
!*/
local_procedure_body Initialize ()
{
self[inserting_rep] = true;
}
public:
standard_concrete_operations (Sorting_Machine_Kernel_1);
procedure_body Insert (
consumes Item& x
)
{
self[contents_rep].Enqueue (x);
}
procedure_body Change_To_Extraction_Phase ()
{
self[inserting_rep] = false;
}
procedure_body Remove_First (
produces Item& x
)
{
object catalyst Queue_Of_Item temp;
self[contents_rep].Dequeue (x);
while (self[contents_rep].Length () > 0)
/*!
alters self.contents_rep, x, temp
maintains
(temp * self.contents_rep * <x>) is permutation of
(#temp * #self.contents_rep * <#x>) and
for all y: Item
where (y is in elements (temp))
(ARE_IN_ORDER (x, y))
decreases
|self.contents_rep|
!*/
{
object catalyst Item y;
self[contents_rep].Dequeue (y);
if (Item_Are_In_Order::Are_In_Order (y, x))
{
x &= y;
}
temp.Enqueue (y);
}
self[contents_rep] &= temp;
}
procedure_body Remove_Any (
produces Item& x
)
{
self[contents_rep].Dequeue (x);
}
function_body Boolean Is_In_Extraction_Phase ()
{
return not (self[inserting_rep]);
}
function_body Integer Size ()
{
return (self[contents_rep].Length ());
}
};
//----------------------------------------------------------------------
#endif // CT_SORTING_MACHINE_KERNEL_1
Last modified: Thu Jan 11 17:05:57 EST 2007