Resolve/C++ Catalog
CT/Array/Kernel_1.h
Copyright © 2010, Reusable Software Research Group, The Ohio State University

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