/src/solidity/libsolutil/cxx20.h
Line | Count | Source |
1 | | /* |
2 | | This file is part of solidity. |
3 | | |
4 | | solidity is free software: you can redistribute it and/or modify |
5 | | it under the terms of the GNU General Public License as published by |
6 | | the Free Software Foundation, either version 3 of the License, or |
7 | | (at your option) any later version. |
8 | | |
9 | | solidity is distributed in the hope that it will be useful, |
10 | | but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 | | GNU General Public License for more details. |
13 | | |
14 | | You should have received a copy of the GNU General Public License |
15 | | along with solidity. If not, see <http://www.gnu.org/licenses/>. |
16 | | */ |
17 | | // SPDX-License-Identifier: GPL-3.0 |
18 | | |
19 | | #include <map> |
20 | | |
21 | | // Contains polyfills of STL functions and algorithms that will become available in C++20. |
22 | | namespace solidity::cxx20 |
23 | | { |
24 | | |
25 | | // Taken from https://en.cppreference.com/w/cpp/container/map/erase_if. |
26 | | template<class Key, class T, class Compare, class Alloc, class Pred> |
27 | | typename std::map<Key, T, Compare, Alloc>::size_type erase_if(std::map<Key,T,Compare,Alloc>& _c, Pred _pred) |
28 | | { |
29 | | auto old_size = _c.size(); |
30 | | for (auto i = _c.begin(), last = _c.end(); i != last;) |
31 | | if (_pred(*i)) |
32 | | i = _c.erase(i); |
33 | | else |
34 | | ++i; |
35 | | return old_size - _c.size(); |
36 | | } |
37 | | |
38 | | // Taken from https://en.cppreference.com/w/cpp/container/unordered_map/erase_if. |
39 | | template<class Key, class T, class Hash, class KeyEqual, class Alloc, class Pred> |
40 | | typename std::unordered_map<Key, T, Hash, KeyEqual, Alloc>::size_type |
41 | | erase_if(std::unordered_map<Key, T, Hash, KeyEqual, Alloc>& _c, Pred _pred) |
42 | 14.5M | { |
43 | 14.5M | auto old_size = _c.size(); |
44 | 16.4M | for (auto i = _c.begin(), last = _c.end(); i != last;) |
45 | 1.90M | if (_pred(*i)) |
46 | 149k | i = _c.erase(i); |
47 | 1.76M | else |
48 | 1.76M | ++i; |
49 | 14.5M | return old_size - _c.size(); |
50 | 14.5M | } DataFlowAnalyzer.cpp:std::__1::unordered_map<solidity::yul::YulString, solidity::yul::YulString, std::__1::hash<solidity::yul::YulString>, std::__1::equal_to<solidity::yul::YulString>, std::__1::allocator<std::__1::pair<solidity::yul::YulString const, solidity::yul::YulString> > >::size_type solidity::cxx20::erase_if<solidity::yul::YulString, solidity::yul::YulString, std::__1::hash<solidity::yul::YulString>, std::__1::equal_to<solidity::yul::YulString>, std::__1::allocator<std::__1::pair<solidity::yul::YulString const, solidity::yul::YulString> >, solidity::util::detail::MapTuple<solidity::yul::DataFlowAnalyzer::operator()(solidity::yul::ExpressionStatement&)::$_1> >(std::__1::unordered_map<solidity::yul::YulString, solidity::yul::YulString, std::__1::hash<solidity::yul::YulString>, std::__1::equal_to<solidity::yul::YulString>, std::__1::allocator<std::__1::pair<solidity::yul::YulString const, solidity::yul::YulString> > >&, solidity::util::detail::MapTuple<solidity::yul::DataFlowAnalyzer::operator()(solidity::yul::ExpressionStatement&)::$_1>) Line | Count | Source | 42 | 544k | { | 43 | 544k | auto old_size = _c.size(); | 44 | 1.71M | for (auto i = _c.begin(), last = _c.end(); i != last;) | 45 | 1.16M | if (_pred(*i)) | 46 | 123k | i = _c.erase(i); | 47 | 1.04M | else | 48 | 1.04M | ++i; | 49 | 544k | return old_size - _c.size(); | 50 | 544k | } |
DataFlowAnalyzer.cpp:std::__1::unordered_map<solidity::yul::YulString, solidity::yul::YulString, std::__1::hash<solidity::yul::YulString>, std::__1::equal_to<solidity::yul::YulString>, std::__1::allocator<std::__1::pair<solidity::yul::YulString const, solidity::yul::YulString> > >::size_type solidity::cxx20::erase_if<solidity::yul::YulString, solidity::yul::YulString, std::__1::hash<solidity::yul::YulString>, std::__1::equal_to<solidity::yul::YulString>, std::__1::allocator<std::__1::pair<solidity::yul::YulString const, solidity::yul::YulString> >, solidity::util::detail::MapTuple<solidity::yul::DataFlowAnalyzer::operator()(solidity::yul::ExpressionStatement&)::$_2> >(std::__1::unordered_map<solidity::yul::YulString, solidity::yul::YulString, std::__1::hash<solidity::yul::YulString>, std::__1::equal_to<solidity::yul::YulString>, std::__1::allocator<std::__1::pair<solidity::yul::YulString const, solidity::yul::YulString> > >&, solidity::util::detail::MapTuple<solidity::yul::DataFlowAnalyzer::operator()(solidity::yul::ExpressionStatement&)::$_2>) Line | Count | Source | 42 | 85.4k | { | 43 | 85.4k | auto old_size = _c.size(); | 44 | 246k | for (auto i = _c.begin(), last = _c.end(); i != last;) | 45 | 160k | if (_pred(*i)) | 46 | 17.4k | i = _c.erase(i); | 47 | 143k | else | 48 | 143k | ++i; | 49 | 85.4k | return old_size - _c.size(); | 50 | 85.4k | } |
DataFlowAnalyzer.cpp:std::__1::unordered_map<solidity::yul::YulString, solidity::yul::YulString, std::__1::hash<solidity::yul::YulString>, std::__1::equal_to<solidity::yul::YulString>, std::__1::allocator<std::__1::pair<solidity::yul::YulString const, solidity::yul::YulString> > >::size_type solidity::cxx20::erase_if<solidity::yul::YulString, solidity::yul::YulString, std::__1::hash<solidity::yul::YulString>, std::__1::equal_to<solidity::yul::YulString>, std::__1::allocator<std::__1::pair<solidity::yul::YulString const, solidity::yul::YulString> >, solidity::util::detail::MapTuple<solidity::yul::DataFlowAnalyzer::handleAssignment(std::__1::set<solidity::yul::YulString, std::__1::less<solidity::yul::YulString>, std::__1::allocator<solidity::yul::YulString> > const&, std::__1::variant<solidity::yul::FunctionCall, solidity::yul::Identifier, solidity::yul::Literal>*, bool)::$_3> >(std::__1::unordered_map<solidity::yul::YulString, solidity::yul::YulString, std::__1::hash<solidity::yul::YulString>, std::__1::equal_to<solidity::yul::YulString>, std::__1::allocator<std::__1::pair<solidity::yul::YulString const, solidity::yul::YulString> > >&, solidity::util::detail::MapTuple<solidity::yul::DataFlowAnalyzer::handleAssignment(std::__1::set<solidity::yul::YulString, std::__1::less<solidity::yul::YulString>, std::__1::allocator<solidity::yul::YulString> > const&, std::__1::variant<solidity::yul::FunctionCall, solidity::yul::Identifier, solidity::yul::Literal>*, bool)::$_3>) Line | Count | Source | 42 | 1.72M | { | 43 | 1.72M | auto old_size = _c.size(); | 44 | 1.83M | for (auto i = _c.begin(), last = _c.end(); i != last;) | 45 | 106k | if (_pred(*i)) | 46 | 0 | i = _c.erase(i); | 47 | 106k | else | 48 | 106k | ++i; | 49 | 1.72M | return old_size - _c.size(); | 50 | 1.72M | } |
DataFlowAnalyzer.cpp:std::__1::unordered_map<solidity::yul::YulString, solidity::yul::YulString, std::__1::hash<solidity::yul::YulString>, std::__1::equal_to<solidity::yul::YulString>, std::__1::allocator<std::__1::pair<solidity::yul::YulString const, solidity::yul::YulString> > >::size_type solidity::cxx20::erase_if<solidity::yul::YulString, solidity::yul::YulString, std::__1::hash<solidity::yul::YulString>, std::__1::equal_to<solidity::yul::YulString>, std::__1::allocator<std::__1::pair<solidity::yul::YulString const, solidity::yul::YulString> >, solidity::util::detail::MapTuple<solidity::yul::DataFlowAnalyzer::handleAssignment(std::__1::set<solidity::yul::YulString, std::__1::less<solidity::yul::YulString>, std::__1::allocator<solidity::yul::YulString> > const&, std::__1::variant<solidity::yul::FunctionCall, solidity::yul::Identifier, solidity::yul::Literal>*, bool)::$_4> >(std::__1::unordered_map<solidity::yul::YulString, solidity::yul::YulString, std::__1::hash<solidity::yul::YulString>, std::__1::equal_to<solidity::yul::YulString>, std::__1::allocator<std::__1::pair<solidity::yul::YulString const, solidity::yul::YulString> > >&, solidity::util::detail::MapTuple<solidity::yul::DataFlowAnalyzer::handleAssignment(std::__1::set<solidity::yul::YulString, std::__1::less<solidity::yul::YulString>, std::__1::allocator<solidity::yul::YulString> > const&, std::__1::variant<solidity::yul::FunctionCall, solidity::yul::Identifier, solidity::yul::Literal>*, bool)::$_4>) Line | Count | Source | 42 | 1.72M | { | 43 | 1.72M | auto old_size = _c.size(); | 44 | 1.75M | for (auto i = _c.begin(), last = _c.end(); i != last;) | 45 | 22.5k | if (_pred(*i)) | 46 | 0 | i = _c.erase(i); | 47 | 22.5k | else | 48 | 22.5k | ++i; | 49 | 1.72M | return old_size - _c.size(); | 50 | 1.72M | } |
DataFlowAnalyzer.cpp:std::__1::unordered_map<solidity::yul::YulString, solidity::yul::YulString, std::__1::hash<solidity::yul::YulString>, std::__1::equal_to<solidity::yul::YulString>, std::__1::allocator<std::__1::pair<solidity::yul::YulString const, solidity::yul::YulString> > >::size_type solidity::cxx20::erase_if<solidity::yul::YulString, solidity::yul::YulString, std::__1::hash<solidity::yul::YulString>, std::__1::equal_to<solidity::yul::YulString>, std::__1::allocator<std::__1::pair<solidity::yul::YulString const, solidity::yul::YulString> >, solidity::util::detail::MapTuple<solidity::yul::DataFlowAnalyzer::clearValues(std::__1::set<solidity::yul::YulString, std::__1::less<solidity::yul::YulString>, std::__1::allocator<solidity::yul::YulString> >)::$_5> >(std::__1::unordered_map<solidity::yul::YulString, solidity::yul::YulString, std::__1::hash<solidity::yul::YulString>, std::__1::equal_to<solidity::yul::YulString>, std::__1::allocator<std::__1::pair<solidity::yul::YulString const, solidity::yul::YulString> > >&, solidity::util::detail::MapTuple<solidity::yul::DataFlowAnalyzer::clearValues(std::__1::set<solidity::yul::YulString, std::__1::less<solidity::yul::YulString>, std::__1::allocator<solidity::yul::YulString> >)::$_5>) Line | Count | Source | 42 | 10.0M | { | 43 | 10.0M | auto old_size = _c.size(); | 44 | 10.4M | for (auto i = _c.begin(), last = _c.end(); i != last;) | 45 | 393k | if (_pred(*i)) | 46 | 11 | i = _c.erase(i); | 47 | 393k | else | 48 | 393k | ++i; | 49 | 10.0M | return old_size - _c.size(); | 50 | 10.0M | } |
DataFlowAnalyzer.cpp:std::__1::unordered_map<solidity::yul::YulString, solidity::yul::YulString, std::__1::hash<solidity::yul::YulString>, std::__1::equal_to<solidity::yul::YulString>, std::__1::allocator<std::__1::pair<solidity::yul::YulString const, solidity::yul::YulString> > >::size_type solidity::cxx20::erase_if<solidity::yul::YulString, solidity::yul::YulString, std::__1::hash<solidity::yul::YulString>, std::__1::equal_to<solidity::yul::YulString>, std::__1::allocator<std::__1::pair<solidity::yul::YulString const, solidity::yul::YulString> >, solidity::util::detail::MapTuple<solidity::yul::DataFlowAnalyzer::joinKnowledgeHelper(std::__1::unordered_map<solidity::yul::YulString, solidity::yul::YulString, std::__1::hash<solidity::yul::YulString>, std::__1::equal_to<solidity::yul::YulString>, std::__1::allocator<std::__1::pair<solidity::yul::YulString const, solidity::yul::YulString> > >&, std::__1::unordered_map<solidity::yul::YulString, solidity::yul::YulString, std::__1::hash<solidity::yul::YulString>, std::__1::equal_to<solidity::yul::YulString>, std::__1::allocator<std::__1::pair<solidity::yul::YulString const, solidity::yul::YulString> > > const&)::$_6> >(std::__1::unordered_map<solidity::yul::YulString, solidity::yul::YulString, std::__1::hash<solidity::yul::YulString>, std::__1::equal_to<solidity::yul::YulString>, std::__1::allocator<std::__1::pair<solidity::yul::YulString const, solidity::yul::YulString> > >&, solidity::util::detail::MapTuple<solidity::yul::DataFlowAnalyzer::joinKnowledgeHelper(std::__1::unordered_map<solidity::yul::YulString, solidity::yul::YulString, std::__1::hash<solidity::yul::YulString>, std::__1::equal_to<solidity::yul::YulString>, std::__1::allocator<std::__1::pair<solidity::yul::YulString const, solidity::yul::YulString> > >&, std::__1::unordered_map<solidity::yul::YulString, solidity::yul::YulString, std::__1::hash<solidity::yul::YulString>, std::__1::equal_to<solidity::yul::YulString>, std::__1::allocator<std::__1::pair<solidity::yul::YulString const, solidity::yul::YulString> > > const&)::$_6>) Line | Count | Source | 42 | 478k | { | 43 | 478k | auto old_size = _c.size(); | 44 | 538k | for (auto i = _c.begin(), last = _c.end(); i != last;) | 45 | 59.5k | if (_pred(*i)) | 46 | 8.18k | i = _c.erase(i); | 47 | 51.4k | else | 48 | 51.4k | ++i; | 49 | 478k | return old_size - _c.size(); | 50 | 478k | } |
|
51 | | |
52 | | // Taken from https://en.cppreference.com/w/cpp/container/vector/erase2 |
53 | | template<class T, class Alloc, class Pred> |
54 | | constexpr typename std::vector<T, Alloc>::size_type |
55 | | erase_if(std::vector<T, Alloc>& c, Pred pred) |
56 | 294k | { |
57 | 294k | auto it = std::remove_if(c.begin(), c.end(), pred); |
58 | 294k | auto r = std::distance(it, c.end()); |
59 | 294k | c.erase(it, c.end()); |
60 | 294k | return static_cast<typename std::vector<T, Alloc>::size_type>(r); |
61 | 294k | } StackLayoutGenerator.cpp:std::__1::vector<std::__1::variant<solidity::yul::FunctionCallReturnLabelSlot, solidity::yul::FunctionReturnLabelSlot, solidity::yul::VariableSlot, solidity::yul::LiteralSlot, solidity::yul::TemporarySlot, solidity::yul::JunkSlot>, std::__1::allocator<std::__1::variant<solidity::yul::FunctionCallReturnLabelSlot, solidity::yul::FunctionReturnLabelSlot, solidity::yul::VariableSlot, solidity::yul::LiteralSlot, solidity::yul::TemporarySlot, solidity::yul::JunkSlot> > >::size_type solidity::cxx20::erase_if<std::__1::variant<solidity::yul::FunctionCallReturnLabelSlot, solidity::yul::FunctionReturnLabelSlot, solidity::yul::VariableSlot, solidity::yul::LiteralSlot, solidity::yul::TemporarySlot, solidity::yul::JunkSlot>, std::__1::allocator<std::__1::variant<solidity::yul::FunctionCallReturnLabelSlot, solidity::yul::FunctionReturnLabelSlot, solidity::yul::VariableSlot, solidity::yul::LiteralSlot, solidity::yul::TemporarySlot, solidity::yul::JunkSlot> >, solidity::yul::StackLayoutGenerator::combineStack(std::__1::vector<std::__1::variant<solidity::yul::FunctionCallReturnLabelSlot, solidity::yul::FunctionReturnLabelSlot, solidity::yul::VariableSlot, solidity::yul::LiteralSlot, solidity::yul::TemporarySlot, solidity::yul::JunkSlot>, std::__1::allocator<std::__1::variant<solidity::yul::FunctionCallReturnLabelSlot, solidity::yul::FunctionReturnLabelSlot, solidity::yul::VariableSlot, solidity::yul::LiteralSlot, solidity::yul::TemporarySlot, solidity::yul::JunkSlot> > > const&, std::__1::vector<std::__1::variant<solidity::yul::FunctionCallReturnLabelSlot, solidity::yul::FunctionReturnLabelSlot, solidity::yul::VariableSlot, solidity::yul::LiteralSlot, solidity::yul::TemporarySlot, solidity::yul::JunkSlot>, std::__1::allocator<std::__1::variant<solidity::yul::FunctionCallReturnLabelSlot, solidity::yul::FunctionReturnLabelSlot, solidity::yul::VariableSlot, solidity::yul::LiteralSlot, solidity::yul::TemporarySlot, solidity::yul::JunkSlot> > > const&)::$_12>(std::__1::vector<std::__1::variant<solidity::yul::FunctionCallReturnLabelSlot, solidity::yul::FunctionReturnLabelSlot, solidity::yul::VariableSlot, solidity::yul::LiteralSlot, solidity::yul::TemporarySlot, solidity::yul::JunkSlot>, std::__1::allocator<std::__1::variant<solidity::yul::FunctionCallReturnLabelSlot, solidity::yul::FunctionReturnLabelSlot, solidity::yul::VariableSlot, solidity::yul::LiteralSlot, solidity::yul::TemporarySlot, solidity::yul::JunkSlot> > >&, solidity::yul::StackLayoutGenerator::combineStack(std::__1::vector<std::__1::variant<solidity::yul::FunctionCallReturnLabelSlot, solidity::yul::FunctionReturnLabelSlot, solidity::yul::VariableSlot, solidity::yul::LiteralSlot, solidity::yul::TemporarySlot, solidity::yul::JunkSlot>, std::__1::allocator<std::__1::variant<solidity::yul::FunctionCallReturnLabelSlot, solidity::yul::FunctionReturnLabelSlot, solidity::yul::VariableSlot, solidity::yul::LiteralSlot, solidity::yul::TemporarySlot, solidity::yul::JunkSlot> > > const&, std::__1::vector<std::__1::variant<solidity::yul::FunctionCallReturnLabelSlot, solidity::yul::FunctionReturnLabelSlot, solidity::yul::VariableSlot, solidity::yul::LiteralSlot, solidity::yul::TemporarySlot, solidity::yul::JunkSlot>, std::__1::allocator<std::__1::variant<solidity::yul::FunctionCallReturnLabelSlot, solidity::yul::FunctionReturnLabelSlot, solidity::yul::VariableSlot, solidity::yul::LiteralSlot, solidity::yul::TemporarySlot, solidity::yul::JunkSlot> > > const&)::$_12) Line | Count | Source | 56 | 70.0k | { | 57 | 70.0k | auto it = std::remove_if(c.begin(), c.end(), pred); | 58 | 70.0k | auto r = std::distance(it, c.end()); | 59 | 70.0k | c.erase(it, c.end()); | 60 | 70.0k | return static_cast<typename std::vector<T, Alloc>::size_type>(r); | 61 | 70.0k | } |
ControlFlowGraphBuilder.cpp:std::__1::vector<solidity::yul::CFG::BasicBlock*, std::__1::allocator<solidity::yul::CFG::BasicBlock*> >::size_type solidity::cxx20::erase_if<solidity::yul::CFG::BasicBlock*, std::__1::allocator<solidity::yul::CFG::BasicBlock*>, (anonymous namespace)::cleanUnreachable(solidity::yul::CFG&)::$_0>(std::__1::vector<solidity::yul::CFG::BasicBlock*, std::__1::allocator<solidity::yul::CFG::BasicBlock*> >&, (anonymous namespace)::cleanUnreachable(solidity::yul::CFG&)::$_0) Line | Count | Source | 56 | 223k | { | 57 | 223k | auto it = std::remove_if(c.begin(), c.end(), pred); | 58 | 223k | auto r = std::distance(it, c.end()); | 59 | 223k | c.erase(it, c.end()); | 60 | 223k | return static_cast<typename std::vector<T, Alloc>::size_type>(r); | 61 | 223k | } |
|
62 | | |
63 | | } |