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

//  /*----------------------------------------------------------------*\
//  |   Concrete Template : Stack_Kernel_1
//  \*----------------------------------------------------------------*/

#ifndef CT_STACK_KERNEL_1
#define CT_STACK_KERNEL_1 1

///---------------------------------------------------------------------
/// Global Context -----------------------------------------------------
///---------------------------------------------------------------------

#include "AT/Stack/Kernel.h"

///---------------------------------------------------------------------
/// Interface ----------------------------------------------------------
///---------------------------------------------------------------------

concrete_template <
	concrete_instance class Item,
	concrete_instance class Node,
	/*!
	    implements
		abstract_instance Record <
			Item,
			Pointer_C <Node>
		    >
	!*/
	concrete_instance class Rep =
            Representation <
		    Pointer_C <Node>,
		    Integer
		>
    >
class Stack_Kernel_1 :
    implements
	abstract_instance Stack_Kernel <Item>,
    encapsulates
	concrete_instance Rep
{
private:

    rep_field_name (Rep, 0, Pointer_C <Node>, top);
    rep_field_name (Rep, 1, Integer, length);

    field_name (Node, 0, Item, data);
    field_name (Node, 1, Pointer_C <Node>, next);
    
    /*!
	convention
	    self.length >= 0  and
	    if self.length = 0
		then (self.top = NULL)
		else ([self.top points to the first node of a
		      singly linked list containing self.length
		      Node nodes, and where the next field of
		      the last node is NULL])
		      
	correspondence
	    if self.length = 0
		then self = empty_string
		else self =
		   [data fields of the first self.length nodes
		    in the singly linked list pointed to by
		    self.top, concatenated together in the
		    order in which they are linked together]
    !*/

    local_procedure_body Initialize ()
    {
	self[top] = NULL;
    }

    local_procedure_body Finalize ()
    {
	//-------- for students to fill in --------
    }

public:

    standard_concrete_operations (Stack_Kernel_1);

    procedure_body Push (
	    consumes Item& x
	)
    {
	//-------- for students to fill in --------
    }

    procedure_body Pop (
	    produces Item& x
	)
    {
	//-------- for students to fill in --------
    }

    function_body Item& operator [] (
	    preserves Accessor_Position& current
	)
    {
	object Pointer_C <Node> p = self[top];
	
	return (*p)[data];
    }

    function_body Integer Length ()
    {
	//-------- for students to fill in --------
    }

};

#endif // CT_STACK_KERNEL_1

Last modified: Tue Feb 09 15:30:01 EST 2010