diff options
Diffstat (limited to 'include/llvm/ADT/ArrayRef.h')
| -rw-r--r-- | include/llvm/ADT/ArrayRef.h | 44 | 
1 files changed, 28 insertions, 16 deletions
diff --git a/include/llvm/ADT/ArrayRef.h b/include/llvm/ADT/ArrayRef.h index 6b35d0aec8b2..925ebafc3fed 100644 --- a/include/llvm/ADT/ArrayRef.h +++ b/include/llvm/ADT/ArrayRef.h @@ -1,4 +1,4 @@ -//===--- ArrayRef.h - Array Reference Wrapper -------------------*- C++ -*-===// +//===- ArrayRef.h - Array Reference Wrapper ---------------------*- C++ -*-===//  //  //                     The LLVM Compiler Infrastructure  // @@ -12,12 +12,21 @@  #include "llvm/ADT/Hashing.h"  #include "llvm/ADT/None.h" -#include "llvm/ADT/STLExtras.h"  #include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/STLExtras.h" +#include "llvm/Support/Compiler.h" +#include <algorithm>  #include <array> +#include <cassert> +#include <cstddef> +#include <initializer_list> +#include <iterator> +#include <memory> +#include <type_traits>  #include <vector>  namespace llvm { +    /// ArrayRef - Represent a constant reference to an array (0 or more elements    /// consecutively in memory), i.e. a start pointer and a length.  It allows    /// various APIs to take consecutive elements easily and conveniently. @@ -32,28 +41,27 @@ namespace llvm {    template<typename T>    class LLVM_NODISCARD ArrayRef {    public: -    typedef const T *iterator; -    typedef const T *const_iterator; -    typedef size_t size_type; - -    typedef std::reverse_iterator<iterator> reverse_iterator; +    using iterator = const T *; +    using const_iterator = const T *; +    using size_type = size_t; +    using reverse_iterator = std::reverse_iterator<iterator>;    private:      /// The start of the array, in an external buffer. -    const T *Data; +    const T *Data = nullptr;      /// The number of elements. -    size_type Length; +    size_type Length = 0;    public:      /// @name Constructors      /// @{      /// Construct an empty ArrayRef. -    /*implicit*/ ArrayRef() : Data(nullptr), Length(0) {} +    /*implicit*/ ArrayRef() = default;      /// Construct an empty ArrayRef from None. -    /*implicit*/ ArrayRef(NoneType) : Data(nullptr), Length(0) {} +    /*implicit*/ ArrayRef(NoneType) {}      /// Construct an ArrayRef from a single element.      /*implicit*/ ArrayRef(const T &OneElt) @@ -282,9 +290,8 @@ namespace llvm {    template<typename T>    class LLVM_NODISCARD MutableArrayRef : public ArrayRef<T> {    public: -    typedef T *iterator; - -    typedef std::reverse_iterator<iterator> reverse_iterator; +    using iterator = T *; +    using reverse_iterator = std::reverse_iterator<iterator>;      /// Construct an empty MutableArrayRef.      /*implicit*/ MutableArrayRef() : ArrayRef<T>() {} @@ -416,19 +423,23 @@ namespace llvm {    /// This is a MutableArrayRef that owns its array.    template <typename T> class OwningArrayRef : public MutableArrayRef<T> {    public: -    OwningArrayRef() {} +    OwningArrayRef() = default;      OwningArrayRef(size_t Size) : MutableArrayRef<T>(new T[Size], Size) {} +      OwningArrayRef(ArrayRef<T> Data)          : MutableArrayRef<T>(new T[Data.size()], Data.size()) {        std::copy(Data.begin(), Data.end(), this->begin());      } +      OwningArrayRef(OwningArrayRef &&Other) { *this = Other; } +      OwningArrayRef &operator=(OwningArrayRef &&Other) {        delete[] this->data();        this->MutableArrayRef<T>::operator=(Other);        Other.MutableArrayRef<T>::operator=(MutableArrayRef<T>());        return *this;      } +      ~OwningArrayRef() { delete[] this->data(); }    }; @@ -517,13 +528,14 @@ namespace llvm {    // ArrayRefs can be treated like a POD type.    template <typename T> struct isPodLike; -  template <typename T> struct isPodLike<ArrayRef<T> > { +  template <typename T> struct isPodLike<ArrayRef<T>> {      static const bool value = true;    };    template <typename T> hash_code hash_value(ArrayRef<T> S) {      return hash_combine_range(S.begin(), S.end());    } +  } // end namespace llvm  #endif // LLVM_ADT_ARRAYREF_H  | 
