//===- llvm/ADT/STLExtras.h - Useful STL related functions ------*- C++ -*-===//
-//
+//
// The LLVM Compiler Infrastructure
//
-// This file was developed by the LLVM research group and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
-//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
//===----------------------------------------------------------------------===//
//
// This file contains some templates that are useful if you are working with the
#include <functional>
#include <utility> // for std::pair
-#include "llvm/ADT/iterator"
+#include <cstring> // for std::size_t
+#include "llvm/ADT/iterator.h"
namespace llvm {
};
// deleter - Very very very simple method that is used to invoke operator
-// delete on something. It is used like this:
+// delete on something. It is used like this:
//
// for_each(V.begin(), B.end(), deleter<Interval>);
//
-template <class T>
-static inline void deleter(T *Ptr) {
- delete Ptr;
+template <class T>
+static inline void deleter(T *Ptr) {
+ delete Ptr;
}
typedef RootIt iterator_type;
typedef mapped_iterator<RootIt, UnaryFunc> _Self;
- inline RootIt &getCurrent() const { return current; }
+ inline const RootIt &getCurrent() const { return current; }
inline explicit mapped_iterator(const RootIt &I, UnaryFunc F)
: current(I), Fn(F) {}
inline mapped_iterator(const mapped_iterator &It)
: current(It.current), Fn(It.Fn) {}
- inline value_type operator*() const { // All this work to do this
+ inline value_type operator*() const { // All this work to do this
return Fn(*current); // little change
}
_Self& operator+= (difference_type n) { current += n; return *this; }
_Self operator- (difference_type n) const { return _Self(current - n); }
_Self& operator-= (difference_type n) { current -= n; return *this; }
- reference operator[](difference_type n) const { return *(*this + n); }
+ reference operator[](difference_type n) const { return *(*this + n); }
inline bool operator!=(const _Self &X) const { return !operator==(X); }
inline bool operator==(const _Self &X) const { return current == X.current; }
};
template <class _Iterator, class Func>
-inline mapped_iterator<_Iterator, Func>
+inline mapped_iterator<_Iterator, Func>
operator+(typename mapped_iterator<_Iterator, Func>::difference_type N,
const mapped_iterator<_Iterator, Func>& X) {
return mapped_iterator<_Iterator, Func>(X.getCurrent() - N);
template <typename ItTy>
inline ItTy next(ItTy it)
{
- std::advance(it, 1);
- return it;
+ return ++it;
}
template <typename ItTy, typename Dist>
template <typename ItTy>
inline ItTy prior(ItTy it)
{
- std::advance(it, -1);
- return it;
+ return --it;
}
//===----------------------------------------------------------------------===//
// a std::pair. Since an example is worth 1000 words:
//
// typedef std::map<int, int> Int2IntMap;
-//
+//
// Int2IntMap myMap;
// Int2IntMap::iterator where;
// bool inserted;
return tier<T1, T2>(f, s);
}
+//===----------------------------------------------------------------------===//
+// Extra additions to arrays
+//===----------------------------------------------------------------------===//
+
+/// Find where an array ends (for ending iterators)
+/// This returns a pointer to the byte immediately
+/// after the end of an array.
+template<class T, std::size_t N>
+inline T *array_endof(T (&x)[N]) {
+ return x+N;
+}
+
+/// Find the length of an array.
+template<class T, std::size_t N>
+inline size_t array_lengthof(T (&x)[N]) {
+ return N;
+}
+
} // End llvm namespace
#endif