Toplevel entrypoints for classes/traits/interfaces
[hiphop-php.git] / hphp / util / algorithm.h
blob93def599f73d28b9c9b92bb171e0c292bf524823
1 /*
2 +----------------------------------------------------------------------+
3 | HipHop for PHP |
4 +----------------------------------------------------------------------+
5 | Copyright (c) 2010-present Facebook, Inc. (http://www.facebook.com) |
6 +----------------------------------------------------------------------+
7 | This source file is subject to version 3.01 of the PHP license, |
8 | that is bundled with this package in the file LICENSE, and is |
9 | available through the world-wide-web at the following url: |
10 | http://www.php.net/license/3_01.txt |
11 | If you did not receive a copy of the PHP license and are unable to |
12 | obtain it through the world-wide-web, please send a note to |
13 | license@php.net so we can mail you a copy immediately. |
14 +----------------------------------------------------------------------+
17 #pragma once
19 #include <algorithm>
20 #include <iterator>
21 #include <vector>
23 namespace HPHP {
25 ///////////////////////////////////////////////////////////////////////////////
27 * Like <algorithm>, but jankier.
30 ///////////////////////////////////////////////////////////////////////////////
33 * Sort the keys of a container by its values.
35 template<class T, class Compare>
36 std::vector<size_t>
37 sort_keys_by_value(const std::vector<T>& input, Compare compare) {
38 auto result = std::vector<size_t>{};
39 result.reserve(input.size());
40 for (auto i = 0; i < input.size(); ++i) result.emplace_back(i);
42 std::sort(
43 std::begin(result), std::end(result),
44 [&] (size_t a, size_t b) { return compare(input[a], input[b]); }
46 return result;
49 template<class Container, class Compare>
50 std::vector<typename Container::key_type>
51 sort_keys_by_value(const Container& input, Compare compare) {
52 using key_type = typename Container::key_type;
54 auto result = std::vector<key_type>{};
55 result.reserve(input.size());
56 for (auto const& kv : input) result.emplace_back(kv.first);
58 std::sort(
59 std::begin(result), std::end(result),
60 [&] (const key_type& a, const key_type& b) {
61 return compare(input.at(a), input.at(b));
64 return result;
67 ///////////////////////////////////////////////////////////////////////////////