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

David Blaikie dblaikie at gmail.com
Thu Jan 19 17:16:54 PST 2012


I've attached patches that implement this across LLVM & Clang:

Change all existing usage from ArrayRef<T> to ArrayRef<const T>
(syntactically, for pointer cases ArrayRef<T*> I modified that to
ArrayRef<T* const> (for correctness) while keeping the leading const
for non-pointer cases for legibility) and fixing any resuting 80 col
violations.
Then implement MutableArrayRef as the basic ArrayRef<T> template and
the old ArrayRef<T> becomes the ArrayRef<const T> partial
specialization.

This all compiles & passes check-lit.

Let me know if that's any good

- David

On Wed, Jan 18, 2012 at 11:01 PM, David Blaikie <dblaikie at gmail.com> wrote:
> 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: clang_mutable_arrayref.diff
Type: application/octet-stream
Size: 118444 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20120119/26dc79c1/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: mutable_arrayref.diff
Type: application/octet-stream
Size: 210646 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20120119/26dc79c1/attachment-0001.obj>


More information about the llvm-commits mailing list