/*****************************************************************************
* File: sys_mechs.c
*
*
* Notice:
* (C) Copyright 1999, 2000 ROX Software, Inc.
* All rights reserved.
*
* Model Compiler: MC3020 V1.3.0
*
* Warnings:
* !!! THIS IS AN AUTO-GENERATED FILE. PLEASE DO NOT EDIT. !!!
****************************************************************************/
#include <stdlib.h>
#include "sys_init.h"
#include "e_mechs.h"
#include "e_events.h"
#include "e_objset.h"
/*****************************************************************************
****************************************************************************/
static Escher_ObjectSet_s * node1_FreeList = (Escher_ObjectSet_s *) 0;
static Escher_ObjectSet_s node1s[ SYS_MAX_CONTAINERS ];
/*****************************************************************************
* Initialize the node1 instances by linking them into a collection.
* These containoids will be collected into a null-terminated,
* singly linked list (slist).
* This needs to be called during architecture initialization.
****************************************************************************/
void
Escher_SetFactoryInit()
{
unsigned int i;
node1_FreeList = &node1s[ 0 ];
/* Build the collection (linked list) of node1 instances. */
for ( i = 0; i < ( SYS_MAX_CONTAINERS - 1 ); i++ )
{
node1s[ i ].next = &node1s[ i + 1 ];
node1s[ i ].object = 0;
}
node1s[ SYS_MAX_CONTAINERS - 1 ].next = (Escher_ObjectSet_s *) 0;
}
/*****************************************************************************
* Escher_CopySet
****************************************************************************/
void
Escher_CopySet( Escher_ObjectSet_s * const to_set,
Escher_ObjectSet_s * const from_set )
{
Escher_ObjectSet_s * slot;
/* May be copying into an existing set, release target collection nodes. */
Escher_ClearSet( to_set );
Escher_InitSet( to_set );
for ( slot = from_set->next; slot; slot = slot->next )
{
Escher_SetInsertElement( to_set, slot->object );
}
}
/*****************************************************************************
* Escher_ClearSet
****************************************************************************/
void
Escher_ClearSet( Escher_ObjectSet_s * const set )
{
Escher_ObjectSet_s * slot, * new_slot;
for ( slot = set->next; slot; )
{
new_slot = slot->next;
Escher_SetRemoveElement( set, slot->object );
slot = new_slot;
}
Escher_InitSet( set );
}
/*****************************************************************************
* Escher_SetInsertElement
****************************************************************************/
void
Escher_SetInsertElement( Escher_ObjectSet_s * const set,
void * const element )
{
Escher_ObjectSet_s * slot;
if ( ! node1_FreeList )
{
UserNodeListEmptyCallout(); /* Bad news! No more nodes. */
}
else
{
slot = node1_FreeList; /* Extract node from head of free list. */
node1_FreeList = node1_FreeList->next;
slot->object = element;
slot->next = set->next; /* Insert element at front of list. */
set->next = slot;
}
}
/*****************************************************************************
* Escher_SetRemoveNode
****************************************************************************/
Escher_ObjectSet_s *
Escher_SetRemoveNode( Escher_ObjectSet_s * const set,
const void * const d )
{
Escher_ObjectSet_s * t = set->next; /* Start with first node. */
/* Find node containing data and unlink from list. */
if ( t->object == d ) /* Element found at head. */
{
set->next = t->next; /* Unlink it from the list. */
}
else
{
Escher_ObjectSet_s * t_old;
do /* Search for data element. */
{
t_old = t;
t = t->next;
if ( t == (Escher_ObjectSet_s *) 0 ) return 0; /* absent */
} while ( t->object != d );
t_old->next = t->next; /* Unlink element from the list. */
}
return t;
}
/*****************************************************************************
* Escher_SetRemoveElement
****************************************************************************/
void
Escher_SetRemoveElement( Escher_ObjectSet_s * const set,
const void * const d )
{
Escher_ObjectSet_s * t;
if ( ! set->next ) return; /* empty set */
t = Escher_SetRemoveNode( set, d );
/* Return node to architecture collection (free list). */
if ( t )
{
t->next = node1_FreeList;
node1_FreeList = t;
}
}
/*****************************************************************************
* Return true when the set contains the given data element.
* Return false if not found.
****************************************************************************/
bool
Escher_SetContains( Escher_ObjectSet_s * const set,
const void * const element )
{
Escher_ObjectSet_s * t = set;
while ( ( t = t->next ) != 0 )
{
if ( t->object == element ) return true; /* found */
}
return false; /* absent */
}
/*****************************************************************************
* Escher_SetCardinality
****************************************************************************/
int
Escher_SetCardinality( const Escher_ObjectSet_s * const set )
{
int result = 0;
Escher_ObjectSet_s * node;
for ( node = set->next; node; node = node->next )
{
result++;
}
return result;
}
/*****************************************************************************
* Escher_SetEquality
****************************************************************************/
bool
Escher_SetEquality( Escher_ObjectSet_s * const left_set,
Escher_ObjectSet_s * const right_set )
{
if ( !left_set || !right_set )
return false;
if ( Escher_SetCardinality( left_set ) != Escher_SetCardinality( right_set ) )
return false;
return true;
}
/*****************************************************************************
* The iterator uses a cursor external to the set (or extent).
* This cursor maintains a flavor of current element.
****************************************************************************/
void *
Escher_IteratorNext( Escher_Iterator_s * const iter )
{
if ( !iter->cursor )
{
return (void *) 0;
}
else
{
void * element;
element = iter->cursor->object;
iter->cursor = iter->cursor->next;
return element;
}
}