diff --git a/llvm/include/llvm/ADT/ArrayRef.h b/llvm/include/llvm/ADT/ArrayRef.h --- a/llvm/include/llvm/ADT/ArrayRef.h +++ b/llvm/include/llvm/ADT/ArrayRef.h @@ -65,35 +65,34 @@ /// @{ /// Construct an empty ArrayRef. - /*implicit*/ ArrayRef() = default; + /*implicit*/ constexpr ArrayRef() = default; /// Construct an empty ArrayRef from None. - /*implicit*/ ArrayRef(NoneType) {} + /*implicit*/ constexpr ArrayRef(NoneType) {} /// Construct an ArrayRef from a single element. - /*implicit*/ ArrayRef(const T &OneElt) - : Data(&OneElt), Length(1) {} + /*implicit*/ constexpr ArrayRef(const T &OneElt) + : Data(&OneElt), Length(1) {} /// Construct an ArrayRef from a pointer and length. - /*implicit*/ ArrayRef(const T *data, size_t length) - : Data(data), Length(length) {} + /*implicit*/ constexpr ArrayRef(const T *data, size_t length) + : Data(data), Length(length) {} /// Construct an ArrayRef from a range. - ArrayRef(const T *begin, const T *end) - : Data(begin), Length(end - begin) {} + constexpr ArrayRef(const T *begin, const T *end) + : Data(begin), Length(end - begin) {} /// Construct an ArrayRef from a SmallVector. This is templated in order to /// avoid instantiating SmallVectorTemplateCommon whenever we /// copy-construct an ArrayRef. - template - /*implicit*/ ArrayRef(const SmallVectorTemplateCommon &Vec) - : Data(Vec.data()), Length(Vec.size()) { - } + template + /*implicit*/ constexpr ArrayRef(const SmallVectorTemplateCommon &Vec) + : Data(Vec.data()), Length(Vec.size()) {} /// Construct an ArrayRef from a std::vector. - template - /*implicit*/ ArrayRef(const std::vector &Vec) - : Data(Vec.data()), Length(Vec.size()) {} + template + /*implicit*/ constexpr ArrayRef(const std::vector &Vec) + : Data(Vec.data()), Length(Vec.size()) {} /// Construct an ArrayRef from a std::array template @@ -122,16 +121,17 @@ /// Construct an ArrayRef from ArrayRef. This uses SFINAE to /// ensure that only ArrayRefs of pointers can be converted. template - ArrayRef(const ArrayRef &A, - std::enable_if_t::value> - * = nullptr) + constexpr ArrayRef( + const ArrayRef &A, + std::enable_if_t::value> * = + nullptr) : Data(A.data()), Length(A.size()) {} /// Construct an ArrayRef from a SmallVector. This is /// templated in order to avoid instantiating SmallVectorTemplateCommon /// whenever we copy-construct an ArrayRef. template - /*implicit*/ ArrayRef( + /*implicit*/ constexpr ArrayRef( const SmallVectorTemplateCommon &Vec, std::enable_if_t::value> * = nullptr) @@ -140,37 +140,42 @@ /// Construct an ArrayRef from std::vector. This uses SFINAE /// to ensure that only vectors of pointers can be converted. template - ArrayRef(const std::vector &Vec, - std::enable_if_t::value> - * = nullptr) + constexpr ArrayRef( + const std::vector &Vec, + std::enable_if_t::value> * = + nullptr) : Data(Vec.data()), Length(Vec.size()) {} /// @} /// @name Simple Operations /// @{ - iterator begin() const { return Data; } - iterator end() const { return Data + Length; } + constexpr iterator begin() const { return Data; } + constexpr iterator end() const { return Data + Length; } - reverse_iterator rbegin() const { return reverse_iterator(end()); } - reverse_iterator rend() const { return reverse_iterator(begin()); } + constexpr reverse_iterator rbegin() const { + return reverse_iterator(end()); + } + constexpr reverse_iterator rend() const { + return reverse_iterator(begin()); + } /// empty - Check if the array is empty. - bool empty() const { return Length == 0; } + constexpr bool empty() const { return Length == 0; } - const T *data() const { return Data; } + constexpr const T *data() const { return Data; } /// size - Get the array size. - size_t size() const { return Length; } + constexpr size_t size() const { return Length; } /// front - Get the first element. - const T &front() const { + constexpr const T &front() const { assert(!empty()); return Data[0]; } /// back - Get the last element. - const T &back() const { + constexpr const T &back() const { assert(!empty()); return Data[Length-1]; } @@ -183,7 +188,7 @@ } /// equals - Check for element-wise equality. - bool equals(ArrayRef RHS) const { + constexpr bool equals(ArrayRef RHS) const { if (Length != RHS.Length) return false; return std::equal(begin(), end(), RHS.begin()); @@ -191,47 +196,49 @@ /// slice(n, m) - Chop off the first N elements of the array, and keep M /// elements in the array. - ArrayRef slice(size_t N, size_t M) const { + constexpr ArrayRef slice(size_t N, size_t M) const { assert(N+M <= size() && "Invalid specifier"); return ArrayRef(data()+N, M); } /// slice(n) - Chop off the first N elements of the array. - ArrayRef slice(size_t N) const { return slice(N, size() - N); } + constexpr ArrayRef slice(size_t N) const { return slice(N, size() - N); } /// Drop the first \p N elements of the array. - ArrayRef drop_front(size_t N = 1) const { + constexpr ArrayRef drop_front(size_t N = 1) const { assert(size() >= N && "Dropping more elements than exist"); return slice(N, size() - N); } /// Drop the last \p N elements of the array. - ArrayRef drop_back(size_t N = 1) const { + constexpr ArrayRef drop_back(size_t N = 1) const { assert(size() >= N && "Dropping more elements than exist"); return slice(0, size() - N); } /// Return a copy of *this with the first N elements satisfying the /// given predicate removed. - template ArrayRef drop_while(PredicateT Pred) const { + template + constexpr ArrayRef drop_while(PredicateT Pred) const { return ArrayRef(find_if_not(*this, Pred), end()); } /// Return a copy of *this with the first N elements not satisfying /// the given predicate removed. - template ArrayRef drop_until(PredicateT Pred) const { + template + constexpr ArrayRef drop_until(PredicateT Pred) const { return ArrayRef(find_if(*this, Pred), end()); } /// Return a copy of *this with only the first \p N elements. - ArrayRef take_front(size_t N = 1) const { + constexpr ArrayRef take_front(size_t N = 1) const { if (N >= size()) return *this; return drop_back(size() - N); } /// Return a copy of *this with only the last \p N elements. - ArrayRef take_back(size_t N = 1) const { + constexpr ArrayRef take_back(size_t N = 1) const { if (N >= size()) return *this; return drop_front(size() - N); @@ -239,20 +246,22 @@ /// Return the first N elements of this Array that satisfy the given /// predicate. - template ArrayRef take_while(PredicateT Pred) const { + template + constexpr ArrayRef take_while(PredicateT Pred) const { return ArrayRef(begin(), find_if_not(*this, Pred)); } /// Return the first N elements of this Array that don't satisfy the /// given predicate. - template ArrayRef take_until(PredicateT Pred) const { + template + constexpr ArrayRef take_until(PredicateT Pred) const { return ArrayRef(begin(), find_if(*this, Pred)); } /// @} /// @name Operator Overloads /// @{ - const T &operator[](size_t Index) const { + constexpr const T &operator[](size_t Index) const { assert(Index < Length && "Invalid index!"); return Data[Index]; } @@ -318,28 +327,28 @@ using difference_type = ptrdiff_t; /// Construct an empty MutableArrayRef. - /*implicit*/ MutableArrayRef() = default; + /*implicit*/ constexpr MutableArrayRef() = default; /// Construct an empty MutableArrayRef from None. - /*implicit*/ MutableArrayRef(NoneType) : ArrayRef() {} + /*implicit*/ constexpr MutableArrayRef(NoneType) : ArrayRef() {} /// Construct a MutableArrayRef from a single element. - /*implicit*/ MutableArrayRef(T &OneElt) : ArrayRef(OneElt) {} + /*implicit*/ constexpr MutableArrayRef(T &OneElt) : ArrayRef(OneElt) {} /// Construct a MutableArrayRef from a pointer and length. - /*implicit*/ MutableArrayRef(T *data, size_t length) - : ArrayRef(data, length) {} + /*implicit*/ constexpr MutableArrayRef(T *data, size_t length) + : ArrayRef(data, length) {} /// Construct a MutableArrayRef from a range. - MutableArrayRef(T *begin, T *end) : ArrayRef(begin, end) {} + constexpr MutableArrayRef(T *begin, T *end) : ArrayRef(begin, end) {} /// Construct a MutableArrayRef from a SmallVector. - /*implicit*/ MutableArrayRef(SmallVectorImpl &Vec) - : ArrayRef(Vec) {} + /*implicit*/ constexpr MutableArrayRef(SmallVectorImpl &Vec) + : ArrayRef(Vec) {} /// Construct a MutableArrayRef from a std::vector. - /*implicit*/ MutableArrayRef(std::vector &Vec) - : ArrayRef(Vec) {} + /*implicit*/ constexpr MutableArrayRef(std::vector &Vec) + : ArrayRef(Vec) {} /// Construct a MutableArrayRef from a std::array template @@ -350,45 +359,49 @@ template /*implicit*/ constexpr MutableArrayRef(T (&Arr)[N]) : ArrayRef(Arr) {} - T *data() const { return const_cast(ArrayRef::data()); } + constexpr T *data() const { return const_cast(ArrayRef::data()); } - iterator begin() const { return data(); } - iterator end() const { return data() + this->size(); } + constexpr iterator begin() const { return data(); } + constexpr iterator end() const { return data() + this->size(); } - reverse_iterator rbegin() const { return reverse_iterator(end()); } - reverse_iterator rend() const { return reverse_iterator(begin()); } + constexpr reverse_iterator rbegin() const { + return reverse_iterator(end()); + } + constexpr reverse_iterator rend() const { + return reverse_iterator(begin()); + } /// front - Get the first element. - T &front() const { + constexpr T &front() const { assert(!this->empty()); return data()[0]; } /// back - Get the last element. - T &back() const { + constexpr T &back() const { assert(!this->empty()); return data()[this->size()-1]; } /// slice(n, m) - Chop off the first N elements of the array, and keep M /// elements in the array. - MutableArrayRef slice(size_t N, size_t M) const { + constexpr MutableArrayRef slice(size_t N, size_t M) const { assert(N + M <= this->size() && "Invalid specifier"); return MutableArrayRef(this->data() + N, M); } /// slice(n) - Chop off the first N elements of the array. - MutableArrayRef slice(size_t N) const { + constexpr MutableArrayRef slice(size_t N) const { return slice(N, this->size() - N); } /// Drop the first \p N elements of the array. - MutableArrayRef drop_front(size_t N = 1) const { + constexpr MutableArrayRef drop_front(size_t N = 1) const { assert(this->size() >= N && "Dropping more elements than exist"); return slice(N, this->size() - N); } - MutableArrayRef drop_back(size_t N = 1) const { + constexpr MutableArrayRef drop_back(size_t N = 1) const { assert(this->size() >= N && "Dropping more elements than exist"); return slice(0, this->size() - N); } @@ -396,26 +409,26 @@ /// Return a copy of *this with the first N elements satisfying the /// given predicate removed. template - MutableArrayRef drop_while(PredicateT Pred) const { + constexpr MutableArrayRef drop_while(PredicateT Pred) const { return MutableArrayRef(find_if_not(*this, Pred), end()); } /// Return a copy of *this with the first N elements not satisfying /// the given predicate removed. template - MutableArrayRef drop_until(PredicateT Pred) const { + constexpr MutableArrayRef drop_until(PredicateT Pred) const { return MutableArrayRef(find_if(*this, Pred), end()); } /// Return a copy of *this with only the first \p N elements. - MutableArrayRef take_front(size_t N = 1) const { + constexpr MutableArrayRef take_front(size_t N = 1) const { if (N >= this->size()) return *this; return drop_back(this->size() - N); } /// Return a copy of *this with only the last \p N elements. - MutableArrayRef take_back(size_t N = 1) const { + constexpr MutableArrayRef take_back(size_t N = 1) const { if (N >= this->size()) return *this; return drop_front(this->size() - N); @@ -424,21 +437,21 @@ /// Return the first N elements of this Array that satisfy the given /// predicate. template - MutableArrayRef take_while(PredicateT Pred) const { + constexpr MutableArrayRef take_while(PredicateT Pred) const { return MutableArrayRef(begin(), find_if_not(*this, Pred)); } /// Return the first N elements of this Array that don't satisfy the /// given predicate. template - MutableArrayRef take_until(PredicateT Pred) const { + constexpr MutableArrayRef take_until(PredicateT Pred) const { return MutableArrayRef(begin(), find_if(*this, Pred)); } /// @} /// @name Operator Overloads /// @{ - T &operator[](size_t Index) const { + constexpr T &operator[](size_t Index) const { assert(Index < this->size() && "Invalid index!"); return data()[Index]; } @@ -471,72 +484,72 @@ /// @{ /// Construct an ArrayRef from a single element. - template - ArrayRef makeArrayRef(const T &OneElt) { + template constexpr ArrayRef makeArrayRef(const T &OneElt) { return OneElt; } /// Construct an ArrayRef from a pointer and length. - template - ArrayRef makeArrayRef(const T *data, size_t length) { + template + constexpr ArrayRef makeArrayRef(const T *data, size_t length) { return ArrayRef(data, length); } /// Construct an ArrayRef from a range. - template - ArrayRef makeArrayRef(const T *begin, const T *end) { + template + constexpr ArrayRef makeArrayRef(const T *begin, const T *end) { return ArrayRef(begin, end); } /// Construct an ArrayRef from a SmallVector. template - ArrayRef makeArrayRef(const SmallVectorImpl &Vec) { + constexpr ArrayRef makeArrayRef(const SmallVectorImpl &Vec) { return Vec; } /// Construct an ArrayRef from a SmallVector. template - ArrayRef makeArrayRef(const SmallVector &Vec) { + constexpr ArrayRef makeArrayRef(const SmallVector &Vec) { return Vec; } /// Construct an ArrayRef from a std::vector. - template - ArrayRef makeArrayRef(const std::vector &Vec) { + template + constexpr ArrayRef makeArrayRef(const std::vector &Vec) { return Vec; } /// Construct an ArrayRef from a std::array. template - ArrayRef makeArrayRef(const std::array &Arr) { + constexpr ArrayRef makeArrayRef(const std::array &Arr) { return Arr; } /// Construct an ArrayRef from an ArrayRef (no-op) (const) - template ArrayRef makeArrayRef(const ArrayRef &Vec) { + template + constexpr ArrayRef makeArrayRef(const ArrayRef &Vec) { return Vec; } /// Construct an ArrayRef from an ArrayRef (no-op) - template ArrayRef &makeArrayRef(ArrayRef &Vec) { + template constexpr ArrayRef &makeArrayRef(ArrayRef &Vec) { return Vec; } /// Construct an ArrayRef from a C array. - template - ArrayRef makeArrayRef(const T (&Arr)[N]) { + template + ArrayRef constexpr makeArrayRef(const T (&Arr)[N]) { return ArrayRef(Arr); } /// Construct a MutableArrayRef from a single element. - template - MutableArrayRef makeMutableArrayRef(T &OneElt) { + template + MutableArrayRef constexpr makeMutableArrayRef(T &OneElt) { return OneElt; } /// Construct a MutableArrayRef from a pointer and length. - template - MutableArrayRef makeMutableArrayRef(T *data, size_t length) { + template + MutableArrayRef constexpr makeMutableArrayRef(T *data, size_t length) { return MutableArrayRef(data, length); } @@ -544,23 +557,23 @@ /// @name ArrayRef Comparison Operators /// @{ - template - inline bool operator==(ArrayRef LHS, ArrayRef RHS) { + template + inline constexpr bool operator==(ArrayRef LHS, ArrayRef RHS) { return LHS.equals(RHS); } template - inline bool operator==(SmallVectorImpl &LHS, ArrayRef RHS) { + inline constexpr bool operator==(SmallVectorImpl &LHS, ArrayRef RHS) { return ArrayRef(LHS).equals(RHS); } template - inline bool operator!=(ArrayRef LHS, ArrayRef RHS) { + inline constexpr bool operator!=(ArrayRef LHS, ArrayRef RHS) { return !(LHS == RHS); } template - inline bool operator!=(SmallVectorImpl &LHS, ArrayRef RHS) { + inline constexpr bool operator!=(SmallVectorImpl &LHS, ArrayRef RHS) { return !(LHS == RHS); }