00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef LLVM_ADT_ARRAYREF_H
00011 #define LLVM_ADT_ARRAYREF_H
00012
00013 #include "llvm/ADT/SmallVector.h"
00014 #include <vector>
00015
00016 namespace llvm {
00017 class APInt;
00018
00030 template<typename T>
00031 class ArrayRef {
00032 public:
00033 typedef const T *iterator;
00034 typedef const T *const_iterator;
00035 typedef size_t size_type;
00036
00037 private:
00039 const T *Data;
00040
00042 size_type Length;
00043
00044 public:
00047
00049 ArrayRef() : Data(0), Length(0) {}
00050
00052 ArrayRef(const T &OneElt)
00053 : Data(&OneElt), Length(1) {}
00054
00056 ArrayRef(const T *data, size_t length)
00057 : Data(data), Length(length) {}
00058
00060 ArrayRef(const T *begin, const T *end)
00061 : Data(begin), Length(end - begin) {}
00062
00064 ArrayRef(const SmallVectorImpl<T> &Vec)
00065 : Data(Vec.data()), Length(Vec.size()) {}
00066
00068 ArrayRef(const std::vector<T> &Vec)
00069 : Data(Vec.empty() ? (T*)0 : &Vec[0]), Length(Vec.size()) {}
00070
00072 template <size_t N>
00073 ArrayRef(const T (&Arr)[N])
00074 : Data(Arr), Length(N) {}
00075
00079
00080 iterator begin() const { return Data; }
00081 iterator end() const { return Data + Length; }
00082
00084 bool empty() const { return Length == 0; }
00085
00086 const T *data() const { return Data; }
00087
00089 size_t size() const { return Length; }
00090
00092 const T &front() const {
00093 assert(!empty());
00094 return Data[0];
00095 }
00096
00098 const T &back() const {
00099 assert(!empty());
00100 return Data[Length-1];
00101 }
00102
00104 bool equals(ArrayRef RHS) const {
00105 if (Length != RHS.Length)
00106 return false;
00107 for (size_type i = 0; i != Length; i++)
00108 if (Data[i] != RHS.Data[i])
00109 return false;
00110 return true;
00111 }
00112
00114 ArrayRef<T> slice(unsigned N) {
00115 assert(N <= size() && "Invalid specifier");
00116 return ArrayRef<T>(data()+N, size()-N);
00117 }
00118
00121 ArrayRef<T> slice(unsigned N, unsigned M) {
00122 assert(N+M <= size() && "Invalid specifier");
00123 return ArrayRef<T>(data()+N, M);
00124 }
00125
00129 const T &operator[](size_t Index) const {
00130 assert(Index < Length && "Invalid index!");
00131 return Data[Index];
00132 }
00133
00137 std::vector<T> vec() const {
00138 return std::vector<T>(Data, Data+Length);
00139 }
00140
00144 operator std::vector<T>() const {
00145 return std::vector<T>(Data, Data+Length);
00146 }
00147
00149 };
00150
00153
00155 template<typename T>
00156 ArrayRef<T> makeArrayRef(const T &OneElt) {
00157 return OneElt;
00158 }
00159
00161 template<typename T>
00162 ArrayRef<T> makeArrayRef(const T *data, size_t length) {
00163 return ArrayRef<T>(data, length);
00164 }
00165
00167 template<typename T>
00168 ArrayRef<T> makeArrayRef(const T *begin, const T *end) {
00169 return ArrayRef<T>(begin, end);
00170 }
00171
00173 template <typename T>
00174 ArrayRef<T> makeArrayRef(const SmallVectorImpl<T> &Vec) {
00175 return Vec;
00176 }
00177
00179 template <typename T, unsigned N>
00180 ArrayRef<T> makeArrayRef(const SmallVector<T, N> &Vec) {
00181 return Vec;
00182 }
00183
00185 template<typename T>
00186 ArrayRef<T> makeArrayRef(const std::vector<T> &Vec) {
00187 return Vec;
00188 }
00189
00191 template<typename T, size_t N>
00192 ArrayRef<T> makeArrayRef(const T (&Arr)[N]) {
00193 return ArrayRef<T>(Arr);
00194 }
00195
00199
00200 template<typename T>
00201 inline bool operator==(ArrayRef<T> LHS, ArrayRef<T> RHS) {
00202 return LHS.equals(RHS);
00203 }
00204
00205 template<typename T>
00206 inline bool operator!=(ArrayRef<T> LHS, ArrayRef<T> RHS) {
00207 return !(LHS == RHS);
00208 }
00209
00211
00212
00213 template <typename T> struct isPodLike;
00214 template <typename T> struct isPodLike<ArrayRef<T> > {
00215 static const bool value = true;
00216 };
00217 }
00218
00219 #endif