diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2025-03-19 20:33:36 +0000 |
---|---|---|
committer | James K. Lowden <jklowden@cobolworx.com> | 2025-03-26 16:49:11 -0400 |
commit | 57d711ba58f8a69dce22b2a543d8e6c668680865 (patch) | |
tree | 5ca1aeb8214a9eb8510d0da2b7198ba9080ba1f7 /gcc | |
parent | 96b048329c828d29ab5e3ac67da6bdc841eb608b (diff) | |
download | gcc-57d711ba58f8a69dce22b2a543d8e6c668680865.zip gcc-57d711ba58f8a69dce22b2a543d8e6c668680865.tar.gz gcc-57d711ba58f8a69dce22b2a543d8e6c668680865.tar.bz2 |
cobol: Replace quadratic loop removing std::set elements
There's no need to keep using std::find_if from the beginning of the
container after every removal, just update the iterator after erasing an
element.
This is how C++20 std::erase_if is implemented.
gcc/cobol/ChangeLog:
* except.cc (cbl_enabled_exceptions_t::turn_on_off): Replace
quadratic loop with a single pass.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cobol/except.cc | 32 |
1 files changed, 14 insertions, 18 deletions
diff --git a/gcc/cobol/except.cc b/gcc/cobol/except.cc index ba49f78..1485a33 100644 --- a/gcc/cobol/except.cc +++ b/gcc/cobol/except.cc @@ -115,31 +115,27 @@ cbl_enabled_exceptions_t::turn_on_off( bool enabled, return true; } - /* - * std::remove_if cannot be used with std::set because its elements are const. - * std::set::erase_if became available only in C++20. - */ + // std::set::erase_if became available only in C++20. if( enabled ) { // remove any disabled if( files.empty() ) { auto p = begin(); - while( end() != (p = std::find_if( begin(), end(), - [ec = type]( const auto& elem ) { - return - !elem.enabled && - ec_cmp(ec, elem.ec); } )) ) { - erase(p); + while( p != end() ) { + if( !p->enabled && ec_cmp(type, p->ec) ) { + p = erase(p); + } else { + ++p; + } } } else { for( size_t file: files ) { auto p = begin(); - while( end() != (p = std::find_if( begin(), end(), - [ec = type, file]( const auto& elem ) { - return - !elem.enabled && - file == elem.file && - ec_cmp(ec, elem.ec); } )) ) { - erase(p); - } + while( p != end() ) { + if( !p->enabled && file == p->file && ec_cmp(type, p->ec) ) { + p = erase(p); + } else { + ++p; + } + } } } auto elem = cbl_enabled_exception_t(enabled, location, type); |