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