10 #ifndef LLVM_ADT_ARRAYREF_H
11 #define LLVM_ADT_ARRAYREF_H
13 #include "llvm/None.h"
14 #include "llvm/SmallVector.h"
17 #ifndef LLVM_CONSTEXPR
20 # define LLVM_CONSTEXPR constexpr
22 # define LLVM_CONSTEXPR
24 # elif defined(__has_feature)
25 # if __has_feature(cxx_constexpr)
26 # define LLVM_CONSTEXPR constexpr
28 # define LLVM_CONSTEXPR
30 # elif defined(__GXX_EXPERIMENTAL_CXX0X__)
31 # define LLVM_CONSTEXPR constexpr
32 # elif defined(__has_constexpr)
33 # define LLVM_CONSTEXPR constexpr
35 # define LLVM_CONSTEXPR
37 # define DEFINED_LLVM_CONSTEXPR
56 typedef const T *iterator;
57 typedef const T *const_iterator;
58 typedef size_t size_type;
60 typedef std::reverse_iterator<iterator> reverse_iterator;
77 ArrayRef(NoneType) : Data(nullptr), Length(0) {}
81 : Data(&OneElt), Length(1) {}
85 : Data(data), Length(length) {}
89 : Data(begin), Length(end - begin) {}
96 : Data(Vec.data()), Length(Vec.
size()) {
102 : Data(Vec.data()), Length(Vec.
size()) {}
107 : Data(Arr), Length(N) {}
111 : Data(Vec.begin() == Vec.end() ? (T*)0 : Vec.begin()),
112 Length(Vec.
size()) {}
116 template <
typename U>
118 typename std::enable_if<
119 std::is_convertible<U *const *, T const *>::value>::type* = 0)
120 : Data(A.data()), Length(A.
size()) {}
125 template<
typename U,
typename DummyT>
127 typename std::enable_if<
128 std::is_convertible<U *
const *,
129 T
const *>::value>::type* = 0)
130 : Data(Vec.data()), Length(Vec.
size()) {
135 template<
typename U,
typename A>
137 typename std::enable_if<
138 std::is_convertible<U *const *, T const *>::value>::type* = 0)
139 : Data(Vec.data()), Length(Vec.
size()) {}
145 iterator begin()
const {
return Data; }
146 iterator end()
const {
return Data + Length; }
148 reverse_iterator rbegin()
const {
return reverse_iterator(end()); }
149 reverse_iterator rend()
const {
return reverse_iterator(begin()); }
152 bool empty()
const {
return Length == 0; }
154 const T *data()
const {
return Data; }
157 size_t size()
const {
return Length; }
168 return Data[Length-1];
172 template <
typename Allocator>
ArrayRef<T> copy(Allocator &A) {
173 T *Buff = A.template Allocate<T>(Length);
174 std::copy(begin(), end(), Buff);
180 if (Length != RHS.Length)
184 return std::equal(begin(), end(), RHS.begin());
189 assert(N <=
size() &&
"Invalid specifier");
196 assert(N+M <=
size() &&
"Invalid specifier");
202 assert(
size() >= N &&
"Dropping more elements than exist");
209 const T &operator[](
size_t Index)
const {
210 assert(Index < Length &&
"Invalid index!");
217 std::vector<T> vec()
const {
218 return std::vector<T>(Data, Data+Length);
224 operator std::vector<T>()
const {
225 return std::vector<T>(Data, Data+Length);
248 typedef std::reverse_iterator<iterator> reverse_iterator;
281 iterator begin()
const {
return data(); }
282 iterator end()
const {
return data() + this->
size(); }
284 reverse_iterator rbegin()
const {
return reverse_iterator(end()); }
285 reverse_iterator rend()
const {
return reverse_iterator(begin()); }
289 assert(!this->
empty());
295 assert(!this->
empty());
296 return data()[this->
size()-1];
301 assert(N <= this->
size() &&
"Invalid specifier");
308 assert(N+M <= this->
size() &&
"Invalid specifier");
313 assert(this->
size() >= N &&
"Dropping more elements than exist");
320 T &operator[](
size_t Index)
const {
321 assert(Index < this->
size() &&
"Invalid index!");
322 return data()[Index];
331 ArrayRef<T> makeArrayRef(
const T &OneElt) {
337 ArrayRef<T> makeArrayRef(
const T *data,
size_t length) {
338 return ArrayRef<T>(data, length);
343 ArrayRef<T> makeArrayRef(
const T *begin,
const T *end) {
344 return ArrayRef<T>(begin, end);
348 template <
typename T>
349 ArrayRef<T> makeArrayRef(
const SmallVectorImpl<T> &Vec) {
354 template <
typename T,
unsigned N>
355 ArrayRef<T> makeArrayRef(
const SmallVector<T, N> &Vec) {
361 ArrayRef<T> makeArrayRef(
const std::vector<T> &Vec) {
366 template<
typename T,
size_t N>
367 ArrayRef<T> makeArrayRef(
const T (&Arr)[N]) {
368 return ArrayRef<T>(Arr);
376 inline bool operator==(ArrayRef<T> LHS, ArrayRef<T> RHS) {
377 return LHS.equals(RHS);
381 inline bool operator!=(ArrayRef<T> LHS, ArrayRef<T> RHS) {
382 return !(LHS == RHS);
388 template <
typename T>
struct isPodLike;
390 static const bool value =
true;
394 #ifdef DEFINED_LLVM_CONSTEXPR
395 # undef DEFINED_LLVM_CONSTEXPR
396 # undef LLVM_CONSTEXPR
ArrayRef(const ArrayRef< U * > &A, typename std::enable_if< std::is_convertible< U *const *, T const * >::value >::type *=0)
Construct an ArrayRef<const T*> from ArrayRef<T*>.
Definition: ArrayRef.h:117
const T & front() const
front - Get the first element.
Definition: ArrayRef.h:160
ArrayRef(NoneType)
Construct an empty ArrayRef from None.
Definition: ArrayRef.h:77
MutableArrayRef(std::vector< T > &Vec)
Construct a MutableArrayRef from a std::vector.
Definition: ArrayRef.h:271
ArrayRef< T > slice(unsigned N, unsigned M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array...
Definition: ArrayRef.h:195
LLVM_CONSTEXPR MutableArrayRef(T(&Arr)[N])
Construct an MutableArrayRef from a C array.
Definition: ArrayRef.h:276
LLVM_CONSTEXPR ArrayRef(const T(&Arr)[N])
Construct an ArrayRef from a C array.
Definition: ArrayRef.h:106
ArrayRef(const std::vector< T, A > &Vec)
Construct an ArrayRef from a std::vector.
Definition: ArrayRef.h:101
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: StringRef.h:23
ArrayRef(const std::initializer_list< T > &Vec)
Construct an ArrayRef from a std::initializer_list.
Definition: ArrayRef.h:110
ArrayRef< T > slice(unsigned N) const
slice(n) - Chop off the first N elements of the array.
Definition: ArrayRef.h:188
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory)...
Definition: ArrayRef.h:54
MutableArrayRef< T > slice(unsigned N, unsigned M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array...
Definition: ArrayRef.h:307
size_t size() const
size - Get the array size.
Definition: ArrayRef.h:157
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition: ArrayRef.h:244
ArrayRef(const SmallVectorTemplateCommon< T, U > &Vec)
Construct an ArrayRef from a SmallVector.
Definition: ArrayRef.h:95
MutableArrayRef(T *begin, T *end)
Construct an MutableArrayRef from a range.
Definition: ArrayRef.h:264
ArrayRef()
Construct an empty ArrayRef.
Definition: ArrayRef.h:74
bool equals(ArrayRef RHS) const
equals - Check for element-wise equality.
Definition: ArrayRef.h:179
bool empty() const
empty - Check if the array is empty.
Definition: ArrayRef.h:152
MutableArrayRef()
Construct an empty MutableArrayRef.
Definition: ArrayRef.h:251
const T & back() const
back - Get the last element.
Definition: ArrayRef.h:166
ArrayRef(const T &OneElt)
Construct an ArrayRef from a single element.
Definition: ArrayRef.h:80
isPodLike - This is a type trait that is used to determine whether a given type can be copied around ...
Definition: StringRef.h:535
MutableArrayRef(T *data, size_t length)
Construct an MutableArrayRef from a pointer and length.
Definition: ArrayRef.h:260
ArrayRef(const SmallVectorTemplateCommon< U *, DummyT > &Vec, typename std::enable_if< std::is_convertible< U *const *, T const * >::value >::type *=0)
Construct an ArrayRef<const T*> from a SmallVector<T*>.
Definition: ArrayRef.h:126
MutableArrayRef(T &OneElt)
Construct an MutableArrayRef from a single element.
Definition: ArrayRef.h:257
ArrayRef(const T *data, size_t length)
Construct an ArrayRef from a pointer and length.
Definition: ArrayRef.h:84
MutableArrayRef< T > slice(unsigned N) const
slice(n) - Chop off the first N elements of the array.
Definition: ArrayRef.h:300
This is the part of SmallVectorTemplateBase which does not depend on whether the type T is a POD...
Definition: SmallVector.h:66
T & front() const
front - Get the first element.
Definition: ArrayRef.h:288
ArrayRef(const T *begin, const T *end)
Construct an ArrayRef from a range.
Definition: ArrayRef.h:88
MutableArrayRef(NoneType)
Construct an empty MutableArrayRef from None.
Definition: ArrayRef.h:254
MutableArrayRef(SmallVectorImpl< T > &Vec)
Construct an MutableArrayRef from a SmallVector.
Definition: ArrayRef.h:267
T & back() const
back - Get the last element.
Definition: ArrayRef.h:294
ArrayRef(const std::vector< U *, A > &Vec, typename std::enable_if< std::is_convertible< U *const *, T const * >::value >::type *=0)
Construct an ArrayRef<const T*> from std::vector<T*>.
Definition: ArrayRef.h:136