ArrayRef.h revision 75831904220042260c4faece8507a2807acba47f
1//===--- ArrayRef.h - Array Reference Wrapper -------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLVM_ADT_ARRAYREF_H
11#define LLVM_ADT_ARRAYREF_H
12
13#include "llvm/ADT/SmallVector.h"
14#include <vector>
15
16namespace llvm {
17  class APInt;
18
19  /// ArrayRef - Represent a constant reference to an array (0 or more elements
20  /// consequtively in memory), i.e. a start pointer and a length.  It allows
21  /// various APIs to take consequtive elements easily and conveniently.
22  ///
23  /// This class does not own the underlying data, it is expected to be used in
24  /// situations where the data resides in some other buffer, whose lifetime
25  /// extends past that of the StringRef. For this reason, it is not in general
26  /// safe to store a ArrayRef.
27  ///
28  /// This is intended to be trivially copyable, so it should be passed by
29  /// value.
30  template<typename T>
31  class ArrayRef {
32  public:
33    typedef const T *iterator;
34    typedef const T *const_iterator;
35    typedef size_t size_type;
36
37  private:
38    /// The start of the array, in an external buffer.
39    const T *Data;
40
41    /// The number of elements.
42    size_t Length;
43
44  public:
45    /// @name Constructors
46    /// @{
47
48    /// Construct an empty ArrayRef.
49    /*implicit*/ ArrayRef() : Data(0), Length(0) {}
50
51    /// Construct an ArrayRef from a single element.
52    /*implicit*/ ArrayRef(const T &OneElt)
53      : Data(&OneElt), Length(1) {}
54
55    /// Construct an ArrayRef from a pointer and length.
56    /*implicit*/ ArrayRef(T *data, size_t length)
57      : Data(data), Length(length) {}
58
59    /// Construct an ArrayRef from a SmallVector.
60    /*implicit*/ ArrayRef(const SmallVectorImpl<T> &Vec)
61      : Data(Vec.data()), Length(Vec.size()) {}
62
63    /// Construct an ArrayRef from a std::vector.
64    /*implicit*/ ArrayRef(const std::vector<T> &Vec)
65      : Data(Vec.empty() ? (T*)0 : &Vec[0]), Length(Vec.size()) {}
66
67    // TODO: C arrays.
68
69    /// @}
70    /// @name Simple Operations
71    /// @{
72
73    iterator begin() const { return Data; }
74    iterator end() const { return Data + Length; }
75
76    /// empty - Check if the string is empty.
77    bool empty() const { return Length == 0; }
78
79    /// size - Get the string size.
80    size_t size() const { return Length; }
81
82    /// front - Get the first element.
83    const T &front() const {
84      assert(!empty());
85      return Data[0];
86    }
87
88    /// back - Get the last character in the string.
89    const T &back() const {
90      assert(!empty());
91      return Data[Length-1];
92    }
93
94    /// @}
95    /// @name Operator Overloads
96    /// @{
97
98    char operator[](size_t Index) const {
99      assert(Index < Length && "Invalid index!");
100      return Data[Index];
101    }
102
103    /// @}
104    /// @name Expensive Operations
105    /// @{
106
107    std::vector<T> vec() const {
108      return std::vector<T>(Data, Data+Length);
109    }
110
111    /// @}
112  };
113
114  // ArrayRefs can be treated like a POD type.
115  template <typename T> struct isPodLike;
116  template <typename T> struct isPodLike<ArrayRef<T> > {
117    static const bool value = true;
118  };
119}
120
121#endif
122