10 #ifndef LLVM_ADT_ARRAYREF_H 11 #define LLVM_ADT_ARRAYREF_H 13 #include "llvm/Compiler.h" 14 #include "llvm/Hashing.h" 15 #include "llvm/None.h" 16 #include "llvm/SmallVector.h" 34 typedef const T *iterator;
35 typedef const T *const_iterator;
36 typedef size_t size_type;
38 typedef std::reverse_iterator<iterator> reverse_iterator;
55 ArrayRef(NoneType) : Data(nullptr), Length(0) {}
59 : Data(&OneElt), Length(1) {}
63 : Data(data), Length(length) {}
67 : Data(begin), Length(end - begin) {}
74 : Data(Vec.data()), Length(Vec.
size()) {
80 : Data(Vec.data()), Length(Vec.
size()) {}
85 : Data(Arr), Length(N) {}
89 : Data(Vec.begin() == Vec.end() ? (T*)nullptr : Vec.begin()),
97 typename std::enable_if<
98 std::is_convertible<U *const *, T const *>::value>::type * =
nullptr)
99 : Data(A.data()), Length(A.
size()) {}
104 template<
typename U,
typename DummyT>
107 typename std::enable_if<
108 std::is_convertible<U *const *, T const *>::value>::type * =
nullptr)
109 : Data(Vec.data()), Length(Vec.
size()) {
114 template<
typename U,
typename A>
116 typename std::enable_if<
117 std::is_convertible<U *const *, T const *>::value>::type* = 0)
118 : Data(Vec.data()), Length(Vec.
size()) {}
124 iterator begin()
const {
return Data; }
125 iterator end()
const {
return Data + Length; }
127 reverse_iterator rbegin()
const {
return reverse_iterator(end()); }
128 reverse_iterator rend()
const {
return reverse_iterator(begin()); }
131 bool empty()
const {
return Length == 0; }
133 const T *data()
const {
return Data; }
136 size_t size()
const {
return Length; }
147 return Data[Length-1];
151 template <
typename Allocator>
ArrayRef<T> copy(Allocator &A) {
152 T *Buff = A.template Allocate<T>(Length);
153 std::uninitialized_copy(begin(), end(), Buff);
159 if (Length != RHS.Length)
161 return std::equal(begin(), end(), RHS.begin());
166 assert(N <=
size() &&
"Invalid specifier");
173 assert(N+M <=
size() &&
"Invalid specifier");
179 assert(
size() >= N &&
"Dropping more elements than exist");
185 assert(
size() >= N &&
"Dropping more elements than exist");
192 const T &operator[](
size_t Index)
const {
193 assert(Index < Length &&
"Invalid index!");
200 std::vector<T> vec()
const {
201 return std::vector<T>(Data, Data+Length);
207 operator std::vector<T>()
const {
208 return std::vector<T>(Data, Data+Length);
231 typedef std::reverse_iterator<iterator> reverse_iterator;
264 iterator begin()
const {
return data(); }
265 iterator end()
const {
return data() + this->
size(); }
267 reverse_iterator rbegin()
const {
return reverse_iterator(end()); }
268 reverse_iterator rend()
const {
return reverse_iterator(begin()); }
272 assert(!this->
empty());
278 assert(!this->
empty());
279 return data()[this->
size()-1];
284 assert(N <= this->
size() &&
"Invalid specifier");
291 assert(N+M <= this->
size() &&
"Invalid specifier");
297 assert(this->
size() >= N &&
"Dropping more elements than exist");
302 assert(this->
size() >= N &&
"Dropping more elements than exist");
309 T &operator[](
size_t Index)
const {
310 assert(Index < this->
size() &&
"Invalid index!");
311 return data()[Index];
326 ArrayRef<T> makeArrayRef(
const T *data,
size_t length) {
332 ArrayRef<T> makeArrayRef(
const T *begin,
const T *end) {
337 template <
typename T>
343 template <
typename T,
unsigned N>
350 ArrayRef<T> makeArrayRef(
const std::vector<T> &Vec) {
365 template<
typename T,
size_t N>
381 return !(LHS == RHS);
389 static const bool value =
true;
393 return hash_combine_range(S.begin(), S.end());
397 #endif // LLVM_ADT_ARRAYREF_H
ArrayRef(const ArrayRef< U * > &A, typename std::enable_if< std::is_convertible< U *const *, T const * >::value >::type *=nullptr)
Construct an ArrayRef<const T*> from ArrayRef<T*>.
Definition: ArrayRef.h:95
const T & front() const
front - Get the first element.
Definition: ArrayRef.h:139
ArrayRef(NoneType)
Construct an empty ArrayRef from None.
Definition: ArrayRef.h:55
MutableArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array...
Definition: ArrayRef.h:290
MutableArrayRef(std::vector< T > &Vec)
Construct a MutableArrayRef from a std::vector.
Definition: ArrayRef.h:254
LLVM_CONSTEXPR MutableArrayRef(T(&Arr)[N])
Construct an MutableArrayRef from a C array.
Definition: ArrayRef.h:259
LLVM_CONSTEXPR ArrayRef(const T(&Arr)[N])
Construct an ArrayRef from a C array.
Definition: ArrayRef.h:84
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array...
Definition: ArrayRef.h:172
ArrayRef(const SmallVectorTemplateCommon< U *, DummyT > &Vec, typename std::enable_if< std::is_convertible< U *const *, T const * >::value >::type *=nullptr)
Construct an ArrayRef<const T*> from a SmallVector<T*>.
Definition: ArrayRef.h:105
ArrayRef(const std::vector< T, A > &Vec)
Construct an ArrayRef from a std::vector.
Definition: ArrayRef.h:79
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: WindowsSupport.h:184
MutableArrayRef< T > slice(size_t N) const
slice(n) - Chop off the first N elements of the array.
Definition: ArrayRef.h:283
ArrayRef(const std::initializer_list< T > &Vec)
Construct an ArrayRef from a std::initializer_list.
Definition: ArrayRef.h:88
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory)...
Definition: ArrayRef.h:32
size_t size() const
size - Get the array size.
Definition: ArrayRef.h:136
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition: ArrayRef.h:227
ArrayRef(const SmallVectorTemplateCommon< T, U > &Vec)
Construct an ArrayRef from a SmallVector.
Definition: ArrayRef.h:73
MutableArrayRef(T *begin, T *end)
Construct an MutableArrayRef from a range.
Definition: ArrayRef.h:247
ArrayRef()
Construct an empty ArrayRef.
Definition: ArrayRef.h:52
ArrayRef< T > drop_back(size_t N=1) const
Drop the last N elements of the array.
Definition: ArrayRef.h:184
bool equals(ArrayRef RHS) const
equals - Check for element-wise equality.
Definition: ArrayRef.h:158
bool empty() const
empty - Check if the array is empty.
Definition: ArrayRef.h:131
MutableArrayRef()
Construct an empty MutableArrayRef.
Definition: ArrayRef.h:234
const T & back() const
back - Get the last element.
Definition: ArrayRef.h:145
ArrayRef(const T &OneElt)
Construct an ArrayRef from a single element.
Definition: ArrayRef.h:58
isPodLike - This is a type trait that is used to determine whether a given type can be copied around ...
Definition: Optional.h:147
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small...
Definition: SmallVector.h:834
MutableArrayRef(T *data, size_t length)
Construct an MutableArrayRef from a pointer and length.
Definition: ArrayRef.h:243
ArrayRef< T > slice(size_t N) const
slice(n) - Chop off the first N elements of the array.
Definition: ArrayRef.h:165
MutableArrayRef(T &OneElt)
Construct an MutableArrayRef from a single element.
Definition: ArrayRef.h:240
An opaque object representing a hash code.
Definition: Hashing.h:70
ArrayRef(const T *data, size_t length)
Construct an ArrayRef from a pointer and length.
Definition: ArrayRef.h:62
This is the part of SmallVectorTemplateBase which does not depend on whether the type T is a POD...
Definition: SmallVector.h:66
MutableArrayRef< T > drop_front(size_t N=1) const
Drop the first N elements of the array.
Definition: ArrayRef.h:296
T & front() const
front - Get the first element.
Definition: ArrayRef.h:271
ArrayRef< T > drop_front(size_t N=1) const
Drop the first N elements of the array.
Definition: ArrayRef.h:178
ArrayRef(const T *begin, const T *end)
Construct an ArrayRef from a range.
Definition: ArrayRef.h:66
MutableArrayRef(NoneType)
Construct an empty MutableArrayRef from None.
Definition: ArrayRef.h:237
MutableArrayRef(SmallVectorImpl< T > &Vec)
Construct an MutableArrayRef from a SmallVector.
Definition: ArrayRef.h:250
T & back() const
back - Get the last element.
Definition: ArrayRef.h:277
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:115