[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