| #include <algorithm> | |
| #include <functional> | |
| #include <map> | |
| #include <ranges> | |
| #include <vector> | |
| bool sort_less(int a, int b) { | |
| __builtin_printf("break here"); | |
| return a < b; | |
| } | |
| bool ranges_sort_less(int a, int b) { | |
| __builtin_printf("break here"); | |
| return a < b; | |
| } | |
| int view_transform(int a) { | |
| __builtin_printf("break here"); | |
| return a * a; | |
| } | |
| void test_algorithms() { | |
| std::vector<int> vec{8, 1, 3, 2}; | |
| // The internal frames for `std::sort` should be hidden | |
| std::sort(vec.begin(), vec.end(), sort_less); | |
| // The internal frames for `ranges::sort` should be hidden | |
| std::ranges::sort(vec.begin(), vec.end(), ranges_sort_less); | |
| // Same for views | |
| for (auto x : vec | std::ranges::views::transform(view_transform)) { | |
| // no-op | |
| } | |
| } | |
| void consume_number(int i) { __builtin_printf("break here"); } | |
| int invoke_add(int i, int j) { | |
| __builtin_printf("break here"); | |
| return i + j; | |
| } | |
| struct Callable { | |
| Callable(int num) : num_(num) {} | |
| void operator()(int i) const { __builtin_printf("break here"); } | |
| void member_function(int i) const { __builtin_printf("break here"); } | |
| int num_; | |
| }; | |
| void test_invoke() { | |
| // Invoke a void-returning function | |
| std::invoke(consume_number, -9); | |
| // Invoke a non-void-returning function | |
| std::invoke(invoke_add, 1, 10); | |
| // Invoke a member function | |
| const Callable foo(314159); | |
| std::invoke(&Callable::member_function, foo, 1); | |
| // Invoke a function object | |
| std::invoke(Callable(12), 18); | |
| } | |
| struct MyKey { | |
| int x; | |
| bool operator==(const MyKey &) const = default; | |
| bool operator<(const MyKey &other) const { | |
| __builtin_printf("break here"); | |
| return x < other.x; | |
| } | |
| }; | |
| void test_containers() { | |
| std::map<MyKey, int> map; | |
| map.emplace(MyKey{1}, 2); | |
| map.emplace(MyKey{2}, 3); | |
| } | |
| int main() { | |
| test_algorithms(); | |
| test_invoke(); | |
| test_containers(); | |
| return 0; | |
| } |