From d1b75d9407563c32702a67e0396b181bbd10ab16 Mon Sep 17 00:00:00 2001 From: Cary R Date: Sat, 25 Jul 2020 15:30:58 -0700 Subject: [PATCH] Update some queue warning messages and optimize element erase --- vvp/vvp_darray.cc | 52 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/vvp/vvp_darray.cc b/vvp/vvp_darray.cc index a54d217db..8a68f1f6d 100644 --- a/vvp/vvp_darray.cc +++ b/vvp/vvp_darray.cc @@ -462,7 +462,7 @@ void vvp_queue_real::push_back(double value, unsigned max_size) { if (!max_size || (queue.size() < max_size)) queue.push_back(value); else cerr << "Warning: push_back(" << value - << ") skipped for already full bounded queue [" + << ") skipped for already full bounded queue [" << max_size << "]." << endl; } @@ -470,7 +470,7 @@ void vvp_queue_real::push_front(double value, unsigned max_size) { if (max_size && (queue.size() == max_size)) { cerr << "Warning: push_front(" << value << ") removed " - << queue.back() << " from already full bounded queue [" + << queue.back() << " from already full bounded queue [" << max_size << "]." << endl; queue.pop_back(); } @@ -479,8 +479,16 @@ void vvp_queue_real::push_front(double value, unsigned max_size) void vvp_queue_real::erase(unsigned idx) { - std::deque::iterator pos = queue.begin(); - for (unsigned count = 0; count < idx; ++count) ++pos; + std::deque::iterator pos; + unsigned middle = queue.size()/2; + if (idx < middle) { + pos = queue.begin(); + for (unsigned count = 0; count < idx; ++count) ++pos; + } else { + pos = queue.end(); + for (unsigned count = queue.size(); count > idx; --count) --pos; + } + queue.erase(pos); } @@ -506,7 +514,7 @@ void vvp_queue_string::push_back(const string&value, unsigned max_size) { if (!max_size || (queue.size() < max_size)) queue.push_back(value); else cerr << "Warning: push_back(\"" << value - << "\") skipped for already full bounded queue [" + << "\") skipped for already full bounded queue [" << max_size << "]." << endl; } @@ -514,7 +522,7 @@ void vvp_queue_string::push_front(const string&value, unsigned max_size) { if (max_size && (queue.size() == max_size)) { cerr << "Warning: push_front(\"" << value << "\") removed \"" - << queue.back() << "\" from already full bounded queue [" + << queue.back() << "\" from already full bounded queue [" << max_size << "]." << endl; queue.pop_back(); } @@ -523,8 +531,16 @@ void vvp_queue_string::push_front(const string&value, unsigned max_size) void vvp_queue_string::erase(unsigned idx) { - std::deque::iterator pos = queue.begin(); - for (unsigned count = 0; count < idx; ++count) ++pos; + std::deque::iterator pos; + unsigned middle = queue.size()/2; + if (idx < middle) { + pos = queue.begin(); + for (unsigned count = 0; count < idx; ++count) ++pos; + } else { + pos = queue.end(); + for (unsigned count = queue.size(); count > idx; --count) --pos; + } + queue.erase(pos); } @@ -550,16 +566,16 @@ void vvp_queue_vec4::push_back(const vvp_vector4_t&value, unsigned max_size) { if (!max_size || (queue.size() < max_size)) queue.push_back(value); else cerr << "Warning: push_back(" << value - << ") skipped for already full bounded queue [" - << max_size << "]." << endl; + << ") skipped for already full bounded queue [" << max_size << "]." << endl; } void vvp_queue_vec4::push_front(const vvp_vector4_t&value, unsigned max_size) { if (max_size && (queue.size() == max_size)) { cerr << "Warning: push_front(" << value << ") removed " - << queue.back() << " from already full bounded queue [" - << max_size << "]." << endl; + << queue.back() << " from already full bounded queue [" << max_size << "]." << endl; queue.pop_back(); } queue.push_front(value); @@ -567,7 +583,15 @@ void vvp_queue_vec4::push_front(const vvp_vector4_t&value, unsigned max_size) void vvp_queue_vec4::erase(unsigned idx) { - std::deque::iterator pos = queue.begin(); - for (unsigned count = 0; count < idx; ++count) ++pos; + std::deque::iterator pos; + unsigned middle = queue.size()/2; + if (idx < middle) { + pos = queue.begin(); + for (unsigned count = 0; count < idx; ++count) ++pos; + } else { + pos = queue.end(); + for (unsigned count = queue.size(); count > idx; --count) --pos; + } + queue.erase(pos); }