ArrayRef.h revision 04b2f0d99feb9cdf87eb8f35483816d757d170dd
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 132b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner#include "llvm/ADT/SmallVector.h" 142b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner#include <vector> 152b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 162b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattnernamespace llvm { 172b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner class APInt; 182b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 192b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// ArrayRef - Represent a constant reference to an array (0 or more elements 2004df049014396fe97a31bf3fa8951201b2ed8ffeChris Lattner /// consecutively in memory), i.e. a start pointer and a length. It allows 2104df049014396fe97a31bf3fa8951201b2ed8ffeChris Lattner /// various APIs to take consecutive elements easily and conveniently. 222b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// 232b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// This class does not own the underlying data, it is expected to be used in 242b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// situations where the data resides in some other buffer, whose lifetime 252b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// extends past that of the StringRef. For this reason, it is not in general 262b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// safe to store a ArrayRef. 272b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// 282b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// This is intended to be trivially copyable, so it should be passed by 292b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// value. 302b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner template<typename T> 312b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner class ArrayRef { 322b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner public: 332b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner typedef const T *iterator; 342b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner typedef const T *const_iterator; 352b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner typedef size_t size_type; 362b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 372b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner private: 382b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// The start of the array, in an external buffer. 392b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner const T *Data; 402b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 412b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// The number of elements. 422b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner size_t Length; 432b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 442b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner public: 452b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @name Constructors 462b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @{ 472b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 482b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// Construct an empty ArrayRef. 492b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /*implicit*/ ArrayRef() : Data(0), Length(0) {} 502b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 512b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// Construct an ArrayRef from a single element. 522b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /*implicit*/ ArrayRef(const T &OneElt) 532b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner : Data(&OneElt), Length(1) {} 542b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 552b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// Construct an ArrayRef from a pointer and length. 5604df049014396fe97a31bf3fa8951201b2ed8ffeChris Lattner /*implicit*/ ArrayRef(const T *data, size_t length) 572b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner : Data(data), Length(length) {} 582b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 592b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// Construct an ArrayRef from a SmallVector. 602b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /*implicit*/ ArrayRef(const SmallVectorImpl<T> &Vec) 612b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner : Data(Vec.data()), Length(Vec.size()) {} 622b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 632b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// Construct an ArrayRef from a std::vector. 642b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /*implicit*/ ArrayRef(const std::vector<T> &Vec) 652b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner : Data(Vec.empty() ? (T*)0 : &Vec[0]), Length(Vec.size()) {} 662b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 672b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner // TODO: C arrays. 682b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 692b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @} 702b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @name Simple Operations 712b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @{ 722b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 732b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner iterator begin() const { return Data; } 742b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner iterator end() const { return Data + Length; } 752b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 7604b2f0d99feb9cdf87eb8f35483816d757d170ddChris Lattner /// empty - Check if the array is empty. 772b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner bool empty() const { return Length == 0; } 782b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 7904b2f0d99feb9cdf87eb8f35483816d757d170ddChris Lattner /// size - Get the array size. 802b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner size_t size() const { return Length; } 812b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 822b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// front - Get the first element. 832b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner const T &front() const { 842b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner assert(!empty()); 852b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner return Data[0]; 862b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner } 872b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 8804df049014396fe97a31bf3fa8951201b2ed8ffeChris Lattner /// back - Get the last element. 892b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner const T &back() const { 902b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner assert(!empty()); 912b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner return Data[Length-1]; 922b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner } 932b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 942b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @} 952b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @name Operator Overloads 962b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @{ 972b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 9804df049014396fe97a31bf3fa8951201b2ed8ffeChris Lattner const T &operator[](size_t Index) const { 992b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner assert(Index < Length && "Invalid index!"); 1002b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner return Data[Index]; 1012b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner } 1022b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 1032b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @} 1042b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @name Expensive Operations 1052b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @{ 1062b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 1072b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner std::vector<T> vec() const { 1082b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner return std::vector<T>(Data, Data+Length); 1092b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner } 1102b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 1112b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner /// @} 1122b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner }; 1132b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 1142b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner // ArrayRefs can be treated like a POD type. 1152b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner template <typename T> struct isPodLike; 1162b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner template <typename T> struct isPodLike<ArrayRef<T> > { 1172b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner static const bool value = true; 1182b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner }; 1192b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner} 1202b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner 1212b9bc422a5e6840f5b925316bc06d5943deb610aChris Lattner#endif 122