1551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer//===- llvm/ADT/STLExtras.h - Useful STL related functions ------*- C++ -*-===// 29769ab22265b313171d201b5928688524a01bd87Misha Brukman// 3b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell// The LLVM Compiler Infrastructure 4b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 79769ab22265b313171d201b5928688524a01bd87Misha Brukman// 8b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell//===----------------------------------------------------------------------===// 918d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner// 1018d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner// This file contains some templates that are useful if you are working with the 1118d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner// STL at all. 1218d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner// 13ccc776fd83b4d200f54cd84af71888e9a740f8fdNick Lewycky// No library is required when using these functions. 1418d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner// 1518d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner//===----------------------------------------------------------------------===// 1618d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner 17551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#ifndef LLVM_ADT_STLEXTRAS_H 18551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#define LLVM_ADT_STLEXTRAS_H 1918d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/Compiler.h" 21a2769a33c94f021a609a462b28ebea069eba6f74Misha Brukman#include <cstddef> // for std::size_t 2290c583fff0535d441717425ad4428d85eb2a00a9Benjamin Kramer#include <cstdlib> // for qsort 2318d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner#include <functional> 24f0891be8bdbeeadb39da5575273b6645755fa383Gabor Greif#include <iterator> 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include <memory> 269bb2188b0e196d2724e128152ef4d4b581adf3bcBrian Gaeke#include <utility> // for std::pair 2718d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner 28d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 29d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 3018d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner//===----------------------------------------------------------------------===// 3142e018c8057effef5ed1494b999052981d8cf195Chris Lattner// Extra additions to <functional> 3242e018c8057effef5ed1494b999052981d8cf195Chris Lattner//===----------------------------------------------------------------------===// 3342e018c8057effef5ed1494b999052981d8cf195Chris Lattner 347b32639362c4cbb438d71492897d9f84c89d9e57Alkis Evlogimenostemplate<class Ty> 35c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Trickstruct identity : public std::unary_function<Ty, Ty> { 36c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Trick Ty &operator()(Ty &self) const { 37c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Trick return self; 38c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Trick } 39c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Trick const Ty &operator()(const Ty &self) const { 40c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Trick return self; 41c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Trick } 42c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Trick}; 43c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Trick 44c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Tricktemplate<class Ty> 45094da67bd781708e76ab37c76e7a87d86404be05Daniel Dunbarstruct less_ptr : public std::binary_function<Ty, Ty, bool> { 46094da67bd781708e76ab37c76e7a87d86404be05Daniel Dunbar bool operator()(const Ty* left, const Ty* right) const { 47094da67bd781708e76ab37c76e7a87d86404be05Daniel Dunbar return *left < *right; 48094da67bd781708e76ab37c76e7a87d86404be05Daniel Dunbar } 49094da67bd781708e76ab37c76e7a87d86404be05Daniel Dunbar}; 50094da67bd781708e76ab37c76e7a87d86404be05Daniel Dunbar 51094da67bd781708e76ab37c76e7a87d86404be05Daniel Dunbartemplate<class Ty> 527b32639362c4cbb438d71492897d9f84c89d9e57Alkis Evlogimenosstruct greater_ptr : public std::binary_function<Ty, Ty, bool> { 537b32639362c4cbb438d71492897d9f84c89d9e57Alkis Evlogimenos bool operator()(const Ty* left, const Ty* right) const { 547b32639362c4cbb438d71492897d9f84c89d9e57Alkis Evlogimenos return *right < *left; 557b32639362c4cbb438d71492897d9f84c89d9e57Alkis Evlogimenos } 567b32639362c4cbb438d71492897d9f84c89d9e57Alkis Evlogimenos}; 577b32639362c4cbb438d71492897d9f84c89d9e57Alkis Evlogimenos 58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// An efficient, type-erasing, non-owning reference to a callable. This is 59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// intended for use as the type of a function parameter that is not used 60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// after the function in question returns. 61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// 62dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// This class does not own the callable, so it is not in general safe to store 63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// a function_ref. 64dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinestemplate<typename Fn> class function_ref; 65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 66dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#if LLVM_HAS_VARIADIC_TEMPLATES 67dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 68dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinestemplate<typename Ret, typename ...Params> 69dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass function_ref<Ret(Params...)> { 70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Ret (*callback)(intptr_t callable, Params ...params); 71dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines intptr_t callable; 72dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 73dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines template<typename Callable> 74dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines static Ret callback_fn(intptr_t callable, Params ...params) { 75dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return (*reinterpret_cast<Callable*>(callable))( 76dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::forward<Params>(params)...); 77dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 78dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 79dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinespublic: 80dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines template<typename Callable> 81dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines function_ref(Callable &&callable) 82dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : callback(callback_fn<typename std::remove_reference<Callable>::type>), 83dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines callable(reinterpret_cast<intptr_t>(&callable)) {} 84dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Ret operator()(Params ...params) const { 85dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return callback(callable, std::forward<Params>(params)...); 86dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 87dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}; 88dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 89dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#else 90dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 91dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinestemplate<typename Ret> 92dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass function_ref<Ret()> { 93dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Ret (*callback)(intptr_t callable); 94dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines intptr_t callable; 95dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 96dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines template<typename Callable> 97dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines static Ret callback_fn(intptr_t callable) { 98dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return (*reinterpret_cast<Callable*>(callable))(); 99dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 101dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinespublic: 102dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines template<typename Callable> 103dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines function_ref(Callable &&callable) 104dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : callback(callback_fn<typename std::remove_reference<Callable>::type>), 105dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines callable(reinterpret_cast<intptr_t>(&callable)) {} 106dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Ret operator()() const { return callback(callable); } 107dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}; 108dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 109dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinestemplate<typename Ret, typename Param1> 110dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass function_ref<Ret(Param1)> { 111dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Ret (*callback)(intptr_t callable, Param1 param1); 112dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines intptr_t callable; 113dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 114dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines template<typename Callable> 115dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines static Ret callback_fn(intptr_t callable, Param1 param1) { 116dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return (*reinterpret_cast<Callable*>(callable))( 117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::forward<Param1>(param1)); 118dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 119dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 120dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinespublic: 121dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines template<typename Callable> 122dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines function_ref(Callable &&callable) 123dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : callback(callback_fn<typename std::remove_reference<Callable>::type>), 124dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines callable(reinterpret_cast<intptr_t>(&callable)) {} 125dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Ret operator()(Param1 param1) { 126dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return callback(callable, std::forward<Param1>(param1)); 127dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 128dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}; 129dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 130dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinestemplate<typename Ret, typename Param1, typename Param2> 131dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass function_ref<Ret(Param1, Param2)> { 132dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Ret (*callback)(intptr_t callable, Param1 param1, Param2 param2); 133dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines intptr_t callable; 134dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 135dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines template<typename Callable> 136dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines static Ret callback_fn(intptr_t callable, Param1 param1, Param2 param2) { 137dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return (*reinterpret_cast<Callable*>(callable))( 138dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::forward<Param1>(param1), 139dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::forward<Param2>(param2)); 140dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 141dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 142dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinespublic: 143dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines template<typename Callable> 144dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines function_ref(Callable &&callable) 145dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : callback(callback_fn<typename std::remove_reference<Callable>::type>), 146dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines callable(reinterpret_cast<intptr_t>(&callable)) {} 147dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Ret operator()(Param1 param1, Param2 param2) { 148dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return callback(callable, 149dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::forward<Param1>(param1), 150dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::forward<Param2>(param2)); 151dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 152dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}; 153dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 154dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinestemplate<typename Ret, typename Param1, typename Param2, typename Param3> 155dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass function_ref<Ret(Param1, Param2, Param3)> { 156dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Ret (*callback)(intptr_t callable, Param1 param1, Param2 param2, Param3 param3); 157dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines intptr_t callable; 158dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 159dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines template<typename Callable> 160dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines static Ret callback_fn(intptr_t callable, Param1 param1, Param2 param2, 161dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Param3 param3) { 162dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return (*reinterpret_cast<Callable*>(callable))( 163dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::forward<Param1>(param1), 164dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::forward<Param2>(param2), 165dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::forward<Param3>(param3)); 166dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 167dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 168dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinespublic: 169dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines template<typename Callable> 170dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines function_ref(Callable &&callable) 171dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : callback(callback_fn<typename std::remove_reference<Callable>::type>), 172dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines callable(reinterpret_cast<intptr_t>(&callable)) {} 173dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Ret operator()(Param1 param1, Param2 param2, Param3 param3) { 174dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return callback(callable, 175dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::forward<Param1>(param1), 176dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::forward<Param2>(param2), 177dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::forward<Param3>(param3)); 178dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 179dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}; 180dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 181dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#endif 182dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 183577b15f70e3a1461033858e357f8ed3e10705c21Chris Lattner// deleter - Very very very simple method that is used to invoke operator 1849769ab22265b313171d201b5928688524a01bd87Misha Brukman// delete on something. It is used like this: 185577b15f70e3a1461033858e357f8ed3e10705c21Chris Lattner// 186876509614b608f1af885d978c7d2a1e34f807e33Chris Lattner// for_each(V.begin(), B.end(), deleter<Interval>); 187577b15f70e3a1461033858e357f8ed3e10705c21Chris Lattner// 1889769ab22265b313171d201b5928688524a01bd87Misha Brukmantemplate <class T> 189305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruthinline void deleter(T *Ptr) { 1909769ab22265b313171d201b5928688524a01bd87Misha Brukman delete Ptr; 191577b15f70e3a1461033858e357f8ed3e10705c21Chris Lattner} 192577b15f70e3a1461033858e357f8ed3e10705c21Chris Lattner 193577b15f70e3a1461033858e357f8ed3e10705c21Chris Lattner 194577b15f70e3a1461033858e357f8ed3e10705c21Chris Lattner 19542e018c8057effef5ed1494b999052981d8cf195Chris Lattner//===----------------------------------------------------------------------===// 19618d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner// Extra additions to <iterator> 19718d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner//===----------------------------------------------------------------------===// 19818d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner 19918d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner// mapped_iterator - This is a simple iterator adapter that causes a function to 20018d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner// be dereferenced whenever operator* is invoked on the iterator. 20118d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner// 20218d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattnertemplate <class RootIt, class UnaryFunc> 20318d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattnerclass mapped_iterator { 20418d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner RootIt current; 205643afb3b01318f9ce20558ffef374b377b1f1df7Chris Lattner UnaryFunc Fn; 20618d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattnerpublic: 207697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner typedef typename std::iterator_traits<RootIt>::iterator_category 20818d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner iterator_category; 209697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner typedef typename std::iterator_traits<RootIt>::difference_type 21018d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner difference_type; 21118d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner typedef typename UnaryFunc::result_type value_type; 212d063725c3c6e36b711106f06e0cab11a1283f349Chris Lattner 213d063725c3c6e36b711106f06e0cab11a1283f349Chris Lattner typedef void pointer; 214d063725c3c6e36b711106f06e0cab11a1283f349Chris Lattner //typedef typename UnaryFunc::result_type *pointer; 21518d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner typedef void reference; // Can't modify value returned by fn 21618d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner 21718d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner typedef RootIt iterator_type; 21818d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner typedef mapped_iterator<RootIt, UnaryFunc> _Self; 21918d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner 22082493289e0234e0172313e845fb87306cf3687acChris Lattner inline const RootIt &getCurrent() const { return current; } 2213d4227bec59358199c7d53fad8f03fd075723fcfDan Gohman inline const UnaryFunc &getFunc() const { return Fn; } 22218d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner 223643afb3b01318f9ce20558ffef374b377b1f1df7Chris Lattner inline explicit mapped_iterator(const RootIt &I, UnaryFunc F) 224643afb3b01318f9ce20558ffef374b377b1f1df7Chris Lattner : current(I), Fn(F) {} 22518d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner 2269769ab22265b313171d201b5928688524a01bd87Misha Brukman inline value_type operator*() const { // All this work to do this 227643afb3b01318f9ce20558ffef374b377b1f1df7Chris Lattner return Fn(*current); // little change 22818d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner } 22918d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner 23018d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner _Self& operator++() { ++current; return *this; } 23118d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner _Self& operator--() { --current; return *this; } 23218d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner _Self operator++(int) { _Self __tmp = *this; ++current; return __tmp; } 23318d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner _Self operator--(int) { _Self __tmp = *this; --current; return __tmp; } 2343d4227bec59358199c7d53fad8f03fd075723fcfDan Gohman _Self operator+ (difference_type n) const { 2353d4227bec59358199c7d53fad8f03fd075723fcfDan Gohman return _Self(current + n, Fn); 2363d4227bec59358199c7d53fad8f03fd075723fcfDan Gohman } 23718d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner _Self& operator+= (difference_type n) { current += n; return *this; } 2383d4227bec59358199c7d53fad8f03fd075723fcfDan Gohman _Self operator- (difference_type n) const { 2393d4227bec59358199c7d53fad8f03fd075723fcfDan Gohman return _Self(current - n, Fn); 2403d4227bec59358199c7d53fad8f03fd075723fcfDan Gohman } 24118d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner _Self& operator-= (difference_type n) { current -= n; return *this; } 2429769ab22265b313171d201b5928688524a01bd87Misha Brukman reference operator[](difference_type n) const { return *(*this + n); } 24318d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner 244697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner inline bool operator!=(const _Self &X) const { return !operator==(X); } 24518d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner inline bool operator==(const _Self &X) const { return current == X.current; } 24618d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner inline bool operator< (const _Self &X) const { return current < X.current; } 24718d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner 24818d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner inline difference_type operator-(const _Self &X) const { 24918d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner return current - X.current; 25018d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner } 25118d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner}; 25218d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner 25318d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattnertemplate <class _Iterator, class Func> 2549769ab22265b313171d201b5928688524a01bd87Misha Brukmaninline mapped_iterator<_Iterator, Func> 25518d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattneroperator+(typename mapped_iterator<_Iterator, Func>::difference_type N, 25618d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner const mapped_iterator<_Iterator, Func>& X) { 2573d4227bec59358199c7d53fad8f03fd075723fcfDan Gohman return mapped_iterator<_Iterator, Func>(X.getCurrent() - N, X.getFunc()); 25818d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner} 25918d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner 26018d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner 26118d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner// map_iterator - Provide a convenient way to create mapped_iterators, just like 26218d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner// make_pair is useful for creating pairs... 26318d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner// 26418d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattnertemplate <class ItTy, class FuncTy> 26518d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattnerinline mapped_iterator<ItTy, FuncTy> map_iterator(const ItTy &I, FuncTy F) { 266643afb3b01318f9ce20558ffef374b377b1f1df7Chris Lattner return mapped_iterator<ItTy, FuncTy>(I, F); 26718d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner} 26818d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner 269e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos//===----------------------------------------------------------------------===// 270e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos// Extra additions to <utility> 271e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos//===----------------------------------------------------------------------===// 272e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos 2730b6962f4be35aca7054ff68ef9bbbb2e03617d31Benjamin Kramer/// \brief Function object to check whether the first component of a std::pair 2740b6962f4be35aca7054ff68ef9bbbb2e03617d31Benjamin Kramer/// compares less than the first component of another std::pair. 2750b6962f4be35aca7054ff68ef9bbbb2e03617d31Benjamin Kramerstruct less_first { 2760b6962f4be35aca7054ff68ef9bbbb2e03617d31Benjamin Kramer template <typename T> bool operator()(const T &lhs, const T &rhs) const { 2770b6962f4be35aca7054ff68ef9bbbb2e03617d31Benjamin Kramer return lhs.first < rhs.first; 2780b6962f4be35aca7054ff68ef9bbbb2e03617d31Benjamin Kramer } 2790b6962f4be35aca7054ff68ef9bbbb2e03617d31Benjamin Kramer}; 2800b6962f4be35aca7054ff68ef9bbbb2e03617d31Benjamin Kramer 2810b6962f4be35aca7054ff68ef9bbbb2e03617d31Benjamin Kramer/// \brief Function object to check whether the second component of a std::pair 2820b6962f4be35aca7054ff68ef9bbbb2e03617d31Benjamin Kramer/// compares less than the second component of another std::pair. 2830b6962f4be35aca7054ff68ef9bbbb2e03617d31Benjamin Kramerstruct less_second { 2840b6962f4be35aca7054ff68ef9bbbb2e03617d31Benjamin Kramer template <typename T> bool operator()(const T &lhs, const T &rhs) const { 2850b6962f4be35aca7054ff68ef9bbbb2e03617d31Benjamin Kramer return lhs.second < rhs.second; 2860b6962f4be35aca7054ff68ef9bbbb2e03617d31Benjamin Kramer } 2870b6962f4be35aca7054ff68ef9bbbb2e03617d31Benjamin Kramer}; 2880b6962f4be35aca7054ff68ef9bbbb2e03617d31Benjamin Kramer 289718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson//===----------------------------------------------------------------------===// 29099d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner// Extra additions for arrays 291718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson//===----------------------------------------------------------------------===// 292718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson 293718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson/// Find the length of an array. 294dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinestemplate <class T, std::size_t N> 295dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesLLVM_CONSTEXPR inline size_t array_lengthof(T (&)[N]) { 296718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson return N; 297718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson} 298718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson 299dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// Adapt std::less<T> for array_pod_sort. 300545fc87454aabbc8ef8720811ab5dbd5588b537bChris Lattnertemplate<typename T> 301305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruthinline int array_pod_sort_comparator(const void *P1, const void *P2) { 302dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (std::less<T>()(*reinterpret_cast<const T*>(P1), 303dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines *reinterpret_cast<const T*>(P2))) 304545fc87454aabbc8ef8720811ab5dbd5588b537bChris Lattner return -1; 305dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (std::less<T>()(*reinterpret_cast<const T*>(P2), 306dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines *reinterpret_cast<const T*>(P1))) 307545fc87454aabbc8ef8720811ab5dbd5588b537bChris Lattner return 1; 308545fc87454aabbc8ef8720811ab5dbd5588b537bChris Lattner return 0; 30999d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner} 3103a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman 311d5227545359a4816e52fd100b225ae140ec9b03aAndrew Trick/// get_array_pod_sort_comparator - This is an internal helper function used to 312c65fc3bd27a84281da9819b5fe89a01535a14ecfChris Lattner/// get type deduction of T right. 313c65fc3bd27a84281da9819b5fe89a01535a14ecfChris Lattnertemplate<typename T> 314d5227545359a4816e52fd100b225ae140ec9b03aAndrew Trickinline int (*get_array_pod_sort_comparator(const T &)) 315c65fc3bd27a84281da9819b5fe89a01535a14ecfChris Lattner (const void*, const void*) { 316c65fc3bd27a84281da9819b5fe89a01535a14ecfChris Lattner return array_pod_sort_comparator<T>; 317c65fc3bd27a84281da9819b5fe89a01535a14ecfChris Lattner} 318c65fc3bd27a84281da9819b5fe89a01535a14ecfChris Lattner 31999d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner 32099d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// array_pod_sort - This sorts an array with the specified start and end 32199d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// extent. This is just like std::sort, except that it calls qsort instead of 32299d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// using an inlined template. qsort is slightly slower than std::sort, but 32399d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// most sorts are not performance critical in LLVM and std::sort has to be 32499d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// template instantiated for each type, leading to significant measured code 32599d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// bloat. This function should generally be used instead of std::sort where 32699d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// possible. 32799d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// 32899d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// This function assumes that you have simple POD-like types that can be 329dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// compared with std::less and can be moved with memcpy. If this isn't true, 330545fc87454aabbc8ef8720811ab5dbd5588b537bChris Lattner/// you should use std::sort. 33199d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// 33299d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// NOTE: If qsort_r were portable, we could allow a custom comparator and 33399d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// default to std::less. 33499d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattnertemplate<class IteratorTy> 335305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruthinline void array_pod_sort(IteratorTy Start, IteratorTy End) { 33699d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner // Don't dereference start iterator of empty sequence. 337c65fc3bd27a84281da9819b5fe89a01535a14ecfChris Lattner if (Start == End) return; 338c65fc3bd27a84281da9819b5fe89a01535a14ecfChris Lattner qsort(&*Start, End-Start, sizeof(*Start), 339d5227545359a4816e52fd100b225ae140ec9b03aAndrew Trick get_array_pod_sort_comparator(*Start)); 34099d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner} 3413a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman 3420d293e45b66c742fdbc3998209bb20ed6c5806bfBenjamin Kramertemplate <class IteratorTy> 3430d293e45b66c742fdbc3998209bb20ed6c5806bfBenjamin Kramerinline void array_pod_sort( 3440d293e45b66c742fdbc3998209bb20ed6c5806bfBenjamin Kramer IteratorTy Start, IteratorTy End, 3450d293e45b66c742fdbc3998209bb20ed6c5806bfBenjamin Kramer int (*Compare)( 3460d293e45b66c742fdbc3998209bb20ed6c5806bfBenjamin Kramer const typename std::iterator_traits<IteratorTy>::value_type *, 3470d293e45b66c742fdbc3998209bb20ed6c5806bfBenjamin Kramer const typename std::iterator_traits<IteratorTy>::value_type *)) { 3489806f833a6697b835f1c795a1bd2f26a84d49d3cChris Lattner // Don't dereference start iterator of empty sequence. 3499806f833a6697b835f1c795a1bd2f26a84d49d3cChris Lattner if (Start == End) return; 3500d293e45b66c742fdbc3998209bb20ed6c5806bfBenjamin Kramer qsort(&*Start, End - Start, sizeof(*Start), 3510d293e45b66c742fdbc3998209bb20ed6c5806bfBenjamin Kramer reinterpret_cast<int (*)(const void *, const void *)>(Compare)); 3529806f833a6697b835f1c795a1bd2f26a84d49d3cChris Lattner} 353c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Trick 3545c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin//===----------------------------------------------------------------------===// 3555c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin// Extra additions to <algorithm> 3565c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin//===----------------------------------------------------------------------===// 3575c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin 3585c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin/// For a container of pointers, deletes the pointers and then clears the 3595c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin/// container. 3605c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskintemplate<typename Container> 3615c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskinvoid DeleteContainerPointers(Container &C) { 3625c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin for (typename Container::iterator I = C.begin(), E = C.end(); I != E; ++I) 3635c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin delete *I; 3645c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin C.clear(); 3655c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin} 3665c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin 3675c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin/// In a container of pairs (usually a map) whose second element is a pointer, 3685c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin/// deletes the second elements and then clears the container. 3695c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskintemplate<typename Container> 3705c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskinvoid DeleteContainerSeconds(Container &C) { 3715c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin for (typename Container::iterator I = C.begin(), E = C.end(); I != E; ++I) 3725c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin delete I->second; 3735c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin C.clear(); 3745c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin} 3755c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin 37636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===// 37736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Extra additions to <memory> 37836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===// 37936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 38036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#if LLVM_HAS_VARIADIC_TEMPLATES 38136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 38236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Implement make_unique according to N3656. 38336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 38436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// \brief Constructs a `new T()` with the given args and returns a 38536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// `unique_ptr<T>` which owns the object. 38636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// 38736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Example: 38836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// 38936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// auto p = make_unique<int>(); 39036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// auto p = make_unique<std::tuple<int, int>>(0, 1); 39136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestemplate <class T, class... Args> 39236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestypename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T>>::type 39336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesmake_unique(Args &&... args) { 39436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); 39536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 39636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 39736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// \brief Constructs a `new T[n]` with the given args and returns a 39836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// `unique_ptr<T[]>` which owns the object. 39936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// 40036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// \param n size of the new array. 40136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// 40236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Example: 40336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// 40436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// auto p = make_unique<int[]>(2); // value-initializes the array with 0's. 40536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestemplate <class T> 40636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestypename std::enable_if<std::is_array<T>::value && std::extent<T>::value == 0, 40736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<T>>::type 40836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesmake_unique(size_t n) { 40936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return std::unique_ptr<T>(new typename std::remove_extent<T>::type[n]()); 41036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 41136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 41236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// This function isn't used and is only here to provide better compile errors. 41336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestemplate <class T, class... Args> 41436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestypename std::enable_if<std::extent<T>::value != 0>::type 41536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesmake_unique(Args &&...) LLVM_DELETED_FUNCTION; 41636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 41736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#else 41836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 41936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestemplate <class T> 42036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestypename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T>>::type 42136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesmake_unique() { 42236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return std::unique_ptr<T>(new T()); 42336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 42436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 42536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestemplate <class T, class Arg1> 42636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestypename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T>>::type 42736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesmake_unique(Arg1 &&arg1) { 42836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return std::unique_ptr<T>(new T(std::forward<Arg1>(arg1))); 42936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 43036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 43136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestemplate <class T, class Arg1, class Arg2> 43236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestypename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T>>::type 43336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesmake_unique(Arg1 &&arg1, Arg2 &&arg2) { 43436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return std::unique_ptr<T>( 43536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines new T(std::forward<Arg1>(arg1), std::forward<Arg2>(arg2))); 43636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 43736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 43836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestemplate <class T, class Arg1, class Arg2, class Arg3> 43936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestypename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T>>::type 44036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesmake_unique(Arg1 &&arg1, Arg2 &&arg2, Arg3 &&arg3) { 44136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return std::unique_ptr<T>(new T(std::forward<Arg1>(arg1), 44236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::forward<Arg2>(arg2), 44336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::forward<Arg3>(arg3))); 44436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 44536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 44636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestemplate <class T, class Arg1, class Arg2, class Arg3, class Arg4> 44736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestypename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T>>::type 44836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesmake_unique(Arg1 &&arg1, Arg2 &&arg2, Arg3 &&arg3, Arg4 &&arg4) { 44936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return std::unique_ptr<T>( 45036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines new T(std::forward<Arg1>(arg1), std::forward<Arg2>(arg2), 45136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::forward<Arg3>(arg3), std::forward<Arg4>(arg4))); 45236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 45336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 45436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestemplate <class T, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5> 45536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestypename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T>>::type 45636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesmake_unique(Arg1 &&arg1, Arg2 &&arg2, Arg3 &&arg3, Arg4 &&arg4, Arg5 &&arg5) { 45736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return std::unique_ptr<T>( 45836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines new T(std::forward<Arg1>(arg1), std::forward<Arg2>(arg2), 45936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::forward<Arg3>(arg3), std::forward<Arg4>(arg4), 46036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::forward<Arg5>(arg5))); 46136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 46236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 46336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestemplate <class T, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, 46436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines class Arg6> 46536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestypename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T>>::type 46636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesmake_unique(Arg1 &&arg1, Arg2 &&arg2, Arg3 &&arg3, Arg4 &&arg4, Arg5 &&arg5, 46736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Arg6 &&arg6) { 46836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return std::unique_ptr<T>( 46936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines new T(std::forward<Arg1>(arg1), std::forward<Arg2>(arg2), 47036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::forward<Arg3>(arg3), std::forward<Arg4>(arg4), 47136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::forward<Arg5>(arg5), std::forward<Arg6>(arg6))); 47236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 47336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 47436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestemplate <class T, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, 47536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines class Arg6, class Arg7> 47636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestypename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T>>::type 47736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesmake_unique(Arg1 &&arg1, Arg2 &&arg2, Arg3 &&arg3, Arg4 &&arg4, Arg5 &&arg5, 47836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Arg6 &&arg6, Arg7 &&arg7) { 47936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return std::unique_ptr<T>( 48036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines new T(std::forward<Arg1>(arg1), std::forward<Arg2>(arg2), 48136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::forward<Arg3>(arg3), std::forward<Arg4>(arg4), 48236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::forward<Arg5>(arg5), std::forward<Arg6>(arg6), 48336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::forward<Arg7>(arg7))); 48436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 48536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 48636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestemplate <class T, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, 48736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines class Arg6, class Arg7, class Arg8> 48836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestypename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T>>::type 48936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesmake_unique(Arg1 &&arg1, Arg2 &&arg2, Arg3 &&arg3, Arg4 &&arg4, Arg5 &&arg5, 49036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Arg6 &&arg6, Arg7 &&arg7, Arg8 &&arg8) { 49136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return std::unique_ptr<T>( 49236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines new T(std::forward<Arg1>(arg1), std::forward<Arg2>(arg2), 49336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::forward<Arg3>(arg3), std::forward<Arg4>(arg4), 49436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::forward<Arg5>(arg5), std::forward<Arg6>(arg6), 49536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::forward<Arg7>(arg7), std::forward<Arg8>(arg8))); 49636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 49736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 49836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestemplate <class T, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, 49936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines class Arg6, class Arg7, class Arg8, class Arg9> 50036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestypename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T>>::type 50136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesmake_unique(Arg1 &&arg1, Arg2 &&arg2, Arg3 &&arg3, Arg4 &&arg4, Arg5 &&arg5, 50236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Arg6 &&arg6, Arg7 &&arg7, Arg8 &&arg8, Arg9 &&arg9) { 50336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return std::unique_ptr<T>( 50436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines new T(std::forward<Arg1>(arg1), std::forward<Arg2>(arg2), 50536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::forward<Arg3>(arg3), std::forward<Arg4>(arg4), 50636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::forward<Arg5>(arg5), std::forward<Arg6>(arg6), 50736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::forward<Arg7>(arg7), std::forward<Arg8>(arg8), 50836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::forward<Arg9>(arg9))); 50936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 51036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 51136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestemplate <class T, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, 51236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines class Arg6, class Arg7, class Arg8, class Arg9, class Arg10> 51336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestypename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T>>::type 51436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesmake_unique(Arg1 &&arg1, Arg2 &&arg2, Arg3 &&arg3, Arg4 &&arg4, Arg5 &&arg5, 51536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Arg6 &&arg6, Arg7 &&arg7, Arg8 &&arg8, Arg9 &&arg9, Arg10 &&arg10) { 51636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return std::unique_ptr<T>( 51736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines new T(std::forward<Arg1>(arg1), std::forward<Arg2>(arg2), 51836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::forward<Arg3>(arg3), std::forward<Arg4>(arg4), 51936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::forward<Arg5>(arg5), std::forward<Arg6>(arg6), 52036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::forward<Arg7>(arg7), std::forward<Arg8>(arg8), 52136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::forward<Arg9>(arg9), std::forward<Arg10>(arg10))); 52236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 52336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 52436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestemplate <class T> 52536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestypename std::enable_if<std::is_array<T>::value &&std::extent<T>::value == 0, 52636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<T>>::type 52736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesmake_unique(size_t n) { 52836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return std::unique_ptr<T>(new typename std::remove_extent<T>::type[n]()); 52936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 53036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 53136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#endif 53236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 533dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinestemplate<typename First, typename Second> 534dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstruct pair_hash { 535dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines size_t operator()(const std::pair<First, Second> &P) const { 536dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return std::hash<First>()(P.first) * 31 + std::hash<Second>()(P.second); 537dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 538dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}; 539dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 540d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 541d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 54218d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner#endif 543