Add ability to clear all variables from a DR group

Don't let "sys.exec.out.time" be removed

Refs #350
This commit is contained in:
Derek Bankieris 2016-11-29 13:38:32 -06:00
parent d859ac8453
commit d72a09fef7
2 changed files with 45 additions and 20 deletions

View File

@ -318,9 +318,15 @@ namespace Trick {
@par Python Usage:
@code <dr_group>.remove_variable("<in_name>") @endcode
@param in_name - the name of the variable to not record
@return always 0
*/
virtual int remove_variable(std::string in_name) ;
virtual void remove_variable(std::string in_name) ;
/**
@brief @userdesc Command to remove all variables from recording.
@par Python Usage:
@code <dr_group>.remove_all_variable() @endcode
*/
virtual void remove_all_variables() ;
/**
@brief This routine allows users to add variables through an already created REF2 structure.

View File

@ -247,19 +247,44 @@ int Trick::DataRecordGroup::add_variable( std::string in_name , std::string alia
return 0 ;
}
int Trick::DataRecordGroup::remove_variable( std::string in_name ) {
void Trick::DataRecordGroup::remove_variable( std::string in_name ) {
// Trim leading spaces
in_name.erase( 0, in_name.find_first_not_of( " \t" ) );
// Trim trailing spaces
in_name.erase( in_name.find_last_not_of( " \t" ) + 1);
rec_buffer.erase( std::remove_if( rec_buffer.begin(), rec_buffer.end(),
[&]( DataRecordBuffer* buffer ) {
return !buffer->name.compare( in_name );
} ),
rec_buffer.end() );
return 0 ;
if (!in_name.compare("sys.exec.out.time")) {
// This class assumes sim time is always the first variable.
// Removing it results in errors.
return;
}
auto remove_from = [&](std::vector<DataRecordBuffer*>& buffer) {
for (auto i = buffer.begin(); i != buffer.end(); ++i) {
if (!(*i)->name.compare(in_name)) {
delete *i;
buffer.erase(i);
break;
}
}
};
remove_from(rec_buffer);
remove_from(change_buffer);
}
void Trick::DataRecordGroup::remove_all_variables() {
// remove all but the first variable, which is sim time
for (auto i = rec_buffer.begin() + 1; i != rec_buffer.end(); ++i) {
delete *i;
}
rec_buffer.erase(rec_buffer.begin() + 1, rec_buffer.end());
// remove everything
for (auto variable : change_buffer) {
delete variable;
}
change_buffer.clear();
}
int Trick::DataRecordGroup::add_variable( REF2 * ref2 ) {
@ -647,22 +672,16 @@ int Trick::DataRecordGroup::disable() {
int Trick::DataRecordGroup::shutdown() {
unsigned int jj ;
// Force write out all data
record = true ; // If user disabled group, make sure any recorded data gets written out
write_data(true) ;
format_specific_shutdown() ;
for (jj = 0; jj < rec_buffer.size() ; jj++) {
delete rec_buffer[jj] ;
}
rec_buffer.clear() ;
remove_all_variables();
for (jj = 0; jj < change_buffer.size() ; jj++) {
delete change_buffer[jj] ;
}
change_buffer.clear() ;
// remove_all_variables does not remove sim time
delete rec_buffer[0];
rec_buffer.clear();
if ( writer_buff ) {
free(writer_buff) ;