// /*-------------------------------------------------------------------*\
// | Concrete Template : Array_Kernel_1
// \*-------------------------------------------------------------------*/
#ifndef CT_ARRAY_KERNEL_1
#define CT_ARRAY_KERNEL_1 1
///------------------------------------------------------------------------
/// Global Context --------------------------------------------------------
///------------------------------------------------------------------------
#include "AT/Array/Kernel.h"
///------------------------------------------------------------------------
/// Interface -------------------------------------------------------------
///------------------------------------------------------------------------
concrete_template <
concrete_instance class Item,
concrete_instance class Rep =
Representation <
Item*,
Integer,
Integer
>
>
class Array_Kernel_1 :
implements
abstract_instance Array_Kernel <Item>,
encapsulates
concrete_instance Rep
{
private:
rep_field_name (Rep, 0, Item*, items);
rep_field_name (Rep, 1, Integer, lower_bound);
rep_field_name (Rep, 2, Integer, upper_bound);
/*!
convention
if self.lower_bound <= self.upper_bound
then [self.items is a C++ array of Items which is
self.upper_bound - self.lower_bound + 1 long]
else self.items = NULL
correspondence
self = (self.lower_bound,
self.upper_bound,
{i: integer where (self.lb <= i <= self.ub)
((i, self.items[i - self.lb]))})
!*/
local_procedure_body Initialize ()
{
self[items] = NULL;
self[lower_bound] = 1;
self[upper_bound] = 0;
}
local_procedure_body Finalize ()
{
if (self[items] != NULL)
{
delete [] self[items];
}
}
public:
standard_concrete_operations (Array_Kernel_1);
procedure_body Set_Bounds (
preserves Integer lower,
preserves Integer upper
)
{
if (self[items] != NULL)
{
delete [] self[items];
self[items] = NULL;
}
if (lower <= upper)
{
self[items] = new Item[To_int (upper - lower + 1)];
}
self[lower_bound] = lower;
self[upper_bound] = upper;
}
function_body Item& operator [] (
preserves Integer i
)
{
return (self[items])[To_int (i - self[lower_bound])];
}
function_body Integer Lower_Bound ()
{
return self[lower_bound];
}
function_body Integer Upper_Bound ()
{
return self[upper_bound];
}
};
#endif // CT_ARRAY_KERNEL_1
Last modified: Thu Jan 11 17:05:57 EST 2007