-/// \brief Structure to hold a use-list shuffle vector.
-///
-/// Stores most use-lists locally, but large use-lists use an extra heap entry.
-/// Costs two fewer pointers than the equivalent \a SmallVector.
-class UseListShuffleVector {
- unsigned Size;
- union {
- unsigned *Ptr;
- unsigned Array[6];
- } Storage;
-
- bool isSmall() const { return Size <= 6; }
- unsigned *data() { return isSmall() ? Storage.Array : Storage.Ptr; }
- const unsigned *data() const {
- return isSmall() ? Storage.Array : Storage.Ptr;
- }
-
- void destroy() {
- if (!isSmall())
- delete[] Storage.Ptr;
- }
- void moveUnchecked(UseListShuffleVector &X) {
- std::memcpy(this, &X, sizeof(UseListShuffleVector));
- X.Size = 0;
- }
-
- UseListShuffleVector(const UseListShuffleVector &X) LLVM_DELETED_FUNCTION;
- UseListShuffleVector &
- operator=(const UseListShuffleVector &X) LLVM_DELETED_FUNCTION;
- UseListShuffleVector &
- operator=(UseListShuffleVector &&X) LLVM_DELETED_FUNCTION;
-
-public:
- UseListShuffleVector() : Size(0) {}
- UseListShuffleVector(UseListShuffleVector &&X) { moveUnchecked(X); }
- explicit UseListShuffleVector(size_t Size) : Size(Size) {
- if (!isSmall())
- Storage.Ptr = new unsigned[Size];
- }
- ~UseListShuffleVector() { destroy(); }
-
- typedef unsigned *iterator;
- typedef const unsigned *const_iterator;
-
- size_t size() const { return Size; }
- iterator begin() { return data(); }
- iterator end() { return begin() + size(); }
- const_iterator begin() const { return data(); }
- const_iterator end() const { return begin() + size(); }
- unsigned &operator[](size_t I) { return data()[I]; }
- unsigned operator[](size_t I) const { return data()[I]; }
-};
-