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