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

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

#ifndef CT_TREE_KERNEL_1
#define CT_TREE_KERNEL_1 1
 
///---------------------------------------------------------------------
/// Global Context -----------------------------------------------------
///---------------------------------------------------------------------

#include "AT/Tree/Kernel.h"
#include "CT/Sequence/Kernel_1a.h"

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

concrete_template <
	concrete_instance class Item,
	concrete_instance class Subtree_Type,
	/*!
	    implements
		abstract_instance Tree_Kernel <
			Item,
			Subtree_Type
		    >
	!*/
        concrete_instance class Subtree_Type_Ptr_Record =
            Record < Pointer_C <Subtree_Type> >,
        concrete_instance class Sequence_Of_Subtree_Type_Ptr_Record =
            Sequence_Kernel_1a <Subtree_Type_Ptr_Record>,
	concrete_instance class Rep =
            Representation <
		    Item,
		    Integer,
		    Sequence_Of_Subtree_Type_Ptr_Record
		>
    >
class Tree_Kernel_1 :
    implements
	abstract_instance Tree_Kernel <
		Item,
		Subtree_Type
	    >,
    encapsulates
	concrete_instance Rep
{
private:
    
    rep_field_name (Rep, 0, Item, tree_label);
    rep_field_name (Rep, 1, Integer, size);
    rep_field_name (Rep, 2, Sequence_Of_Subtree_Type_Ptr_Record,
		    subtree_ptr_seq);
    
    field_name (Subtree_Type_Ptr_Record, 0, Subtree_Type_Ptr, subtree_ptr);
    
    /*!
	convention
	    self.size = |self|
	    
	correspondence
	    self = compose (self.tree_label,
			    [string of trees pointed to by the
			     pointers in self.subtree_ptr_seq])
    !*/

    procedure_body Initialize ()
    {
	self[size] = 1;
    }

    procedure_body Finalize ()
    {
	while (self[subtree_ptr_seq].Length () > 0)
	{
	    object Subtree_Type_Ptr_Record ptr;

	    self[subtree_ptr_seq].Remove (0, ptr);
	    Delete (ptr[subtree_ptr]);
	}
    }

public:

    standard_concrete_operations (Tree_Kernel_1);
  
    procedure_body Add (
	    preserves Integer pos,
	    consumes Subtree_Type& t
	)
    {   
	object Subtree_Type_Ptr_Record ptr;

	New (ptr[subtree_ptr]);
	self[size] += t.Size ();
	*(ptr[subtree_ptr]) &= t;
	self[subtree_ptr_seq].Add (pos, ptr);
    }

    procedure_body Remove (
            preserves Integer pos,
	    produces Subtree_Type& t
	)
    {
	object Subtree_Type_Ptr_Record ptr;

	self[subtree_ptr_seq].Remove (pos, ptr);
	t &= *(ptr[subtree_ptr]);
	Delete (ptr[subtree_ptr]);
	self[size] -= t.Size ();
    }

    function_body Item& operator [] (
	    preserves Accessor_Position& current
	)
    {
	return self[tree_label];
    }
    
    function_body Integer Number_Of_Children ()
    {
	return self[subtree_ptr_seq].Length ();
    }

    function_body Integer Size ()
    {
	return (self[size]);
    }
    
};

//----------------------------------------------------------------------

#endif // CT_TREE_KERNEL_1

Last modified: Fri Mar 16 10:37:05 EDT 2007