ArrayRef.h revision 46ada15d425c0f075853adff14927bbfc7fc39dc
130660a898545416f0fea2d717f16f75640001e38Ted Kremenek//===--- ArrayRef.h - Array Reference Wrapper -------------------*- C++ -*-===// 230660a898545416f0fea2d717f16f75640001e38Ted Kremenek// 330660a898545416f0fea2d717f16f75640001e38Ted Kremenek// The LLVM Compiler Infrastructure 430660a898545416f0fea2d717f16f75640001e38Ted Kremenek// 530660a898545416f0fea2d717f16f75640001e38Ted Kremenek// This file is distributed under the University of Illinois Open Source 630660a898545416f0fea2d717f16f75640001e38Ted Kremenek// License. See LICENSE.TXT for details. 730660a898545416f0fea2d717f16f75640001e38Ted Kremenek// 830660a898545416f0fea2d717f16f75640001e38Ted Kremenek//===----------------------------------------------------------------------===// 930660a898545416f0fea2d717f16f75640001e38Ted Kremenek 1030660a898545416f0fea2d717f16f75640001e38Ted Kremenek#ifndef LLVM_ADT_ARRAYREF_H 113f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan Rose#define LLVM_ADT_ARRAYREF_H 1255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth 1330660a898545416f0fea2d717f16f75640001e38Ted Kremenek#include "llvm/ADT/SmallVector.h" 1430660a898545416f0fea2d717f16f75640001e38Ted Kremenek#include <vector> 1530660a898545416f0fea2d717f16f75640001e38Ted Kremenek 1630660a898545416f0fea2d717f16f75640001e38Ted Kremeneknamespace llvm { 1730660a898545416f0fea2d717f16f75640001e38Ted Kremenek 1830660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// ArrayRef - Represent a constant reference to an array (0 or more elements 1930660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// consecutively in memory), i.e. a start pointer and a length. It allows 2030660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// various APIs to take consecutive elements easily and conveniently. 2130660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// 2230660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// This class does not own the underlying data, it is expected to be used in 2330660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// situations where the data resides in some other buffer, whose lifetime 2430660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// extends past that of the ArrayRef. For this reason, it is not in general 2530660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// safe to store an ArrayRef. 2630660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// 27cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko /// This is intended to be trivially copyable, so it should be passed by 2830660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// value. 2930660a898545416f0fea2d717f16f75640001e38Ted Kremenek template<typename T> 3030660a898545416f0fea2d717f16f75640001e38Ted Kremenek class ArrayRef { 3130660a898545416f0fea2d717f16f75640001e38Ted Kremenek public: 3230660a898545416f0fea2d717f16f75640001e38Ted Kremenek typedef const T *iterator; 3330660a898545416f0fea2d717f16f75640001e38Ted Kremenek typedef const T *const_iterator; 3430660a898545416f0fea2d717f16f75640001e38Ted Kremenek typedef size_t size_type; 3530660a898545416f0fea2d717f16f75640001e38Ted Kremenek 3630660a898545416f0fea2d717f16f75640001e38Ted Kremenek private: 3730660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// The start of the array, in an external buffer. 3830660a898545416f0fea2d717f16f75640001e38Ted Kremenek const T *Data; 3930660a898545416f0fea2d717f16f75640001e38Ted Kremenek 4030660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// The number of elements. 4130660a898545416f0fea2d717f16f75640001e38Ted Kremenek size_type Length; 4230660a898545416f0fea2d717f16f75640001e38Ted Kremenek 4330660a898545416f0fea2d717f16f75640001e38Ted Kremenek public: 4430660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// @name Constructors 4530660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// @{ 4630660a898545416f0fea2d717f16f75640001e38Ted Kremenek 4730660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// Construct an empty ArrayRef. 4830660a898545416f0fea2d717f16f75640001e38Ted Kremenek /*implicit*/ ArrayRef() : Data(0), Length(0) {} 4930660a898545416f0fea2d717f16f75640001e38Ted Kremenek 5030660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// Construct an ArrayRef from a single element. 5130660a898545416f0fea2d717f16f75640001e38Ted Kremenek /*implicit*/ ArrayRef(const T &OneElt) 5230660a898545416f0fea2d717f16f75640001e38Ted Kremenek : Data(&OneElt), Length(1) {} 5330660a898545416f0fea2d717f16f75640001e38Ted Kremenek 5430660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// Construct an ArrayRef from a pointer and length. 5530660a898545416f0fea2d717f16f75640001e38Ted Kremenek /*implicit*/ ArrayRef(const T *data, size_t length) 5630660a898545416f0fea2d717f16f75640001e38Ted Kremenek : Data(data), Length(length) {} 5730660a898545416f0fea2d717f16f75640001e38Ted Kremenek 5830660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// Construct an ArrayRef from a range. 5930660a898545416f0fea2d717f16f75640001e38Ted Kremenek ArrayRef(const T *begin, const T *end) 6030660a898545416f0fea2d717f16f75640001e38Ted Kremenek : Data(begin), Length(end - begin) {} 6130660a898545416f0fea2d717f16f75640001e38Ted Kremenek 6230660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// Construct an ArrayRef from a SmallVector. 6330660a898545416f0fea2d717f16f75640001e38Ted Kremenek /*implicit*/ ArrayRef(const SmallVectorImpl<T> &Vec) 6430660a898545416f0fea2d717f16f75640001e38Ted Kremenek : Data(Vec.data()), Length(Vec.size()) {} 6530660a898545416f0fea2d717f16f75640001e38Ted Kremenek 6630660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// Construct an ArrayRef from a std::vector. 6730660a898545416f0fea2d717f16f75640001e38Ted Kremenek /*implicit*/ ArrayRef(const std::vector<T> &Vec) 6830660a898545416f0fea2d717f16f75640001e38Ted Kremenek : Data(Vec.empty() ? (T*)0 : &Vec[0]), Length(Vec.size()) {} 6930660a898545416f0fea2d717f16f75640001e38Ted Kremenek 7030660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// Construct an ArrayRef from a C array. 7130660a898545416f0fea2d717f16f75640001e38Ted Kremenek template <size_t N> 7230660a898545416f0fea2d717f16f75640001e38Ted Kremenek /*implicit*/ ArrayRef(const T (&Arr)[N]) 7330660a898545416f0fea2d717f16f75640001e38Ted Kremenek : Data(Arr), Length(N) {} 7430660a898545416f0fea2d717f16f75640001e38Ted Kremenek 7530660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// @} 7630660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// @name Simple Operations 7730660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// @{ 7830660a898545416f0fea2d717f16f75640001e38Ted Kremenek 7930660a898545416f0fea2d717f16f75640001e38Ted Kremenek iterator begin() const { return Data; } 8030660a898545416f0fea2d717f16f75640001e38Ted Kremenek iterator end() const { return Data + Length; } 8130660a898545416f0fea2d717f16f75640001e38Ted Kremenek 8230660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// empty - Check if the array is empty. 8330660a898545416f0fea2d717f16f75640001e38Ted Kremenek bool empty() const { return Length == 0; } 8430660a898545416f0fea2d717f16f75640001e38Ted Kremenek 8530660a898545416f0fea2d717f16f75640001e38Ted Kremenek const T *data() const { return Data; } 8630660a898545416f0fea2d717f16f75640001e38Ted Kremenek 8730660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// size - Get the array size. 8830660a898545416f0fea2d717f16f75640001e38Ted Kremenek size_t size() const { return Length; } 8930660a898545416f0fea2d717f16f75640001e38Ted Kremenek 9030660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// front - Get the first element. 9130660a898545416f0fea2d717f16f75640001e38Ted Kremenek const T &front() const { 92cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko assert(!empty()); 9330660a898545416f0fea2d717f16f75640001e38Ted Kremenek return Data[0]; 9430660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 9530660a898545416f0fea2d717f16f75640001e38Ted Kremenek 9630660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// back - Get the last element. 9730660a898545416f0fea2d717f16f75640001e38Ted Kremenek const T &back() const { 9830660a898545416f0fea2d717f16f75640001e38Ted Kremenek assert(!empty()); 9930660a898545416f0fea2d717f16f75640001e38Ted Kremenek return Data[Length-1]; 10030660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 10130660a898545416f0fea2d717f16f75640001e38Ted Kremenek 10230660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// equals - Check for element-wise equality. 10330660a898545416f0fea2d717f16f75640001e38Ted Kremenek bool equals(ArrayRef RHS) const { 104055b395294d190a432e9d87bb665634636a1418aArgyrios Kyrtzidis if (Length != RHS.Length) 105055b395294d190a432e9d87bb665634636a1418aArgyrios Kyrtzidis return false; 106055b395294d190a432e9d87bb665634636a1418aArgyrios Kyrtzidis for (size_type i = 0; i != Length; i++) 10730660a898545416f0fea2d717f16f75640001e38Ted Kremenek if (Data[i] != RHS.Data[i]) 108055b395294d190a432e9d87bb665634636a1418aArgyrios Kyrtzidis return false; 10930660a898545416f0fea2d717f16f75640001e38Ted Kremenek return true; 11030660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 11130660a898545416f0fea2d717f16f75640001e38Ted Kremenek 11230660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// slice(n) - Chop off the first N elements of the array. 11330660a898545416f0fea2d717f16f75640001e38Ted Kremenek ArrayRef<T> slice(unsigned N) const { 11430660a898545416f0fea2d717f16f75640001e38Ted Kremenek assert(N <= size() && "Invalid specifier"); 11530660a898545416f0fea2d717f16f75640001e38Ted Kremenek return ArrayRef<T>(data()+N, size()-N); 11630660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 11730660a898545416f0fea2d717f16f75640001e38Ted Kremenek 11830660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// slice(n, m) - Chop off the first N elements of the array, and keep M 11930660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// elements in the array. 12030660a898545416f0fea2d717f16f75640001e38Ted Kremenek ArrayRef<T> slice(unsigned N, unsigned M) const { 12130660a898545416f0fea2d717f16f75640001e38Ted Kremenek assert(N+M <= size() && "Invalid specifier"); 12230660a898545416f0fea2d717f16f75640001e38Ted Kremenek return ArrayRef<T>(data()+N, M); 12330660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 12430660a898545416f0fea2d717f16f75640001e38Ted Kremenek 12530660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// @} 12630660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// @name Operator Overloads 12730660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// @{ 12830660a898545416f0fea2d717f16f75640001e38Ted Kremenek const T &operator[](size_t Index) const { 12930660a898545416f0fea2d717f16f75640001e38Ted Kremenek assert(Index < Length && "Invalid index!"); 13030660a898545416f0fea2d717f16f75640001e38Ted Kremenek return Data[Index]; 13130660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 13230660a898545416f0fea2d717f16f75640001e38Ted Kremenek 13330660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// @} 13430660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// @name Expensive Operations 13530660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// @{ 13630660a898545416f0fea2d717f16f75640001e38Ted Kremenek std::vector<T> vec() const { 13730660a898545416f0fea2d717f16f75640001e38Ted Kremenek return std::vector<T>(Data, Data+Length); 13830660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 13930660a898545416f0fea2d717f16f75640001e38Ted Kremenek 14030660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// @} 14130660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// @name Conversion operators 14230660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// @{ 14330660a898545416f0fea2d717f16f75640001e38Ted Kremenek operator std::vector<T>() const { 14430660a898545416f0fea2d717f16f75640001e38Ted Kremenek return std::vector<T>(Data, Data+Length); 14530660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 14630660a898545416f0fea2d717f16f75640001e38Ted Kremenek 14730660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// @} 14830660a898545416f0fea2d717f16f75640001e38Ted Kremenek }; 14930660a898545416f0fea2d717f16f75640001e38Ted Kremenek 15030660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// MutableArrayRef - Represent a mutable reference to an array (0 or more 15130660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// elements consecutively in memory), i.e. a start pointer and a length. It 15230660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// allows various APIs to take and modify consecutive elements easily and 15330660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// conveniently. 15430660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// 15530660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// This class does not own the underlying data, it is expected to be used in 15630660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// situations where the data resides in some other buffer, whose lifetime 15730660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// extends past that of the MutableArrayRef. For this reason, it is not in 15830660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// general safe to store a MutableArrayRef. 15930660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// 16030660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// This is intended to be trivially copyable, so it should be passed by 16130660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// value. 16230660a898545416f0fea2d717f16f75640001e38Ted Kremenek template<typename T> 16330660a898545416f0fea2d717f16f75640001e38Ted Kremenek class MutableArrayRef : public ArrayRef<T> { 16430660a898545416f0fea2d717f16f75640001e38Ted Kremenek public: 16530660a898545416f0fea2d717f16f75640001e38Ted Kremenek typedef T *iterator; 16630660a898545416f0fea2d717f16f75640001e38Ted Kremenek 16730660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// Construct an empty ArrayRef. 16830660a898545416f0fea2d717f16f75640001e38Ted Kremenek /*implicit*/ MutableArrayRef() : ArrayRef<T>() {} 16930660a898545416f0fea2d717f16f75640001e38Ted Kremenek 17030660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// Construct an MutableArrayRef from a single element. 17130660a898545416f0fea2d717f16f75640001e38Ted Kremenek /*implicit*/ MutableArrayRef(T &OneElt) : ArrayRef<T>(OneElt) {} 17230660a898545416f0fea2d717f16f75640001e38Ted Kremenek 17330660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// Construct an MutableArrayRef from a pointer and length. 17430660a898545416f0fea2d717f16f75640001e38Ted Kremenek /*implicit*/ MutableArrayRef(T *data, size_t length) 17530660a898545416f0fea2d717f16f75640001e38Ted Kremenek : ArrayRef<T>(data, length) {} 17630660a898545416f0fea2d717f16f75640001e38Ted Kremenek 17730660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// Construct an MutableArrayRef from a range. 17830660a898545416f0fea2d717f16f75640001e38Ted Kremenek MutableArrayRef(T *begin, T *end) : ArrayRef<T>(begin, end) {} 17930660a898545416f0fea2d717f16f75640001e38Ted Kremenek 18030660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// Construct an MutableArrayRef from a SmallVector. 18130660a898545416f0fea2d717f16f75640001e38Ted Kremenek /*implicit*/ MutableArrayRef(SmallVectorImpl<T> &Vec) 18230660a898545416f0fea2d717f16f75640001e38Ted Kremenek : ArrayRef<T>(Vec) {} 18330660a898545416f0fea2d717f16f75640001e38Ted Kremenek 18430660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// Construct a MutableArrayRef from a std::vector. 18530660a898545416f0fea2d717f16f75640001e38Ted Kremenek /*implicit*/ MutableArrayRef(std::vector<T> &Vec) 18630660a898545416f0fea2d717f16f75640001e38Ted Kremenek : ArrayRef<T>(Vec) {} 18730660a898545416f0fea2d717f16f75640001e38Ted Kremenek 18830660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// Construct an MutableArrayRef from a C array. 18930660a898545416f0fea2d717f16f75640001e38Ted Kremenek template <size_t N> 19030660a898545416f0fea2d717f16f75640001e38Ted Kremenek /*implicit*/ MutableArrayRef(T (&Arr)[N]) 19130660a898545416f0fea2d717f16f75640001e38Ted Kremenek : ArrayRef<T>(Arr) {} 19230660a898545416f0fea2d717f16f75640001e38Ted Kremenek 19330660a898545416f0fea2d717f16f75640001e38Ted Kremenek T *data() const { return const_cast<T*>(ArrayRef<T>::data()); } 19430660a898545416f0fea2d717f16f75640001e38Ted Kremenek 19530660a898545416f0fea2d717f16f75640001e38Ted Kremenek iterator begin() const { return data(); } 19630660a898545416f0fea2d717f16f75640001e38Ted Kremenek iterator end() const { return data() + this->size(); } 19730660a898545416f0fea2d717f16f75640001e38Ted Kremenek 19830660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// front - Get the first element. 19930660a898545416f0fea2d717f16f75640001e38Ted Kremenek T &front() const { 20030660a898545416f0fea2d717f16f75640001e38Ted Kremenek assert(!this->empty()); 20130660a898545416f0fea2d717f16f75640001e38Ted Kremenek return data()[0]; 20230660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 20330660a898545416f0fea2d717f16f75640001e38Ted Kremenek 20430660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// back - Get the last element. 20530660a898545416f0fea2d717f16f75640001e38Ted Kremenek T &back() const { 20630660a898545416f0fea2d717f16f75640001e38Ted Kremenek assert(!this->empty()); 20730660a898545416f0fea2d717f16f75640001e38Ted Kremenek return data()[this->size()-1]; 20830660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 20930660a898545416f0fea2d717f16f75640001e38Ted Kremenek 21030660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// slice(n) - Chop off the first N elements of the array. 21130660a898545416f0fea2d717f16f75640001e38Ted Kremenek MutableArrayRef<T> slice(unsigned N) const { 21230660a898545416f0fea2d717f16f75640001e38Ted Kremenek assert(N <= this->size() && "Invalid specifier"); 21330660a898545416f0fea2d717f16f75640001e38Ted Kremenek return MutableArrayRef<T>(data()+N, this->size()-N); 21430660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 21530660a898545416f0fea2d717f16f75640001e38Ted Kremenek 21630660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// slice(n, m) - Chop off the first N elements of the array, and keep M 21730660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// elements in the array. 21830660a898545416f0fea2d717f16f75640001e38Ted Kremenek MutableArrayRef<T> slice(unsigned N, unsigned M) const { 21930660a898545416f0fea2d717f16f75640001e38Ted Kremenek assert(N+M <= this->size() && "Invalid specifier"); 22030660a898545416f0fea2d717f16f75640001e38Ted Kremenek return MutableArrayRef<T>(data()+N, M); 22130660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 22230660a898545416f0fea2d717f16f75640001e38Ted Kremenek 22330660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// @} 22430660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// @name Operator Overloads 22530660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// @{ 22630660a898545416f0fea2d717f16f75640001e38Ted Kremenek T &operator[](size_t Index) const { 22730660a898545416f0fea2d717f16f75640001e38Ted Kremenek assert(Index < this->size() && "Invalid index!"); 22830660a898545416f0fea2d717f16f75640001e38Ted Kremenek return data()[Index]; 22930660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 23030660a898545416f0fea2d717f16f75640001e38Ted Kremenek }; 23130660a898545416f0fea2d717f16f75640001e38Ted Kremenek 23230660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// @name ArrayRef Convenience constructors 23330660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// @{ 23430660a898545416f0fea2d717f16f75640001e38Ted Kremenek 23530660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// Construct an ArrayRef from a single element. 23630660a898545416f0fea2d717f16f75640001e38Ted Kremenek template<typename T> 23730660a898545416f0fea2d717f16f75640001e38Ted Kremenek ArrayRef<T> makeArrayRef(const T &OneElt) { 23830660a898545416f0fea2d717f16f75640001e38Ted Kremenek return OneElt; 23930660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 24030660a898545416f0fea2d717f16f75640001e38Ted Kremenek 24130660a898545416f0fea2d717f16f75640001e38Ted Kremenek /// Construct an ArrayRef from a pointer and length. 24230660a898545416f0fea2d717f16f75640001e38Ted Kremenek template<typename T> 2435964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis ArrayRef<T> makeArrayRef(const T *data, size_t length) { 2445964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis return ArrayRef<T>(data, length); 2453f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan Rose } 2465964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis 2473f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan Rose /// Construct an ArrayRef from a range. 2483f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan Rose template<typename T> 2495964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis ArrayRef<T> makeArrayRef(const T *begin, const T *end) { 2505964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis return ArrayRef<T>(begin, end); 2515964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis } 2525964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis 2535964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis /// Construct an ArrayRef from a SmallVector. 2545964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis template <typename T> 2555964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis ArrayRef<T> makeArrayRef(const SmallVectorImpl<T> &Vec) { 2565964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis return Vec; 2573f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan Rose } 2585964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis 2595964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis /// Construct an ArrayRef from a SmallVector. 2605964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis template <typename T, unsigned N> 2615964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis ArrayRef<T> makeArrayRef(const SmallVector<T, N> &Vec) { 2625964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis return Vec; 2635964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis } 2645964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis 2655964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis /// Construct an ArrayRef from a std::vector. 2665964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis template<typename T> 2675964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis ArrayRef<T> makeArrayRef(const std::vector<T> &Vec) { 2685964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis return Vec; 2695964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis } 2705964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis 2715964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis /// Construct an ArrayRef from a C array. 2725964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis template<typename T, size_t N> 2735964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis ArrayRef<T> makeArrayRef(const T (&Arr)[N]) { 2745964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis return ArrayRef<T>(Arr); 2755964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis } 2765964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis 2775964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis /// @} 2785964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis /// @name ArrayRef Comparison Operators 2795964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis /// @{ 2805964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis 2815964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis template<typename T> 2825964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis inline bool operator==(ArrayRef<T> LHS, ArrayRef<T> RHS) { 2835964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis return LHS.equals(RHS); 2845964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis } 2855964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis 2865964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis template<typename T> 2875964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis inline bool operator!=(ArrayRef<T> LHS, ArrayRef<T> RHS) { 2885964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis return !(LHS == RHS); 2895964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis } 2905964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis 2915964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis /// @} 2925964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis 2935964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis // ArrayRefs can be treated like a POD type. 2945964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis template <typename T> struct isPodLike; 2955964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis template <typename T> struct isPodLike<ArrayRef<T> > { 2965964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis static const bool value = true; 2975964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis }; 2985964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis} 2995964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis 3005964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis#endif 3015964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis