1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // UNSUPPORTED: c++03, c++11 10 11 // <algorithm> 12 13 // template<class Iter> 14 // void make_heap(Iter first, Iter last); 15 16 #include <algorithm> 17 #include <cassert> 18 #include <random> 19 20 #include "test_macros.h" 21 22 struct Stats { 23 int compared = 0; 24 int copied = 0; 25 int moved = 0; 26 } stats; 27 28 struct MyInt { 29 int value; MyIntMyInt30 explicit MyInt(int xval) : value(xval) {} MyIntMyInt31 MyInt(const MyInt& other) : value(other.value) { ++stats.copied; } MyIntMyInt32 MyInt(MyInt&& other) : value(other.value) { ++stats.moved; } operator =MyInt33 MyInt& operator=(const MyInt& other) { 34 value = other.value; 35 ++stats.copied; 36 return *this; 37 } operator =MyInt38 MyInt& operator=(MyInt&& other) { 39 value = other.value; 40 ++stats.moved; 41 return *this; 42 } operator <(const MyInt & a,const MyInt & b)43 friend bool operator<(const MyInt& a, const MyInt& b) { 44 ++stats.compared; 45 return a.value < b.value; 46 } 47 }; 48 main(int,char **)49 int main(int, char**) 50 { 51 const int N = 100'000; 52 std::vector<MyInt> v; 53 v.reserve(N); 54 std::mt19937 g; 55 for (int i = 0; i < N; ++i) 56 v.emplace_back(g()); 57 58 // The exact stats of our current implementation are recorded here. 59 // If something changes to make them go a bit up or down, that's probably fine, 60 // and we can just update this test. 61 // But if they suddenly leap upward, that's a bad thing. 62 63 stats = {}; 64 std::make_heap(v.begin(), v.end()); 65 assert(stats.copied == 0); 66 assert(stats.moved == 153'486); 67 #if _LIBCPP_HARDENING_MODE != _LIBCPP_HARDENING_MODE_DEBUG 68 assert(stats.compared == 188'285); 69 #endif 70 71 assert(std::is_heap(v.begin(), v.end())); 72 73 return 0; 74 } 75