STLExtras.h revision c0ccb8bb17028fe0dda139c0972c0125d10e6053
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
20a2769a33c94f021a609a462b28ebea069eba6f74Misha Brukman#include <cstddef> // for std::size_t
2190c583fff0535d441717425ad4428d85eb2a00a9Benjamin Kramer#include <cstdlib> // for qsort
2218d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner#include <functional>
23f0891be8bdbeeadb39da5575273b6645755fa383Gabor Greif#include <iterator>
249bb2188b0e196d2724e128152ef4d4b581adf3bcBrian Gaeke#include <utility> // for std::pair
2518d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner
26d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
27d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
2818d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner//===----------------------------------------------------------------------===//
2942e018c8057effef5ed1494b999052981d8cf195Chris Lattner//     Extra additions to <functional>
3042e018c8057effef5ed1494b999052981d8cf195Chris Lattner//===----------------------------------------------------------------------===//
3142e018c8057effef5ed1494b999052981d8cf195Chris Lattner
327b32639362c4cbb438d71492897d9f84c89d9e57Alkis Evlogimenostemplate<class Ty>
33c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Trickstruct identity : public std::unary_function<Ty, Ty> {
34c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Trick  Ty &operator()(Ty &self) const {
35c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Trick    return self;
36c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Trick  }
37c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Trick  const Ty &operator()(const Ty &self) const {
38c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Trick    return self;
39c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Trick  }
40c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Trick};
41c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Trick
42c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Tricktemplate<class Ty>
43094da67bd781708e76ab37c76e7a87d86404be05Daniel Dunbarstruct less_ptr : public std::binary_function<Ty, Ty, bool> {
44094da67bd781708e76ab37c76e7a87d86404be05Daniel Dunbar  bool operator()(const Ty* left, const Ty* right) const {
45094da67bd781708e76ab37c76e7a87d86404be05Daniel Dunbar    return *left < *right;
46094da67bd781708e76ab37c76e7a87d86404be05Daniel Dunbar  }
47094da67bd781708e76ab37c76e7a87d86404be05Daniel Dunbar};
48094da67bd781708e76ab37c76e7a87d86404be05Daniel Dunbar
49094da67bd781708e76ab37c76e7a87d86404be05Daniel Dunbartemplate<class Ty>
507b32639362c4cbb438d71492897d9f84c89d9e57Alkis Evlogimenosstruct greater_ptr : public std::binary_function<Ty, Ty, bool> {
517b32639362c4cbb438d71492897d9f84c89d9e57Alkis Evlogimenos  bool operator()(const Ty* left, const Ty* right) const {
527b32639362c4cbb438d71492897d9f84c89d9e57Alkis Evlogimenos    return *right < *left;
537b32639362c4cbb438d71492897d9f84c89d9e57Alkis Evlogimenos  }
547b32639362c4cbb438d71492897d9f84c89d9e57Alkis Evlogimenos};
557b32639362c4cbb438d71492897d9f84c89d9e57Alkis Evlogimenos
56577b15f70e3a1461033858e357f8ed3e10705c21Chris Lattner// deleter - Very very very simple method that is used to invoke operator
579769ab22265b313171d201b5928688524a01bd87Misha Brukman// delete on something.  It is used like this:
58577b15f70e3a1461033858e357f8ed3e10705c21Chris Lattner//
59876509614b608f1af885d978c7d2a1e34f807e33Chris Lattner//   for_each(V.begin(), B.end(), deleter<Interval>);
60577b15f70e3a1461033858e357f8ed3e10705c21Chris Lattner//
619769ab22265b313171d201b5928688524a01bd87Misha Brukmantemplate <class T>
629769ab22265b313171d201b5928688524a01bd87Misha Brukmanstatic inline void deleter(T *Ptr) {
639769ab22265b313171d201b5928688524a01bd87Misha Brukman  delete Ptr;
64577b15f70e3a1461033858e357f8ed3e10705c21Chris Lattner}
65577b15f70e3a1461033858e357f8ed3e10705c21Chris Lattner
66577b15f70e3a1461033858e357f8ed3e10705c21Chris Lattner
67577b15f70e3a1461033858e357f8ed3e10705c21Chris Lattner
6842e018c8057effef5ed1494b999052981d8cf195Chris Lattner//===----------------------------------------------------------------------===//
6918d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner//     Extra additions to <iterator>
7018d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner//===----------------------------------------------------------------------===//
7118d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner
7218d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner// mapped_iterator - This is a simple iterator adapter that causes a function to
7318d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner// be dereferenced whenever operator* is invoked on the iterator.
7418d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner//
7518d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattnertemplate <class RootIt, class UnaryFunc>
7618d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattnerclass mapped_iterator {
7718d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner  RootIt current;
78643afb3b01318f9ce20558ffef374b377b1f1df7Chris Lattner  UnaryFunc Fn;
7918d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattnerpublic:
80697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner  typedef typename std::iterator_traits<RootIt>::iterator_category
8118d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner          iterator_category;
82697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner  typedef typename std::iterator_traits<RootIt>::difference_type
8318d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner          difference_type;
8418d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner  typedef typename UnaryFunc::result_type value_type;
85d063725c3c6e36b711106f06e0cab11a1283f349Chris Lattner
86d063725c3c6e36b711106f06e0cab11a1283f349Chris Lattner  typedef void pointer;
87d063725c3c6e36b711106f06e0cab11a1283f349Chris Lattner  //typedef typename UnaryFunc::result_type *pointer;
8818d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner  typedef void reference;        // Can't modify value returned by fn
8918d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner
9018d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner  typedef RootIt iterator_type;
9118d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner  typedef mapped_iterator<RootIt, UnaryFunc> _Self;
9218d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner
9382493289e0234e0172313e845fb87306cf3687acChris Lattner  inline const RootIt &getCurrent() const { return current; }
943d4227bec59358199c7d53fad8f03fd075723fcfDan Gohman  inline const UnaryFunc &getFunc() const { return Fn; }
9518d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner
96643afb3b01318f9ce20558ffef374b377b1f1df7Chris Lattner  inline explicit mapped_iterator(const RootIt &I, UnaryFunc F)
97643afb3b01318f9ce20558ffef374b377b1f1df7Chris Lattner    : current(I), Fn(F) {}
98643afb3b01318f9ce20558ffef374b377b1f1df7Chris Lattner  inline mapped_iterator(const mapped_iterator &It)
99643afb3b01318f9ce20558ffef374b377b1f1df7Chris Lattner    : current(It.current), Fn(It.Fn) {}
10018d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner
1019769ab22265b313171d201b5928688524a01bd87Misha Brukman  inline value_type operator*() const {   // All this work to do this
102643afb3b01318f9ce20558ffef374b377b1f1df7Chris Lattner    return Fn(*current);         // little change
10318d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner  }
10418d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner
10518d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner  _Self& operator++() { ++current; return *this; }
10618d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner  _Self& operator--() { --current; return *this; }
10718d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner  _Self  operator++(int) { _Self __tmp = *this; ++current; return __tmp; }
10818d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner  _Self  operator--(int) { _Self __tmp = *this; --current; return __tmp; }
1093d4227bec59358199c7d53fad8f03fd075723fcfDan Gohman  _Self  operator+    (difference_type n) const {
1103d4227bec59358199c7d53fad8f03fd075723fcfDan Gohman    return _Self(current + n, Fn);
1113d4227bec59358199c7d53fad8f03fd075723fcfDan Gohman  }
11218d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner  _Self& operator+=   (difference_type n) { current += n; return *this; }
1133d4227bec59358199c7d53fad8f03fd075723fcfDan Gohman  _Self  operator-    (difference_type n) const {
1143d4227bec59358199c7d53fad8f03fd075723fcfDan Gohman    return _Self(current - n, Fn);
1153d4227bec59358199c7d53fad8f03fd075723fcfDan Gohman  }
11618d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner  _Self& operator-=   (difference_type n) { current -= n; return *this; }
1179769ab22265b313171d201b5928688524a01bd87Misha Brukman  reference operator[](difference_type n) const { return *(*this + n); }
11818d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner
119697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner  inline bool operator!=(const _Self &X) const { return !operator==(X); }
12018d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner  inline bool operator==(const _Self &X) const { return current == X.current; }
12118d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner  inline bool operator< (const _Self &X) const { return current <  X.current; }
12218d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner
12318d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner  inline difference_type operator-(const _Self &X) const {
12418d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner    return current - X.current;
12518d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner  }
12618d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner};
12718d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner
12818d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattnertemplate <class _Iterator, class Func>
1299769ab22265b313171d201b5928688524a01bd87Misha Brukmaninline mapped_iterator<_Iterator, Func>
13018d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattneroperator+(typename mapped_iterator<_Iterator, Func>::difference_type N,
13118d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner          const mapped_iterator<_Iterator, Func>& X) {
1323d4227bec59358199c7d53fad8f03fd075723fcfDan Gohman  return mapped_iterator<_Iterator, Func>(X.getCurrent() - N, X.getFunc());
13318d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner}
13418d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner
13518d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner
13618d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner// map_iterator - Provide a convenient way to create mapped_iterators, just like
13718d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner// make_pair is useful for creating pairs...
13818d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner//
13918d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattnertemplate <class ItTy, class FuncTy>
14018d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattnerinline mapped_iterator<ItTy, FuncTy> map_iterator(const ItTy &I, FuncTy F) {
141643afb3b01318f9ce20558ffef374b377b1f1df7Chris Lattner  return mapped_iterator<ItTy, FuncTy>(I, F);
14218d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner}
14318d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner
14418d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner
145bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos// next/prior - These functions unlike std::advance do not modify the
146bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos// passed iterator but return a copy.
147bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos//
148bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos// next(myIt) returns copy of myIt incremented once
149bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos// next(myIt, n) returns copy of myIt incremented n times
150bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos// prior(myIt) returns copy of myIt decremented once
151bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos// prior(myIt, n) returns copy of myIt decremented n times
152bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos
153bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenostemplate <typename ItTy, typename Dist>
154bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenosinline ItTy next(ItTy it, Dist n)
155bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos{
156bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos  std::advance(it, n);
157bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos  return it;
158bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos}
159bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos
160bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenostemplate <typename ItTy>
161bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenosinline ItTy next(ItTy it)
162bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos{
163f1787008295aa274490a5723d5556b3c92045604Dan Gohman  return ++it;
164bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos}
165bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos
166bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenostemplate <typename ItTy, typename Dist>
167bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenosinline ItTy prior(ItTy it, Dist n)
168bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos{
169bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos  std::advance(it, -n);
170bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos  return it;
171bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos}
172bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos
173bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenostemplate <typename ItTy>
174bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenosinline ItTy prior(ItTy it)
175bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos{
176f1787008295aa274490a5723d5556b3c92045604Dan Gohman  return --it;
177bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos}
178bc79471be19e412eed4d270908db7ac945be10caAlkis Evlogimenos
179e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos//===----------------------------------------------------------------------===//
180e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos//     Extra additions to <utility>
181e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos//===----------------------------------------------------------------------===//
182e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos
183e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos// tie - this function ties two objects and returns a temporary object
184e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos// that is assignable from a std::pair. This can be used to make code
185e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos// more readable when using values returned from functions bundled in
186e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos// a std::pair. Since an example is worth 1000 words:
187e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos//
188e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos// typedef std::map<int, int> Int2IntMap;
1899769ab22265b313171d201b5928688524a01bd87Misha Brukman//
190e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos// Int2IntMap myMap;
191e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos// Int2IntMap::iterator where;
192e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos// bool inserted;
193e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos// tie(where, inserted) = myMap.insert(std::make_pair(123,456));
194e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos//
195e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos// if (inserted)
196e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos//   // do stuff
197e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos// else
198e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos//   // do other stuff
199c30a38f34bdfecb99ce49e3ffa479039c9bf0209Chris Lattnertemplate <typename T1, typename T2>
200c30a38f34bdfecb99ce49e3ffa479039c9bf0209Chris Lattnerstruct tier {
201c30a38f34bdfecb99ce49e3ffa479039c9bf0209Chris Lattner  typedef T1 &first_type;
202c30a38f34bdfecb99ce49e3ffa479039c9bf0209Chris Lattner  typedef T2 &second_type;
203c30a38f34bdfecb99ce49e3ffa479039c9bf0209Chris Lattner
204c30a38f34bdfecb99ce49e3ffa479039c9bf0209Chris Lattner  first_type first;
205c30a38f34bdfecb99ce49e3ffa479039c9bf0209Chris Lattner  second_type second;
206c30a38f34bdfecb99ce49e3ffa479039c9bf0209Chris Lattner
207c30a38f34bdfecb99ce49e3ffa479039c9bf0209Chris Lattner  tier(first_type f, second_type s) : first(f), second(s) { }
208c30a38f34bdfecb99ce49e3ffa479039c9bf0209Chris Lattner  tier& operator=(const std::pair<T1, T2>& p) {
209c30a38f34bdfecb99ce49e3ffa479039c9bf0209Chris Lattner    first = p.first;
210c30a38f34bdfecb99ce49e3ffa479039c9bf0209Chris Lattner    second = p.second;
211c30a38f34bdfecb99ce49e3ffa479039c9bf0209Chris Lattner    return *this;
212c30a38f34bdfecb99ce49e3ffa479039c9bf0209Chris Lattner  }
213c30a38f34bdfecb99ce49e3ffa479039c9bf0209Chris Lattner};
214e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos
215e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenostemplate <typename T1, typename T2>
216e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenosinline tier<T1, T2> tie(T1& f, T2& s) {
217e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos  return tier<T1, T2>(f, s);
218e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos}
219e292da29bfeb2faad71a568e9cbb706affd5f330Alkis Evlogimenos
220718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson//===----------------------------------------------------------------------===//
22199d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner//     Extra additions for arrays
222718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson//===----------------------------------------------------------------------===//
223718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson
224718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson/// Find where an array ends (for ending iterators)
225718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson/// This returns a pointer to the byte immediately
226718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson/// after the end of an array.
227718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Andersontemplate<class T, std::size_t N>
228718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Andersoninline T *array_endof(T (&x)[N]) {
229718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson  return x+N;
230718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson}
231718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson
232718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson/// Find the length of an array.
233718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Andersontemplate<class T, std::size_t N>
2342027362e8d99df1780ba604cff624b116a4e6ecfEric Christopherinline size_t array_lengthof(T (&)[N]) {
235718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson  return N;
236718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson}
237718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson
23899d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// array_pod_sort_comparator - This is helper function for array_pod_sort,
239545fc87454aabbc8ef8720811ab5dbd5588b537bChris Lattner/// which just uses operator< on T.
240545fc87454aabbc8ef8720811ab5dbd5588b537bChris Lattnertemplate<typename T>
24199d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattnerstatic inline int array_pod_sort_comparator(const void *P1, const void *P2) {
242545fc87454aabbc8ef8720811ab5dbd5588b537bChris Lattner  if (*reinterpret_cast<const T*>(P1) < *reinterpret_cast<const T*>(P2))
243545fc87454aabbc8ef8720811ab5dbd5588b537bChris Lattner    return -1;
244545fc87454aabbc8ef8720811ab5dbd5588b537bChris Lattner  if (*reinterpret_cast<const T*>(P2) < *reinterpret_cast<const T*>(P1))
245545fc87454aabbc8ef8720811ab5dbd5588b537bChris Lattner    return 1;
246545fc87454aabbc8ef8720811ab5dbd5588b537bChris Lattner  return 0;
24799d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner}
2483a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
249c65fc3bd27a84281da9819b5fe89a01535a14ecfChris Lattner/// get_array_pad_sort_comparator - This is an internal helper function used to
250c65fc3bd27a84281da9819b5fe89a01535a14ecfChris Lattner/// get type deduction of T right.
251c65fc3bd27a84281da9819b5fe89a01535a14ecfChris Lattnertemplate<typename T>
2522027362e8d99df1780ba604cff624b116a4e6ecfEric Christopherstatic int (*get_array_pad_sort_comparator(const T &))
253c65fc3bd27a84281da9819b5fe89a01535a14ecfChris Lattner             (const void*, const void*) {
254c65fc3bd27a84281da9819b5fe89a01535a14ecfChris Lattner  return array_pod_sort_comparator<T>;
255c65fc3bd27a84281da9819b5fe89a01535a14ecfChris Lattner}
256c65fc3bd27a84281da9819b5fe89a01535a14ecfChris Lattner
25799d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner
25899d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// array_pod_sort - This sorts an array with the specified start and end
25999d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// extent.  This is just like std::sort, except that it calls qsort instead of
26099d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// using an inlined template.  qsort is slightly slower than std::sort, but
26199d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// most sorts are not performance critical in LLVM and std::sort has to be
26299d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// template instantiated for each type, leading to significant measured code
26399d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// bloat.  This function should generally be used instead of std::sort where
26499d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// possible.
26599d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner///
26699d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// This function assumes that you have simple POD-like types that can be
267545fc87454aabbc8ef8720811ab5dbd5588b537bChris Lattner/// compared with operator< and can be moved with memcpy.  If this isn't true,
268545fc87454aabbc8ef8720811ab5dbd5588b537bChris Lattner/// you should use std::sort.
26999d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner///
27099d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// NOTE: If qsort_r were portable, we could allow a custom comparator and
27199d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner/// default to std::less.
27299d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattnertemplate<class IteratorTy>
27399d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattnerstatic inline void array_pod_sort(IteratorTy Start, IteratorTy End) {
27499d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner  // Don't dereference start iterator of empty sequence.
275c65fc3bd27a84281da9819b5fe89a01535a14ecfChris Lattner  if (Start == End) return;
276c65fc3bd27a84281da9819b5fe89a01535a14ecfChris Lattner  qsort(&*Start, End-Start, sizeof(*Start),
277c65fc3bd27a84281da9819b5fe89a01535a14ecfChris Lattner        get_array_pad_sort_comparator(*Start));
27899d0015735f8e2aee1a4b99e39ffdaadc8a1dba8Chris Lattner}
2793a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
2809806f833a6697b835f1c795a1bd2f26a84d49d3cChris Lattnertemplate<class IteratorTy>
2819806f833a6697b835f1c795a1bd2f26a84d49d3cChris Lattnerstatic inline void array_pod_sort(IteratorTy Start, IteratorTy End,
2829806f833a6697b835f1c795a1bd2f26a84d49d3cChris Lattner                                  int (*Compare)(const void*, const void*)) {
2839806f833a6697b835f1c795a1bd2f26a84d49d3cChris Lattner  // Don't dereference start iterator of empty sequence.
2849806f833a6697b835f1c795a1bd2f26a84d49d3cChris Lattner  if (Start == End) return;
2859806f833a6697b835f1c795a1bd2f26a84d49d3cChris Lattner  qsort(&*Start, End-Start, sizeof(*Start), Compare);
2869806f833a6697b835f1c795a1bd2f26a84d49d3cChris Lattner}
287c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Trick
2885c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin//===----------------------------------------------------------------------===//
2895c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin//     Extra additions to <algorithm>
2905c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin//===----------------------------------------------------------------------===//
2915c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin
2925c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin/// For a container of pointers, deletes the pointers and then clears the
2935c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin/// container.
2945c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskintemplate<typename Container>
2955c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskinvoid DeleteContainerPointers(Container &C) {
2965c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin  for (typename Container::iterator I = C.begin(), E = C.end(); I != E; ++I)
2975c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin    delete *I;
2985c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin  C.clear();
2995c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin}
3005c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin
3015c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin/// In a container of pairs (usually a map) whose second element is a pointer,
3025c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin/// deletes the second elements and then clears the container.
3035c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskintemplate<typename Container>
3045c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskinvoid DeleteContainerSeconds(Container &C) {
3055c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin  for (typename Container::iterator I = C.begin(), E = C.end(); I != E; ++I)
3065c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin    delete I->second;
3075c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin  C.clear();
3085c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin}
3095c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskin
310d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
311d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
31218d64ede9a4aee9dd66fde04e6ff8ffcae0c9925Chris Lattner#endif
313