1*7e16571eSAdrian Vogelsgesang #include <algorithm> 2*7e16571eSAdrian Vogelsgesang #include <functional> 3*7e16571eSAdrian Vogelsgesang #include <map> 4*7e16571eSAdrian Vogelsgesang #include <ranges> 5*7e16571eSAdrian Vogelsgesang #include <vector> 6*7e16571eSAdrian Vogelsgesang 7*7e16571eSAdrian Vogelsgesang bool sort_less(int a, int b) { 8*7e16571eSAdrian Vogelsgesang __builtin_printf("break here"); 9*7e16571eSAdrian Vogelsgesang return a < b; 10*7e16571eSAdrian Vogelsgesang } 11*7e16571eSAdrian Vogelsgesang 12*7e16571eSAdrian Vogelsgesang bool ranges_sort_less(int a, int b) { 13*7e16571eSAdrian Vogelsgesang __builtin_printf("break here"); 14*7e16571eSAdrian Vogelsgesang return a < b; 15*7e16571eSAdrian Vogelsgesang } 16*7e16571eSAdrian Vogelsgesang 17*7e16571eSAdrian Vogelsgesang int view_transform(int a) { 18*7e16571eSAdrian Vogelsgesang __builtin_printf("break here"); 19*7e16571eSAdrian Vogelsgesang return a * a; 20*7e16571eSAdrian Vogelsgesang } 21*7e16571eSAdrian Vogelsgesang 22*7e16571eSAdrian Vogelsgesang void test_algorithms() { 23*7e16571eSAdrian Vogelsgesang std::vector<int> vec{8, 1, 3, 2}; 24*7e16571eSAdrian Vogelsgesang 25*7e16571eSAdrian Vogelsgesang // The internal frames for `std::sort` should be hidden 26*7e16571eSAdrian Vogelsgesang std::sort(vec.begin(), vec.end(), sort_less); 27*7e16571eSAdrian Vogelsgesang 28*7e16571eSAdrian Vogelsgesang // The internal frames for `ranges::sort` should be hidden 29*7e16571eSAdrian Vogelsgesang std::ranges::sort(vec.begin(), vec.end(), ranges_sort_less); 30*7e16571eSAdrian Vogelsgesang 31*7e16571eSAdrian Vogelsgesang // Same for views 32*7e16571eSAdrian Vogelsgesang for (auto x : vec | std::ranges::views::transform(view_transform)) { 33*7e16571eSAdrian Vogelsgesang // no-op 34*7e16571eSAdrian Vogelsgesang } 35*7e16571eSAdrian Vogelsgesang } 36*7e16571eSAdrian Vogelsgesang 37*7e16571eSAdrian Vogelsgesang void consume_number(int i) { __builtin_printf("break here"); } 38*7e16571eSAdrian Vogelsgesang 39*7e16571eSAdrian Vogelsgesang int invoke_add(int i, int j) { 40*7e16571eSAdrian Vogelsgesang __builtin_printf("break here"); 41*7e16571eSAdrian Vogelsgesang return i + j; 42*7e16571eSAdrian Vogelsgesang } 43*7e16571eSAdrian Vogelsgesang 44*7e16571eSAdrian Vogelsgesang struct Callable { 45*7e16571eSAdrian Vogelsgesang Callable(int num) : num_(num) {} 46*7e16571eSAdrian Vogelsgesang void operator()(int i) const { __builtin_printf("break here"); } 47*7e16571eSAdrian Vogelsgesang void member_function(int i) const { __builtin_printf("break here"); } 48*7e16571eSAdrian Vogelsgesang int num_; 49*7e16571eSAdrian Vogelsgesang }; 50*7e16571eSAdrian Vogelsgesang 51*7e16571eSAdrian Vogelsgesang void test_invoke() { 52*7e16571eSAdrian Vogelsgesang // Invoke a void-returning function 53*7e16571eSAdrian Vogelsgesang std::invoke(consume_number, -9); 54*7e16571eSAdrian Vogelsgesang 55*7e16571eSAdrian Vogelsgesang // Invoke a non-void-returning function 56*7e16571eSAdrian Vogelsgesang std::invoke(invoke_add, 1, 10); 57*7e16571eSAdrian Vogelsgesang 58*7e16571eSAdrian Vogelsgesang // Invoke a member function 59*7e16571eSAdrian Vogelsgesang const Callable foo(314159); 60*7e16571eSAdrian Vogelsgesang std::invoke(&Callable::member_function, foo, 1); 61*7e16571eSAdrian Vogelsgesang 62*7e16571eSAdrian Vogelsgesang // Invoke a function object 63*7e16571eSAdrian Vogelsgesang std::invoke(Callable(12), 18); 64*7e16571eSAdrian Vogelsgesang } 65*7e16571eSAdrian Vogelsgesang 66*7e16571eSAdrian Vogelsgesang struct MyKey { 67*7e16571eSAdrian Vogelsgesang int x; 68*7e16571eSAdrian Vogelsgesang bool operator==(const MyKey &) const = default; 69*7e16571eSAdrian Vogelsgesang bool operator<(const MyKey &other) const { 70*7e16571eSAdrian Vogelsgesang __builtin_printf("break here"); 71*7e16571eSAdrian Vogelsgesang return x < other.x; 72*7e16571eSAdrian Vogelsgesang } 73*7e16571eSAdrian Vogelsgesang }; 74*7e16571eSAdrian Vogelsgesang 75*7e16571eSAdrian Vogelsgesang void test_containers() { 76*7e16571eSAdrian Vogelsgesang std::map<MyKey, int> map; 77*7e16571eSAdrian Vogelsgesang map.emplace(MyKey{1}, 2); 78*7e16571eSAdrian Vogelsgesang map.emplace(MyKey{2}, 3); 79*7e16571eSAdrian Vogelsgesang } 80*7e16571eSAdrian Vogelsgesang 81*7e16571eSAdrian Vogelsgesang int main() { 82*7e16571eSAdrian Vogelsgesang test_algorithms(); 83*7e16571eSAdrian Vogelsgesang test_invoke(); 84*7e16571eSAdrian Vogelsgesang test_containers(); 85*7e16571eSAdrian Vogelsgesang return 0; 86*7e16571eSAdrian Vogelsgesang } 87