ArrayRef.h revision 36b56886974eae4f9c5ebc96befd3e7bfe5de338
12b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner//===--- ArrayRef.h - Array Reference Wrapper -------------------*- C++ -*-===// 22b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner// 32b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner// The LLVM Compiler Infrastructure 42b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner// 52b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner// This file is distributed under the University of Illinois Open Source 62b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner// License. See LICENSE.TXT for details. 72b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner// 82b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner//===----------------------------------------------------------------------===// 92b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 102b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner#ifndef LLVM_ADT_ARRAYREF_H 112b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner#define LLVM_ADT_ARRAYREF_H 122b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 135c332dbd30d9398ed25b30c3080506f7b8e92290Dmitri Gribenko#include "llvm/ADT/None.h" 142b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner#include "llvm/ADT/SmallVector.h" 1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/Allocator.h" 162b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner#include <vector> 172b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 182b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattnernamespace llvm { 19fced2945995b4fd8f28f7dec9fcb5a6ab2e2798dJakub Staszak 202b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// ArrayRef - Represent a constant reference to an array (0 or more elements 2104df049014396fe97a31bf3fa8951201b2ed8ffeChris Lattner /// consecutively in memory), i.e. a start pointer and a length. It allows 2204df049014396fe97a31bf3fa8951201b2ed8ffeChris Lattner /// various APIs to take consecutive elements easily and conveniently. 232b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// 242b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// This class does not own the underlying data, it is expected to be used in 252b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// situations where the data resides in some other buffer, whose lifetime 26715c80a00b965f19ca2c7dacbc2f809221cc2730Jay Foad /// extends past that of the ArrayRef. For this reason, it is not in general 27715c80a00b965f19ca2c7dacbc2f809221cc2730Jay Foad /// safe to store an ArrayRef. 282b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// 292b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// This is intended to be trivially copyable, so it should be passed by 302b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// value. 312b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner template<typename T> 322b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner class ArrayRef { 332b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner public: 342b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner typedef const T *iterator; 352b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner typedef const T *const_iterator; 362b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner typedef size_t size_type; 37fced2945995b4fd8f28f7dec9fcb5a6ab2e2798dJakub Staszak 38827de0520ee986fcda5f0d3290a3746249fa5847Andrew Trick typedef std::reverse_iterator<iterator> reverse_iterator; 39827de0520ee986fcda5f0d3290a3746249fa5847Andrew Trick 402b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner private: 412b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// The start of the array, in an external buffer. 422b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner const T *Data; 43fced2945995b4fd8f28f7dec9fcb5a6ab2e2798dJakub Staszak 442b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// The number of elements. 455d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad size_type Length; 46fced2945995b4fd8f28f7dec9fcb5a6ab2e2798dJakub Staszak 472b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner public: 482b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @name Constructors 492b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @{ 50fced2945995b4fd8f28f7dec9fcb5a6ab2e2798dJakub Staszak 512b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// Construct an empty ArrayRef. 522b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /*implicit*/ ArrayRef() : Data(0), Length(0) {} 53fced2945995b4fd8f28f7dec9fcb5a6ab2e2798dJakub Staszak 545c332dbd30d9398ed25b30c3080506f7b8e92290Dmitri Gribenko /// Construct an empty ArrayRef from None. 555c332dbd30d9398ed25b30c3080506f7b8e92290Dmitri Gribenko /*implicit*/ ArrayRef(NoneType) : Data(0), Length(0) {} 565c332dbd30d9398ed25b30c3080506f7b8e92290Dmitri Gribenko 572b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// Construct an ArrayRef from a single element. 582b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /*implicit*/ ArrayRef(const T &OneElt) 592b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner : Data(&OneElt), Length(1) {} 60fced2945995b4fd8f28f7dec9fcb5a6ab2e2798dJakub Staszak 612b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// Construct an ArrayRef from a pointer and length. 6204df049014396fe97a31bf3fa8951201b2ed8ffeChris Lattner /*implicit*/ ArrayRef(const T *data, size_t length) 632b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner : Data(data), Length(length) {} 64fced2945995b4fd8f28f7dec9fcb5a6ab2e2798dJakub Staszak 655d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad /// Construct an ArrayRef from a range. 665d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad ArrayRef(const T *begin, const T *end) 675d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad : Data(begin), Length(end - begin) {} 68fced2945995b4fd8f28f7dec9fcb5a6ab2e2798dJakub Staszak 69bc363931085587bac42a40653962a3e5acd1ffceRichard Smith /// Construct an ArrayRef from a SmallVector. This is templated in order to 70bc363931085587bac42a40653962a3e5acd1ffceRichard Smith /// avoid instantiating SmallVectorTemplateCommon<T> whenever we 71bc363931085587bac42a40653962a3e5acd1ffceRichard Smith /// copy-construct an ArrayRef. 72bc363931085587bac42a40653962a3e5acd1ffceRichard Smith template<typename U> 73bc363931085587bac42a40653962a3e5acd1ffceRichard Smith /*implicit*/ ArrayRef(const SmallVectorTemplateCommon<T, U> &Vec) 74bc363931085587bac42a40653962a3e5acd1ffceRichard Smith : Data(Vec.data()), Length(Vec.size()) { 75bc363931085587bac42a40653962a3e5acd1ffceRichard Smith } 762b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 772b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// Construct an ArrayRef from a std::vector. 78bc363931085587bac42a40653962a3e5acd1ffceRichard Smith template<typename A> 79bc363931085587bac42a40653962a3e5acd1ffceRichard Smith /*implicit*/ ArrayRef(const std::vector<T, A> &Vec) 8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines : Data(Vec.data()), Length(Vec.size()) {} 81fced2945995b4fd8f28f7dec9fcb5a6ab2e2798dJakub Staszak 82438208e8cb29c67b2177619a339b84291729b6b7Frits van Bommel /// Construct an ArrayRef from a C array. 83438208e8cb29c67b2177619a339b84291729b6b7Frits van Bommel template <size_t N> 842f02ded68a114410f11bc2f4e901d0d8e5850de1Alexander Kornienko /*implicit*/ LLVM_CONSTEXPR ArrayRef(const T (&Arr)[N]) 85438208e8cb29c67b2177619a339b84291729b6b7Frits van Bommel : Data(Arr), Length(N) {} 86fced2945995b4fd8f28f7dec9fcb5a6ab2e2798dJakub Staszak 8743ed63bc8310758d2a80deecb2e470f383ca5691Pete Cooper#if LLVM_HAS_INITIALIZER_LISTS 8843ed63bc8310758d2a80deecb2e470f383ca5691Pete Cooper /// Construct an ArrayRef from a std::initializer_list. 8943ed63bc8310758d2a80deecb2e470f383ca5691Pete Cooper /*implicit*/ ArrayRef(const std::initializer_list<T> &Vec) 9043ed63bc8310758d2a80deecb2e470f383ca5691Pete Cooper : Data(Vec.begin() == Vec.end() ? (T*)0 : Vec.begin()), 9143ed63bc8310758d2a80deecb2e470f383ca5691Pete Cooper Length(Vec.size()) {} 9243ed63bc8310758d2a80deecb2e470f383ca5691Pete Cooper#endif 9343ed63bc8310758d2a80deecb2e470f383ca5691Pete Cooper 942b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @} 952b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @name Simple Operations 962b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @{ 972b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 982b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner iterator begin() const { return Data; } 992b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner iterator end() const { return Data + Length; } 100fced2945995b4fd8f28f7dec9fcb5a6ab2e2798dJakub Staszak 101827de0520ee986fcda5f0d3290a3746249fa5847Andrew Trick reverse_iterator rbegin() const { return reverse_iterator(end()); } 102827de0520ee986fcda5f0d3290a3746249fa5847Andrew Trick reverse_iterator rend() const { return reverse_iterator(begin()); } 103827de0520ee986fcda5f0d3290a3746249fa5847Andrew Trick 10404b2f0d99feb9cdf87eb8f35483816d757d170ddChris Lattner /// empty - Check if the array is empty. 1052b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner bool empty() const { return Length == 0; } 106fced2945995b4fd8f28f7dec9fcb5a6ab2e2798dJakub Staszak 107878ad7afa512ef300d5df4e7ca0189775342dfc2Chris Lattner const T *data() const { return Data; } 108fced2945995b4fd8f28f7dec9fcb5a6ab2e2798dJakub Staszak 10904b2f0d99feb9cdf87eb8f35483816d757d170ddChris Lattner /// size - Get the array size. 1102b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner size_t size() const { return Length; } 111fced2945995b4fd8f28f7dec9fcb5a6ab2e2798dJakub Staszak 1122b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// front - Get the first element. 1132b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner const T &front() const { 1142b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner assert(!empty()); 1152b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner return Data[0]; 1162b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner } 117fced2945995b4fd8f28f7dec9fcb5a6ab2e2798dJakub Staszak 11804df049014396fe97a31bf3fa8951201b2ed8ffeChris Lattner /// back - Get the last element. 1192b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner const T &back() const { 1202b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner assert(!empty()); 1212b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner return Data[Length-1]; 1222b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner } 123fced2945995b4fd8f28f7dec9fcb5a6ab2e2798dJakub Staszak 12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // copy - Allocate copy in BumpPtrAllocator and return ArrayRef<T> to it. 12536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ArrayRef<T> copy(BumpPtrAllocator &Allocator) { 12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines T *Buff = Allocator.Allocate<T>(Length); 12736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::copy(begin(), end(), Buff); 12836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return ArrayRef<T>(Buff, Length); 12936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 13036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1315d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad /// equals - Check for element-wise equality. 1325d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad bool equals(ArrayRef RHS) const { 1335d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad if (Length != RHS.Length) 1345d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad return false; 1355d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad for (size_type i = 0; i != Length; i++) 1365d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad if (Data[i] != RHS.Data[i]) 1375d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad return false; 1385d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad return true; 1395d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad } 1405d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad 141fa09685a9aa17dbdd4c72ad032684debb25feb0bChris Lattner /// slice(n) - Chop off the first N elements of the array. 1421752e45de9914cb52d748c1052ecd2f1414bced4Chris Lattner ArrayRef<T> slice(unsigned N) const { 143fa09685a9aa17dbdd4c72ad032684debb25feb0bChris Lattner assert(N <= size() && "Invalid specifier"); 144fa09685a9aa17dbdd4c72ad032684debb25feb0bChris Lattner return ArrayRef<T>(data()+N, size()-N); 145fa09685a9aa17dbdd4c72ad032684debb25feb0bChris Lattner } 146fa09685a9aa17dbdd4c72ad032684debb25feb0bChris Lattner 147fa09685a9aa17dbdd4c72ad032684debb25feb0bChris Lattner /// slice(n, m) - Chop off the first N elements of the array, and keep M 148fa09685a9aa17dbdd4c72ad032684debb25feb0bChris Lattner /// elements in the array. 1491752e45de9914cb52d748c1052ecd2f1414bced4Chris Lattner ArrayRef<T> slice(unsigned N, unsigned M) const { 150fa09685a9aa17dbdd4c72ad032684debb25feb0bChris Lattner assert(N+M <= size() && "Invalid specifier"); 151fa09685a9aa17dbdd4c72ad032684debb25feb0bChris Lattner return ArrayRef<T>(data()+N, M); 152fa09685a9aa17dbdd4c72ad032684debb25feb0bChris Lattner } 153fced2945995b4fd8f28f7dec9fcb5a6ab2e2798dJakub Staszak 1542b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @} 1552b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @name Operator Overloads 1562b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @{ 15704df049014396fe97a31bf3fa8951201b2ed8ffeChris Lattner const T &operator[](size_t Index) const { 1582b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner assert(Index < Length && "Invalid index!"); 1592b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner return Data[Index]; 1602b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner } 161fced2945995b4fd8f28f7dec9fcb5a6ab2e2798dJakub Staszak 1622b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @} 1632b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @name Expensive Operations 1642b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @{ 1652b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner std::vector<T> vec() const { 1662b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner return std::vector<T>(Data, Data+Length); 1672b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner } 168fced2945995b4fd8f28f7dec9fcb5a6ab2e2798dJakub Staszak 1692b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @} 1702a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foad /// @name Conversion operators 1712a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foad /// @{ 1722a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foad operator std::vector<T>() const { 1732a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foad return std::vector<T>(Data, Data+Length); 1742a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foad } 175fced2945995b4fd8f28f7dec9fcb5a6ab2e2798dJakub Staszak 1762a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foad /// @} 1772b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner }; 178c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel 17946ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// MutableArrayRef - Represent a mutable reference to an array (0 or more 18046ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// elements consecutively in memory), i.e. a start pointer and a length. It 18146ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// allows various APIs to take and modify consecutive elements easily and 18246ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// conveniently. 18346ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// 18446ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// This class does not own the underlying data, it is expected to be used in 18546ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// situations where the data resides in some other buffer, whose lifetime 18646ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// extends past that of the MutableArrayRef. For this reason, it is not in 18746ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// general safe to store a MutableArrayRef. 18846ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// 18946ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// This is intended to be trivially copyable, so it should be passed by 19046ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// value. 19146ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner template<typename T> 19246ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner class MutableArrayRef : public ArrayRef<T> { 19346ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner public: 19446ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner typedef T *iterator; 19546ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner 19690b81731c1a9bc126d0b29321b3513c9b85f8414Bill Wendling typedef std::reverse_iterator<iterator> reverse_iterator; 19790b81731c1a9bc126d0b29321b3513c9b85f8414Bill Wendling 1985c332dbd30d9398ed25b30c3080506f7b8e92290Dmitri Gribenko /// Construct an empty MutableArrayRef. 19946ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /*implicit*/ MutableArrayRef() : ArrayRef<T>() {} 2002f0a4e1aadfa227ed2565e532f0d1a3cf8e8efa5Andrew Trick 2015c332dbd30d9398ed25b30c3080506f7b8e92290Dmitri Gribenko /// Construct an empty MutableArrayRef from None. 2025c332dbd30d9398ed25b30c3080506f7b8e92290Dmitri Gribenko /*implicit*/ MutableArrayRef(NoneType) : ArrayRef<T>() {} 2035c332dbd30d9398ed25b30c3080506f7b8e92290Dmitri Gribenko 20446ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// Construct an MutableArrayRef from a single element. 20546ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /*implicit*/ MutableArrayRef(T &OneElt) : ArrayRef<T>(OneElt) {} 2062f0a4e1aadfa227ed2565e532f0d1a3cf8e8efa5Andrew Trick 20746ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// Construct an MutableArrayRef from a pointer and length. 20846ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /*implicit*/ MutableArrayRef(T *data, size_t length) 20946ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner : ArrayRef<T>(data, length) {} 2102f0a4e1aadfa227ed2565e532f0d1a3cf8e8efa5Andrew Trick 21146ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// Construct an MutableArrayRef from a range. 21246ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner MutableArrayRef(T *begin, T *end) : ArrayRef<T>(begin, end) {} 2132f0a4e1aadfa227ed2565e532f0d1a3cf8e8efa5Andrew Trick 21446ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// Construct an MutableArrayRef from a SmallVector. 21546ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /*implicit*/ MutableArrayRef(SmallVectorImpl<T> &Vec) 21646ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner : ArrayRef<T>(Vec) {} 2172f0a4e1aadfa227ed2565e532f0d1a3cf8e8efa5Andrew Trick 21846ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// Construct a MutableArrayRef from a std::vector. 21946ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /*implicit*/ MutableArrayRef(std::vector<T> &Vec) 22046ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner : ArrayRef<T>(Vec) {} 2212f0a4e1aadfa227ed2565e532f0d1a3cf8e8efa5Andrew Trick 22246ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// Construct an MutableArrayRef from a C array. 22346ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner template <size_t N> 22446ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /*implicit*/ MutableArrayRef(T (&Arr)[N]) 22546ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner : ArrayRef<T>(Arr) {} 2262f0a4e1aadfa227ed2565e532f0d1a3cf8e8efa5Andrew Trick 22746ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner T *data() const { return const_cast<T*>(ArrayRef<T>::data()); } 22846ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner 22946ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner iterator begin() const { return data(); } 23046ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner iterator end() const { return data() + this->size(); } 2312f0a4e1aadfa227ed2565e532f0d1a3cf8e8efa5Andrew Trick 23290b81731c1a9bc126d0b29321b3513c9b85f8414Bill Wendling reverse_iterator rbegin() const { return reverse_iterator(end()); } 23390b81731c1a9bc126d0b29321b3513c9b85f8414Bill Wendling reverse_iterator rend() const { return reverse_iterator(begin()); } 23490b81731c1a9bc126d0b29321b3513c9b85f8414Bill Wendling 23546ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// front - Get the first element. 23646ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner T &front() const { 23746ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner assert(!this->empty()); 23846ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner return data()[0]; 23946ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner } 2402f0a4e1aadfa227ed2565e532f0d1a3cf8e8efa5Andrew Trick 24146ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// back - Get the last element. 24246ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner T &back() const { 24346ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner assert(!this->empty()); 24446ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner return data()[this->size()-1]; 24546ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner } 24646ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner 24746ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// slice(n) - Chop off the first N elements of the array. 24846ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner MutableArrayRef<T> slice(unsigned N) const { 24946ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner assert(N <= this->size() && "Invalid specifier"); 25046ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner return MutableArrayRef<T>(data()+N, this->size()-N); 25146ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner } 2522f0a4e1aadfa227ed2565e532f0d1a3cf8e8efa5Andrew Trick 25346ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// slice(n, m) - Chop off the first N elements of the array, and keep M 25446ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// elements in the array. 25546ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner MutableArrayRef<T> slice(unsigned N, unsigned M) const { 25646ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner assert(N+M <= this->size() && "Invalid specifier"); 25746ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner return MutableArrayRef<T>(data()+N, M); 25846ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner } 2592f0a4e1aadfa227ed2565e532f0d1a3cf8e8efa5Andrew Trick 26046ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// @} 26146ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// @name Operator Overloads 26246ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner /// @{ 26346ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner T &operator[](size_t Index) const { 26446ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner assert(Index < this->size() && "Invalid index!"); 26546ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner return data()[Index]; 26646ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner } 26746ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner }; 26846ada15d425c0f075853adff14927bbfc7fc39dcChris Lattner 269c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel /// @name ArrayRef Convenience constructors 270c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel /// @{ 271c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel 272c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel /// Construct an ArrayRef from a single element. 273c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel template<typename T> 274c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel ArrayRef<T> makeArrayRef(const T &OneElt) { 275c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel return OneElt; 276c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel } 277c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel 278c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel /// Construct an ArrayRef from a pointer and length. 279c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel template<typename T> 280c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel ArrayRef<T> makeArrayRef(const T *data, size_t length) { 281c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel return ArrayRef<T>(data, length); 282c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel } 283c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel 284c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel /// Construct an ArrayRef from a range. 285c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel template<typename T> 286c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel ArrayRef<T> makeArrayRef(const T *begin, const T *end) { 287c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel return ArrayRef<T>(begin, end); 288c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel } 289c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel 290c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel /// Construct an ArrayRef from a SmallVector. 291c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel template <typename T> 292c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel ArrayRef<T> makeArrayRef(const SmallVectorImpl<T> &Vec) { 293c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel return Vec; 294c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel } 295c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel 296c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel /// Construct an ArrayRef from a SmallVector. 297c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel template <typename T, unsigned N> 298c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel ArrayRef<T> makeArrayRef(const SmallVector<T, N> &Vec) { 299c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel return Vec; 300c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel } 301c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel 302c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel /// Construct an ArrayRef from a std::vector. 303c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel template<typename T> 304c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel ArrayRef<T> makeArrayRef(const std::vector<T> &Vec) { 305c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel return Vec; 306c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel } 307c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel 308c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel /// Construct an ArrayRef from a C array. 309c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel template<typename T, size_t N> 310c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel ArrayRef<T> makeArrayRef(const T (&Arr)[N]) { 311f6275309994dea2ec852c1f539875ae643646ec5Frits van Bommel return ArrayRef<T>(Arr); 312c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel } 313c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel 314c48e1ef0e22b4113dd4dd48c5b170a19fe4d0188Frits van Bommel /// @} 3155d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad /// @name ArrayRef Comparison Operators 3165d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad /// @{ 3175d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad 3185d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad template<typename T> 3195d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad inline bool operator==(ArrayRef<T> LHS, ArrayRef<T> RHS) { 3205d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad return LHS.equals(RHS); 3215d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad } 3225d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad 3235d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad template<typename T> 3245d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad inline bool operator!=(ArrayRef<T> LHS, ArrayRef<T> RHS) { 3255d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad return !(LHS == RHS); 3265d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad } 3275d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad 3285d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad /// @} 3295d4f9909c49d28db9572acc4513c1a695b0c53daJay Foad 3302b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner // ArrayRefs can be treated like a POD type. 3312b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner template <typename T> struct isPodLike; 3322b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner template <typename T> struct isPodLike<ArrayRef<T> > { 3332b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner static const bool value = true; 3342b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner }; 3352b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner} 3362f0a4e1aadfa227ed2565e532f0d1a3cf8e8efa5Andrew Trick 3372b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner#endif 338