STLExtras.h revision 3d4227bec59358199c7d53fad8f03fd075723fcf
15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//===- llvm/ADT/STLExtras.h - Useful STL related functions ------*- C++ -*-===//
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//                     The LLVM Compiler Infrastructure
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// License. See LICENSE.TXT for details.
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//===----------------------------------------------------------------------===//
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// This file contains some templates that are useful if you are working with the
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// STL at all.
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// No library is required when using these functinons.
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//===----------------------------------------------------------------------===//
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifndef LLVM_ADT_STLEXTRAS_H
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define LLVM_ADT_STLEXTRAS_H
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <functional>
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <utility> // for std::pair
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <cstring> // for std::size_t
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "llvm/ADT/iterator.h"
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace llvm {
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//===----------------------------------------------------------------------===//
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//     Extra additions to <functional>
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//===----------------------------------------------------------------------===//
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template<class Ty>
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)struct greater_ptr : public std::binary_function<Ty, Ty, bool> {
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool operator()(const Ty* left, const Ty* right) const {
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return *right < *left;
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// deleter - Very very very simple method that is used to invoke operator
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// delete on something.  It is used like this:
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//   for_each(V.begin(), B.end(), deleter<Interval>);
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template <class T>
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static inline void deleter(T *Ptr) {
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  delete Ptr;
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//===----------------------------------------------------------------------===//
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//     Extra additions to <iterator>
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//===----------------------------------------------------------------------===//
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// mapped_iterator - This is a simple iterator adapter that causes a function to
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// be dereferenced whenever operator* is invoked on the iterator.
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template <class RootIt, class UnaryFunc>
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class mapped_iterator {
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RootIt current;
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  UnaryFunc Fn;
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)public:
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  typedef typename std::iterator_traits<RootIt>::iterator_category
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          iterator_category;
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  typedef typename std::iterator_traits<RootIt>::difference_type
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          difference_type;
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  typedef typename UnaryFunc::result_type value_type;
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  typedef void pointer;
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  //typedef typename UnaryFunc::result_type *pointer;
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  typedef void reference;        // Can't modify value returned by fn
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  typedef RootIt iterator_type;
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  typedef mapped_iterator<RootIt, UnaryFunc> _Self;
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  inline const RootIt &getCurrent() const { return current; }
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  inline const UnaryFunc &getFunc() const { return Fn; }
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  inline explicit mapped_iterator(const RootIt &I, UnaryFunc F)
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : current(I), Fn(F) {}
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  inline mapped_iterator(const mapped_iterator &It)
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : current(It.current), Fn(It.Fn) {}
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  inline value_type operator*() const {   // All this work to do this
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return Fn(*current);         // little change
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  _Self& operator++() { ++current; return *this; }
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  _Self& operator--() { --current; return *this; }
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  _Self  operator++(int) { _Self __tmp = *this; ++current; return __tmp; }
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  _Self  operator--(int) { _Self __tmp = *this; --current; return __tmp; }
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  _Self  operator+    (difference_type n) const {
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return _Self(current + n, Fn);
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  _Self& operator+=   (difference_type n) { current += n; return *this; }
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  _Self  operator-    (difference_type n) const {
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return _Self(current - n, Fn);
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  _Self& operator-=   (difference_type n) { current -= n; return *this; }
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  reference operator[](difference_type n) const { return *(*this + n); }
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  inline bool operator!=(const _Self &X) const { return !operator==(X); }
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  inline bool operator==(const _Self &X) const { return current == X.current; }
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  inline bool operator< (const _Self &X) const { return current <  X.current; }
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  inline difference_type operator-(const _Self &X) const {
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return current - X.current;
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template <class _Iterator, class Func>
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)inline mapped_iterator<_Iterator, Func>
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccioperator+(typename mapped_iterator<_Iterator, Func>::difference_type N,
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          const mapped_iterator<_Iterator, Func>& X) {
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return mapped_iterator<_Iterator, Func>(X.getCurrent() - N, X.getFunc());
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// map_iterator - Provide a convenient way to create mapped_iterators, just like
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// make_pair is useful for creating pairs...
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template <class ItTy, class FuncTy>
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)inline mapped_iterator<ItTy, FuncTy> map_iterator(const ItTy &I, FuncTy F) {
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return mapped_iterator<ItTy, FuncTy>(I, F);
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// next/prior - These functions unlike std::advance do not modify the
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// passed iterator but return a copy.
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// next(myIt) returns copy of myIt incremented once
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// next(myIt, n) returns copy of myIt incremented n times
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// prior(myIt) returns copy of myIt decremented once
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// prior(myIt, n) returns copy of myIt decremented n times
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template <typename ItTy, typename Dist>
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)inline ItTy next(ItTy it, Dist n)
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles){
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::advance(it, n);
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return it;
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template <typename ItTy>
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)inline ItTy next(ItTy it)
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles){
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return ++it;
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template <typename ItTy, typename Dist>
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)inline ItTy prior(ItTy it, Dist n)
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles){
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::advance(it, -n);
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return it;
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template <typename ItTy>
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)inline ItTy prior(ItTy it)
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles){
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return --it;
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//===----------------------------------------------------------------------===//
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//     Extra additions to <utility>
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//===----------------------------------------------------------------------===//
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// tie - this function ties two objects and returns a temporary object
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// that is assignable from a std::pair. This can be used to make code
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// more readable when using values returned from functions bundled in
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// a std::pair. Since an example is worth 1000 words:
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// typedef std::map<int, int> Int2IntMap;
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Int2IntMap myMap;
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Int2IntMap::iterator where;
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// bool inserted;
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// tie(where, inserted) = myMap.insert(std::make_pair(123,456));
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// if (inserted)
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//   // do stuff
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// else
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//   // do other stuff
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles){
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  template <typename T1, typename T2>
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  struct tier {
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    typedef T1 &first_type;
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    typedef T2 &second_type;
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    first_type first;
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    second_type second;
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tier(first_type f, second_type s) : first(f), second(s) { }
1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tier& operator=(const std::pair<T1, T2>& p) {
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      first = p.first;
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      second = p.second;
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return *this;
1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  };
1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template <typename T1, typename T2>
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)inline tier<T1, T2> tie(T1& f, T2& s) {
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return tier<T1, T2>(f, s);
2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//===----------------------------------------------------------------------===//
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//     Extra additions to arrays
2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//===----------------------------------------------------------------------===//
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/// Find where an array ends (for ending iterators)
2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/// This returns a pointer to the byte immediately
2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/// after the end of an array.
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template<class T, std::size_t N>
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)inline T *array_endof(T (&x)[N]) {
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return x+N;
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/// Find the length of an array.
2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template<class T, std::size_t N>
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)inline size_t array_lengthof(T (&x)[N]) {
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return N;
2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // End llvm namespace
2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)