Coverage Report

Created: 2022-08-24 06:39

/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
}