From d72a09fef7acb53ecc8d580d83eb861ab8a5f0c7 Mon Sep 17 00:00:00 2001 From: Derek Bankieris Date: Tue, 29 Nov 2016 13:38:32 -0600 Subject: [PATCH] Add ability to clear all variables from a DR group Don't let "sys.exec.out.time" be removed Refs #350 --- include/trick/DataRecordGroup.hh | 10 +++- .../DataRecord/DataRecordGroup.cpp | 55 +++++++++++++------ 2 files changed, 45 insertions(+), 20 deletions(-) diff --git a/include/trick/DataRecordGroup.hh b/include/trick/DataRecordGroup.hh index 616d5329..823fdb4d 100644 --- a/include/trick/DataRecordGroup.hh +++ b/include/trick/DataRecordGroup.hh @@ -318,9 +318,15 @@ namespace Trick { @par Python Usage: @code .remove_variable("") @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 .remove_all_variable() @endcode + */ + virtual void remove_all_variables() ; /** @brief This routine allows users to add variables through an already created REF2 structure. diff --git a/trick_source/sim_services/DataRecord/DataRecordGroup.cpp b/trick_source/sim_services/DataRecord/DataRecordGroup.cpp index bd25f020..3b6e4b82 100644 --- a/trick_source/sim_services/DataRecord/DataRecordGroup.cpp +++ b/trick_source/sim_services/DataRecord/DataRecordGroup.cpp @@ -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& 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) ;