aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2025-03-19 20:33:36 +0000
committerJames K. Lowden <jklowden@cobolworx.com>2025-03-26 16:49:11 -0400
commit57d711ba58f8a69dce22b2a543d8e6c668680865 (patch)
tree5ca1aeb8214a9eb8510d0da2b7198ba9080ba1f7 /gcc
parent96b048329c828d29ab5e3ac67da6bdc841eb608b (diff)
downloadgcc-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.cc32
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);