[llvm-commits] [llvm] r148463 - /llvm/trunk/include/llvm/ADT/ArrayRef.h

David Blaikie dblaikie at gmail.com
Wed Jan 18 23:01:52 PST 2012


On Wed, Jan 18, 2012 at 10:34 PM, Chris Lattner <sabre at nondot.org> wrote:
> Author: lattner
> Date: Thu Jan 19 00:34:52 2012
> New Revision: 148463
>
> URL: http://llvm.org/viewvc/llvm-project?rev=148463&view=rev
> Log:
> Introduce a new MutableArrayRef class, which refers to a series of mutable
> T's that are consequtively in memory.

Just forwarding a brief discussion I had with Chris on IRC for the
email record - I'm pretty sure this could be implemented by switching
things around & migrating existing ArrayRef<T> code to ArrayRef<const
T> (& making his MutableArrayRef be the basic/generic ArrayRef
template and partially specializing ArrayRef<const T> using the old
ArrayRef implementation). Just thought I'd mention this in case anyone
else had a similar thought.

I'll try to whip up this as a prototype when I get a chance. (painful
bit is it'll require migrating existing code
"s/ArrayRef<T>/ArrayRef<const T>/" across the codebase... but I don't
mind if you guys don't)

- David

>
> Modified:
>    llvm/trunk/include/llvm/ADT/ArrayRef.h
>
> Modified: llvm/trunk/include/llvm/ADT/ArrayRef.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ArrayRef.h?rev=148463&r1=148462&r2=148463&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/ADT/ArrayRef.h (original)
> +++ llvm/trunk/include/llvm/ADT/ArrayRef.h Thu Jan 19 00:34:52 2012
> @@ -147,6 +147,88 @@
>     /// @}
>   };
>
> +  /// MutableArrayRef - Represent a mutable 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 and modify consecutive elements easily and
> +  /// conveniently.
> +  ///
> +  /// This class does not own the underlying data, it is expected to be used in
> +  /// situations where the data resides in some other buffer, whose lifetime
> +  /// extends past that of the MutableArrayRef. For this reason, it is not in
> +  /// general safe to store a MutableArrayRef.
> +  ///
> +  /// This is intended to be trivially copyable, so it should be passed by
> +  /// value.
> +  template<typename T>
> +  class MutableArrayRef : public ArrayRef<T> {
> +  public:
> +    typedef T *iterator;
> +
> +    /// Construct an empty ArrayRef.
> +    /*implicit*/ MutableArrayRef() : ArrayRef<T>() {}
> +
> +    /// Construct an MutableArrayRef from a single element.
> +    /*implicit*/ MutableArrayRef(T &OneElt) : ArrayRef<T>(OneElt) {}
> +
> +    /// Construct an MutableArrayRef from a pointer and length.
> +    /*implicit*/ MutableArrayRef(T *data, size_t length)
> +      : ArrayRef<T>(data, length) {}
> +
> +    /// Construct an MutableArrayRef from a range.
> +    MutableArrayRef(T *begin, T *end) : ArrayRef<T>(begin, end) {}
> +
> +    /// Construct an MutableArrayRef from a SmallVector.
> +    /*implicit*/ MutableArrayRef(SmallVectorImpl<T> &Vec)
> +    : ArrayRef<T>(Vec) {}
> +
> +    /// Construct a MutableArrayRef from a std::vector.
> +    /*implicit*/ MutableArrayRef(std::vector<T> &Vec)
> +    : ArrayRef<T>(Vec) {}
> +
> +    /// Construct an MutableArrayRef from a C array.
> +    template <size_t N>
> +    /*implicit*/ MutableArrayRef(T (&Arr)[N])
> +      : ArrayRef<T>(Arr) {}
> +
> +    T *data() const { return const_cast<T*>(ArrayRef<T>::data()); }
> +
> +    iterator begin() const { return data(); }
> +    iterator end() const { return data() + this->size(); }
> +
> +    /// front - Get the first element.
> +    T &front() const {
> +      assert(!this->empty());
> +      return data()[0];
> +    }
> +
> +    /// back - Get the last element.
> +    T &back() const {
> +      assert(!this->empty());
> +      return data()[this->size()-1];
> +    }
> +
> +    /// slice(n) - Chop off the first N elements of the array.
> +    MutableArrayRef<T> slice(unsigned N) const {
> +      assert(N <= this->size() && "Invalid specifier");
> +      return MutableArrayRef<T>(data()+N, this->size()-N);
> +    }
> +
> +    /// slice(n, m) - Chop off the first N elements of the array, and keep M
> +    /// elements in the array.
> +    MutableArrayRef<T> slice(unsigned N, unsigned M) const {
> +      assert(N+M <= this->size() && "Invalid specifier");
> +      return MutableArrayRef<T>(data()+N, M);
> +    }
> +
> +    /// @}
> +    /// @name Operator Overloads
> +    /// @{
> +    T &operator[](size_t Index) const {
> +      assert(Index < this->size() && "Invalid index!");
> +      return data()[Index];
> +    }
> +  };
> +
>   /// @name ArrayRef Convenience constructors
>   /// @{
>
> @@ -214,5 +296,5 @@
>     static const bool value = true;
>   };
>  }
> -
> +
>  #endif
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list