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