trick/trick_source/sim_services/Collect/collect.cpp

102 lines
2.6 KiB
C++
Raw Normal View History

2015-02-26 15:02:31 +00:00
#include <stdlib.h>
#include <string.h>
#include "trick/collect_macros.h"
2015-02-26 15:02:31 +00:00
/**
@brief
Adds the addess, collectee, to the list pointed to by collector. Returns a new pointer
to the new list. The old list a collector will be freed.
@details
-# Get the current list length
-# Allocate enough space to accomodate the current list + 1. (+1 for the size of the list)
-# Set the size of the new list in the first slot of the new list.
-# Copy the old list to the new.
-# Append the new item to the new list.
-# Delete the old list
-# Return the new list
*/
void ** add_collect( void ** collector , void * collectee ) {
int collect_size = NUM_COLLECT(collector) ;
void ** new_list ;
long * lp ;
// create a new list
new_list = (void**)malloc((collect_size + 2) * sizeof(void*));
// set the list size
lp = ( long *)new_list ;
*lp = collect_size + 1 ;
// copy old list
new_list++ ;
if ( collect_size > 0 ) {
memcpy( new_list , collector , collect_size * sizeof(void *)) ;
}
new_list[collect_size] = collectee ;
// remove old list
if ( collector ) {
free(collector - 1) ;
}
return new_list ;
}
/**
@brief
Deletes the addess, collectee, from the list pointed to by collector. Returns a new pointer
to the new list. The old list a collector will be freed.
@details
-# Get the current list length
-# Count the number of items in the list that do not match the collectee.
-# Allocate enough space to accomodate the new list. (+1 for the size of the list)
-# Set the size of the new list in the first slot of the new list.
-# Copy all of the items that do not match collectee to the new list
-# Delete the old list
-# Return the new list
*/
void ** delete_collect( void ** collector , void * collectee ) {
int collect_size = NUM_COLLECT(collector) ;
int new_count = 0 ;
void ** new_list ;
long * lp ;
int ii , jj ;
for ( ii = 0 ; ii < collect_size ; ii++ ) {
if ( collector[ii] != collectee ) {
new_count++ ;
}
}
if ( new_count > 0 ) {
// create a new list
new_list = (void**)malloc((new_count + 1) * sizeof(void*));
// set the list size
lp = ( long *)new_list ;
*lp = new_count ;
// copy old list
new_list++ ;
jj = 0 ;
for ( ii = 0 ; ii < collect_size ; ii++ ) {
if ( collector[ii] != collectee ) {
new_list[jj++] = collector[ii] ;
}
}
} else {
new_list = NULL ;
}
// remove old list
if ( collector ) {
free(collector - 1) ;
}
return new_list ;
}