Fix a bug found by inspection; in the __GNUC__ code, the alignment
[oota-llvm.git] / include / llvm / ADT / SmallVector.h
1 //===- llvm/ADT/SmallVector.h - 'Normally small' vectors --------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines the SmallVector class.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef LLVM_ADT_SMALLVECTOR_H
15 #define LLVM_ADT_SMALLVECTOR_H
16
17 #include "llvm/Support/type_traits.h"
18 #include <algorithm>
19 #include <cassert>
20 #include <cstring>
21 #include <memory>
22
23 #ifdef _MSC_VER
24 namespace std {
25 #if _MSC_VER <= 1310
26   // Work around flawed VC++ implementation of std::uninitialized_copy.  Define
27   // additional overloads so that elements with pointer types are recognized as
28   // scalars and not objects, causing bizarre type conversion errors.
29   template<class T1, class T2>
30   inline _Scalar_ptr_iterator_tag _Ptr_cat(T1 **, T2 **) {
31     _Scalar_ptr_iterator_tag _Cat;
32     return _Cat;
33   }
34
35   template<class T1, class T2>
36   inline _Scalar_ptr_iterator_tag _Ptr_cat(T1* const *, T2 **) {
37     _Scalar_ptr_iterator_tag _Cat;
38     return _Cat;
39   }
40 #else
41 // FIXME: It is not clear if the problem is fixed in VS 2005.  What is clear
42 // is that the above hack won't work if it wasn't fixed.
43 #endif
44 }
45 #endif
46
47 namespace llvm {
48
49 /// SmallVectorBase - This is all the non-templated stuff common to all
50 /// SmallVectors.
51 class SmallVectorBase {
52 protected:
53   void *BeginX, *EndX, *CapacityX;
54
55   // Allocate raw space for N elements of type T.  If T has a ctor or dtor, we
56   // don't want it to be automatically run, so we need to represent the space as
57   // something else.  An array of char would work great, but might not be
58   // aligned sufficiently.  Instead, we either use GCC extensions, or some
59   // number of union instances for the space, which guarantee maximal alignment.
60   struct U {
61 #ifdef __GNUC__
62     char X __attribute__((aligned));
63 #else
64     union U {
65       double D;
66       long double LD;
67       long long L;
68       void *P;
69     } X;
70 #endif
71   } FirstEl;
72   // Space after 'FirstEl' is clobbered, do not add any instance vars after it.
73   
74 protected:
75   SmallVectorBase(size_t Size)
76     : BeginX(&FirstEl), EndX(&FirstEl), CapacityX((char*)&FirstEl+Size) {}
77   
78   /// isSmall - Return true if this is a smallvector which has not had dynamic
79   /// memory allocated for it.
80   bool isSmall() const {
81     return BeginX == static_cast<const void*>(&FirstEl);
82   }
83   
84   /// size_in_bytes - This returns size()*sizeof(T).
85   size_t size_in_bytes() const {
86     return size_t((char*)EndX - (char*)BeginX);
87   }
88   
89   /// capacity_in_bytes - This returns capacity()*sizeof(T).
90   size_t capacity_in_bytes() const {
91     return size_t((char*)CapacityX - (char*)BeginX);
92   }
93   
94   /// grow_pod - This is an implementation of the grow() method which only works
95   /// on POD-like datatypes and is out of line to reduce code duplication.
96   void grow_pod(size_t MinSizeInBytes, size_t TSize);
97   
98 public:
99   bool empty() const { return BeginX == EndX; }
100 };
101   
102
103 template <typename T>
104 class SmallVectorTemplateCommon : public SmallVectorBase {
105 protected:
106   void setEnd(T *P) { this->EndX = P; }
107 public:
108   SmallVectorTemplateCommon(size_t Size) : SmallVectorBase(Size) {}
109   
110   typedef size_t size_type;
111   typedef ptrdiff_t difference_type;
112   typedef T value_type;
113   typedef T *iterator;
114   typedef const T *const_iterator;
115   
116   typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
117   typedef std::reverse_iterator<iterator> reverse_iterator;
118   
119   typedef T &reference;
120   typedef const T &const_reference;
121   typedef T *pointer;
122   typedef const T *const_pointer;
123   
124   // forward iterator creation methods.
125   iterator begin() { return (iterator)this->BeginX; }
126   const_iterator begin() const { return (const_iterator)this->BeginX; }
127   iterator end() { return (iterator)this->EndX; }
128   const_iterator end() const { return (const_iterator)this->EndX; }
129 protected:
130   iterator capacity_ptr() { return (iterator)this->CapacityX; }
131   const_iterator capacity_ptr() const { return (const_iterator)this->CapacityX;}
132 public:
133   
134   // reverse iterator creation methods.
135   reverse_iterator rbegin()            { return reverse_iterator(end()); }
136   const_reverse_iterator rbegin() const{ return const_reverse_iterator(end()); }
137   reverse_iterator rend()              { return reverse_iterator(begin()); }
138   const_reverse_iterator rend() const { return const_reverse_iterator(begin());}
139
140   size_type size() const { return end()-begin(); }
141   size_type max_size() const { return size_type(-1) / sizeof(T); }
142   
143   /// capacity - Return the total number of elements in the currently allocated
144   /// buffer.
145   size_t capacity() const { return capacity_ptr() - begin(); }
146   
147   /// data - Return a pointer to the vector's buffer, even if empty().
148   pointer data() { return pointer(begin()); }
149   /// data - Return a pointer to the vector's buffer, even if empty().
150   const_pointer data() const { return const_pointer(begin()); }
151   
152   reference operator[](unsigned idx) {
153     assert(begin() + idx < end());
154     return begin()[idx];
155   }
156   const_reference operator[](unsigned idx) const {
157     assert(begin() + idx < end());
158     return begin()[idx];
159   }
160
161   reference front() {
162     return begin()[0];
163   }
164   const_reference front() const {
165     return begin()[0];
166   }
167
168   reference back() {
169     return end()[-1];
170   }
171   const_reference back() const {
172     return end()[-1];
173   }
174 };
175   
176 /// SmallVectorTemplateBase<isPodLike = false> - This is where we put method
177 /// implementations that are designed to work with non-POD-like T's.
178 template <typename T, bool isPodLike>
179 class SmallVectorTemplateBase : public SmallVectorTemplateCommon<T> {
180 public:
181   SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
182
183   static void destroy_range(T *S, T *E) {
184     while (S != E) {
185       --E;
186       E->~T();
187     }
188   }
189   
190   /// uninitialized_copy - Copy the range [I, E) onto the uninitialized memory
191   /// starting with "Dest", constructing elements into it as needed.
192   template<typename It1, typename It2>
193   static void uninitialized_copy(It1 I, It1 E, It2 Dest) {
194     std::uninitialized_copy(I, E, Dest);
195   }
196   
197   /// grow - double the size of the allocated memory, guaranteeing space for at
198   /// least one more element or MinSize if specified.
199   void grow(size_t MinSize = 0);
200 };
201
202 // Define this out-of-line to dissuade the C++ compiler from inlining it.
203 template <typename T, bool isPodLike>
204 void SmallVectorTemplateBase<T, isPodLike>::grow(size_t MinSize) {
205   size_t CurCapacity = this->capacity();
206   size_t CurSize = this->size();
207   size_t NewCapacity = 2*CurCapacity;
208   if (NewCapacity < MinSize)
209     NewCapacity = MinSize;
210   T *NewElts = static_cast<T*>(operator new(NewCapacity*sizeof(T)));
211   
212   // Copy the elements over.
213   this->uninitialized_copy(this->begin(), this->end(), NewElts);
214   
215   // Destroy the original elements.
216   destroy_range(this->begin(), this->end());
217   
218   // If this wasn't grown from the inline copy, deallocate the old space.
219   if (!this->isSmall())
220     operator delete(this->begin());
221   
222   this->setEnd(NewElts+CurSize);
223   this->BeginX = NewElts;
224   this->CapacityX = this->begin()+NewCapacity;
225 }
226   
227   
228 /// SmallVectorTemplateBase<isPodLike = true> - This is where we put method
229 /// implementations that are designed to work with POD-like T's.
230 template <typename T>
231 class SmallVectorTemplateBase<T, true> : public SmallVectorTemplateCommon<T> {
232 public:
233   SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
234   
235   // No need to do a destroy loop for POD's.
236   static void destroy_range(T *, T *) {}
237   
238   /// uninitialized_copy - Copy the range [I, E) onto the uninitialized memory
239   /// starting with "Dest", constructing elements into it as needed.
240   template<typename It1, typename It2>
241   static void uninitialized_copy(It1 I, It1 E, It2 Dest) {
242     // Use memcpy for PODs: std::uninitialized_copy optimizes to memmove, memcpy
243     // is better.
244     memcpy(&*Dest, &*I, (E-I)*sizeof(T));
245   }
246   
247   /// grow - double the size of the allocated memory, guaranteeing space for at
248   /// least one more element or MinSize if specified.
249   void grow(size_t MinSize = 0) {
250     this->grow_pod(MinSize*sizeof(T), sizeof(T));
251   }
252 };
253   
254   
255 /// SmallVectorImpl - This class consists of common code factored out of the
256 /// SmallVector class to reduce code duplication based on the SmallVector 'N'
257 /// template parameter.
258 template <typename T>
259 class SmallVectorImpl : public SmallVectorTemplateBase<T, isPodLike<T>::value> {
260   typedef SmallVectorTemplateBase<T, isPodLike<T>::value > SuperClass;
261 public:
262   typedef typename SuperClass::iterator iterator;
263   typedef typename SuperClass::size_type size_type;
264   
265   // Default ctor - Initialize to empty.
266   explicit SmallVectorImpl(unsigned N)
267     : SmallVectorTemplateBase<T, isPodLike<T>::value>(N*sizeof(T)) {
268   }
269   
270   ~SmallVectorImpl() {
271     // Destroy the constructed elements in the vector.
272     this->destroy_range(this->begin(), this->end());
273     
274     // If this wasn't grown from the inline copy, deallocate the old space.
275     if (!this->isSmall())
276       operator delete(this->begin());
277   }
278   
279   
280   void clear() {
281     this->destroy_range(this->begin(), this->end());
282     this->EndX = this->BeginX;
283   }
284
285   void resize(unsigned N) {
286     if (N < this->size()) {
287       this->destroy_range(this->begin()+N, this->end());
288       this->setEnd(this->begin()+N);
289     } else if (N > this->size()) {
290       if (this->capacity() < N)
291         this->grow(N);
292       this->construct_range(this->end(), this->begin()+N, T());
293       this->setEnd(this->begin()+N);
294     }
295   }
296
297   void resize(unsigned N, const T &NV) {
298     if (N < this->size()) {
299       this->destroy_range(this->begin()+N, this->end());
300       this->setEnd(this->begin()+N);
301     } else if (N > this->size()) {
302       if (this->capacity() < N)
303         this->grow(N);
304       construct_range(this->end(), this->begin()+N, NV);
305       this->setEnd(this->begin()+N);
306     }
307   }
308
309   void reserve(unsigned N) {
310     if (this->capacity() < N)
311       this->grow(N);
312   }
313   
314   void push_back(const T &Elt) {
315     if (this->EndX < this->CapacityX) {
316     Retry:
317       new (this->end()) T(Elt);
318       this->setEnd(this->end()+1);
319       return;
320     }
321     this->grow();
322     goto Retry;
323   }
324   
325   void pop_back() {
326     this->setEnd(this->end()-1);
327     this->end()->~T();
328   }
329   
330   T pop_back_val() {
331     T Result = this->back();
332     pop_back();
333     return Result;
334   }
335   
336   
337   void swap(SmallVectorImpl &RHS);
338   
339   /// append - Add the specified range to the end of the SmallVector.
340   ///
341   template<typename in_iter>
342   void append(in_iter in_start, in_iter in_end) {
343     size_type NumInputs = std::distance(in_start, in_end);
344     // Grow allocated space if needed.
345     if (NumInputs > size_type(this->capacity_ptr()-this->end()))
346       this->grow(this->size()+NumInputs);
347     
348     // Copy the new elements over.
349     // TODO: NEED To compile time dispatch on whether in_iter is a random access
350     // iterator to use the fast uninitialized_copy.
351     std::uninitialized_copy(in_start, in_end, this->end());
352     this->setEnd(this->end() + NumInputs);
353   }
354   
355   /// append - Add the specified range to the end of the SmallVector.
356   ///
357   void append(size_type NumInputs, const T &Elt) {
358     // Grow allocated space if needed.
359     if (NumInputs > size_type(this->capacity_ptr()-this->end()))
360       this->grow(this->size()+NumInputs);
361     
362     // Copy the new elements over.
363     std::uninitialized_fill_n(this->end(), NumInputs, Elt);
364     this->setEnd(this->end() + NumInputs);
365   }
366   
367   void assign(unsigned NumElts, const T &Elt) {
368     clear();
369     if (this->capacity() < NumElts)
370       this->grow(NumElts);
371     this->setEnd(this->begin()+NumElts);
372     construct_range(this->begin(), this->end(), Elt);
373   }
374   
375   iterator erase(iterator I) {
376     iterator N = I;
377     // Shift all elts down one.
378     std::copy(I+1, this->end(), I);
379     // Drop the last elt.
380     pop_back();
381     return(N);
382   }
383   
384   iterator erase(iterator S, iterator E) {
385     iterator N = S;
386     // Shift all elts down.
387     iterator I = std::copy(E, this->end(), S);
388     // Drop the last elts.
389     this->destroy_range(I, this->end());
390     this->setEnd(I);
391     return(N);
392   }
393   
394   iterator insert(iterator I, const T &Elt) {
395     if (I == this->end()) {  // Important special case for empty vector.
396       push_back(Elt);
397       return this->end()-1;
398     }
399     
400     if (this->EndX < this->CapacityX) {
401     Retry:
402       new (this->end()) T(this->back());
403       this->setEnd(this->end()+1);
404       // Push everything else over.
405       std::copy_backward(I, this->end()-1, this->end());
406       *I = Elt;
407       return I;
408     }
409     size_t EltNo = I-this->begin();
410     this->grow();
411     I = this->begin()+EltNo;
412     goto Retry;
413   }
414   
415   iterator insert(iterator I, size_type NumToInsert, const T &Elt) {
416     if (I == this->end()) {  // Important special case for empty vector.
417       append(NumToInsert, Elt);
418       return this->end()-1;
419     }
420     
421     // Convert iterator to elt# to avoid invalidating iterator when we reserve()
422     size_t InsertElt = I - this->begin();
423     
424     // Ensure there is enough space.
425     reserve(static_cast<unsigned>(this->size() + NumToInsert));
426     
427     // Uninvalidate the iterator.
428     I = this->begin()+InsertElt;
429     
430     // If there are more elements between the insertion point and the end of the
431     // range than there are being inserted, we can use a simple approach to
432     // insertion.  Since we already reserved space, we know that this won't
433     // reallocate the vector.
434     if (size_t(this->end()-I) >= NumToInsert) {
435       T *OldEnd = this->end();
436       append(this->end()-NumToInsert, this->end());
437       
438       // Copy the existing elements that get replaced.
439       std::copy_backward(I, OldEnd-NumToInsert, OldEnd);
440       
441       std::fill_n(I, NumToInsert, Elt);
442       return I;
443     }
444     
445     // Otherwise, we're inserting more elements than exist already, and we're
446     // not inserting at the end.
447     
448     // Copy over the elements that we're about to overwrite.
449     T *OldEnd = this->end();
450     this->setEnd(this->end() + NumToInsert);
451     size_t NumOverwritten = OldEnd-I;
452     this->uninitialized_copy(I, OldEnd, this->end()-NumOverwritten);
453     
454     // Replace the overwritten part.
455     std::fill_n(I, NumOverwritten, Elt);
456     
457     // Insert the non-overwritten middle part.
458     std::uninitialized_fill_n(OldEnd, NumToInsert-NumOverwritten, Elt);
459     return I;
460   }
461   
462   template<typename ItTy>
463   iterator insert(iterator I, ItTy From, ItTy To) {
464     if (I == this->end()) {  // Important special case for empty vector.
465       append(From, To);
466       return this->end()-1;
467     }
468     
469     size_t NumToInsert = std::distance(From, To);
470     // Convert iterator to elt# to avoid invalidating iterator when we reserve()
471     size_t InsertElt = I - this->begin();
472     
473     // Ensure there is enough space.
474     reserve(static_cast<unsigned>(this->size() + NumToInsert));
475     
476     // Uninvalidate the iterator.
477     I = this->begin()+InsertElt;
478     
479     // If there are more elements between the insertion point and the end of the
480     // range than there are being inserted, we can use a simple approach to
481     // insertion.  Since we already reserved space, we know that this won't
482     // reallocate the vector.
483     if (size_t(this->end()-I) >= NumToInsert) {
484       T *OldEnd = this->end();
485       append(this->end()-NumToInsert, this->end());
486       
487       // Copy the existing elements that get replaced.
488       std::copy_backward(I, OldEnd-NumToInsert, OldEnd);
489       
490       std::copy(From, To, I);
491       return I;
492     }
493     
494     // Otherwise, we're inserting more elements than exist already, and we're
495     // not inserting at the end.
496     
497     // Copy over the elements that we're about to overwrite.
498     T *OldEnd = this->end();
499     this->setEnd(this->end() + NumToInsert);
500     size_t NumOverwritten = OldEnd-I;
501     this->uninitialized_copy(I, OldEnd, this->end()-NumOverwritten);
502     
503     // Replace the overwritten part.
504     std::copy(From, From+NumOverwritten, I);
505     
506     // Insert the non-overwritten middle part.
507     this->uninitialized_copy(From+NumOverwritten, To, OldEnd);
508     return I;
509   }
510   
511   const SmallVectorImpl
512   &operator=(const SmallVectorImpl &RHS);
513   
514   bool operator==(const SmallVectorImpl &RHS) const {
515     if (this->size() != RHS.size()) return false;
516     return std::equal(this->begin(), this->end(), RHS.begin());
517   }
518   bool operator!=(const SmallVectorImpl &RHS) const {
519     return !(*this == RHS);
520   }
521   
522   bool operator<(const SmallVectorImpl &RHS) const {
523     return std::lexicographical_compare(this->begin(), this->end(),
524                                         RHS.begin(), RHS.end());
525   }
526   
527   /// set_size - Set the array size to \arg N, which the current array must have
528   /// enough capacity for.
529   ///
530   /// This does not construct or destroy any elements in the vector.
531   ///
532   /// Clients can use this in conjunction with capacity() to write past the end
533   /// of the buffer when they know that more elements are available, and only
534   /// update the size later. This avoids the cost of value initializing elements
535   /// which will only be overwritten.
536   void set_size(unsigned N) {
537     assert(N <= this->capacity());
538     this->setEnd(this->begin() + N);
539   }
540   
541 private:
542   static void construct_range(T *S, T *E, const T &Elt) {
543     for (; S != E; ++S)
544       new (S) T(Elt);
545   }
546 };
547   
548
549 template <typename T>
550 void SmallVectorImpl<T>::swap(SmallVectorImpl<T> &RHS) {
551   if (this == &RHS) return;
552
553   // We can only avoid copying elements if neither vector is small.
554   if (!this->isSmall() && !RHS.isSmall()) {
555     std::swap(this->BeginX, RHS.BeginX);
556     std::swap(this->EndX, RHS.EndX);
557     std::swap(this->CapacityX, RHS.CapacityX);
558     return;
559   }
560   if (RHS.size() > this->capacity())
561     this->grow(RHS.size());
562   if (this->size() > RHS.capacity())
563     RHS.grow(this->size());
564
565   // Swap the shared elements.
566   size_t NumShared = this->size();
567   if (NumShared > RHS.size()) NumShared = RHS.size();
568   for (unsigned i = 0; i != static_cast<unsigned>(NumShared); ++i)
569     std::swap((*this)[i], RHS[i]);
570
571   // Copy over the extra elts.
572   if (this->size() > RHS.size()) {
573     size_t EltDiff = this->size() - RHS.size();
574     this->uninitialized_copy(this->begin()+NumShared, this->end(), RHS.end());
575     RHS.setEnd(RHS.end()+EltDiff);
576     this->destroy_range(this->begin()+NumShared, this->end());
577     this->setEnd(this->begin()+NumShared);
578   } else if (RHS.size() > this->size()) {
579     size_t EltDiff = RHS.size() - this->size();
580     this->uninitialized_copy(RHS.begin()+NumShared, RHS.end(), this->end());
581     this->setEnd(this->end() + EltDiff);
582     this->destroy_range(RHS.begin()+NumShared, RHS.end());
583     RHS.setEnd(RHS.begin()+NumShared);
584   }
585 }
586
587 template <typename T>
588 const SmallVectorImpl<T> &SmallVectorImpl<T>::
589   operator=(const SmallVectorImpl<T> &RHS) {
590   // Avoid self-assignment.
591   if (this == &RHS) return *this;
592
593   // If we already have sufficient space, assign the common elements, then
594   // destroy any excess.
595   size_t RHSSize = RHS.size();
596   size_t CurSize = this->size();
597   if (CurSize >= RHSSize) {
598     // Assign common elements.
599     iterator NewEnd;
600     if (RHSSize)
601       NewEnd = std::copy(RHS.begin(), RHS.begin()+RHSSize, this->begin());
602     else
603       NewEnd = this->begin();
604
605     // Destroy excess elements.
606     this->destroy_range(NewEnd, this->end());
607
608     // Trim.
609     this->setEnd(NewEnd);
610     return *this;
611   }
612
613   // If we have to grow to have enough elements, destroy the current elements.
614   // This allows us to avoid copying them during the grow.
615   if (this->capacity() < RHSSize) {
616     // Destroy current elements.
617     this->destroy_range(this->begin(), this->end());
618     this->setEnd(this->begin());
619     CurSize = 0;
620     this->grow(RHSSize);
621   } else if (CurSize) {
622     // Otherwise, use assignment for the already-constructed elements.
623     std::copy(RHS.begin(), RHS.begin()+CurSize, this->begin());
624   }
625
626   // Copy construct the new elements in place.
627   this->uninitialized_copy(RHS.begin()+CurSize, RHS.end(),
628                            this->begin()+CurSize);
629
630   // Set end.
631   this->setEnd(this->begin()+RHSSize);
632   return *this;
633 }
634
635
636 /// SmallVector - This is a 'vector' (really, a variable-sized array), optimized
637 /// for the case when the array is small.  It contains some number of elements
638 /// in-place, which allows it to avoid heap allocation when the actual number of
639 /// elements is below that threshold.  This allows normal "small" cases to be
640 /// fast without losing generality for large inputs.
641 ///
642 /// Note that this does not attempt to be exception safe.
643 ///
644 template <typename T, unsigned N>
645 class SmallVector : public SmallVectorImpl<T> {
646   /// InlineElts - These are 'N-1' elements that are stored inline in the body
647   /// of the vector.  The extra '1' element is stored in SmallVectorImpl.
648   typedef typename SmallVectorImpl<T>::U U;
649   enum {
650     // MinUs - The number of U's require to cover N T's.
651     MinUs = (static_cast<unsigned int>(sizeof(T))*N +
652              static_cast<unsigned int>(sizeof(U)) - 1) /
653             static_cast<unsigned int>(sizeof(U)),
654
655     // NumInlineEltsElts - The number of elements actually in this array.  There
656     // is already one in the parent class, and we have to round up to avoid
657     // having a zero-element array.
658     NumInlineEltsElts = MinUs > 1 ? (MinUs - 1) : 1,
659
660     // NumTsAvailable - The number of T's we actually have space for, which may
661     // be more than N due to rounding.
662     NumTsAvailable = (NumInlineEltsElts+1)*static_cast<unsigned int>(sizeof(U))/
663                      static_cast<unsigned int>(sizeof(T))
664   };
665   U InlineElts[NumInlineEltsElts];
666 public:
667   SmallVector() : SmallVectorImpl<T>(NumTsAvailable) {
668   }
669
670   explicit SmallVector(unsigned Size, const T &Value = T())
671     : SmallVectorImpl<T>(NumTsAvailable) {
672     this->reserve(Size);
673     while (Size--)
674       this->push_back(Value);
675   }
676
677   template<typename ItTy>
678   SmallVector(ItTy S, ItTy E) : SmallVectorImpl<T>(NumTsAvailable) {
679     this->append(S, E);
680   }
681
682   SmallVector(const SmallVector &RHS) : SmallVectorImpl<T>(NumTsAvailable) {
683     if (!RHS.empty())
684       SmallVectorImpl<T>::operator=(RHS);
685   }
686
687   const SmallVector &operator=(const SmallVector &RHS) {
688     SmallVectorImpl<T>::operator=(RHS);
689     return *this;
690   }
691
692 };
693
694 } // End llvm namespace
695
696 namespace std {
697   /// Implement std::swap in terms of SmallVector swap.
698   template<typename T>
699   inline void
700   swap(llvm::SmallVectorImpl<T> &LHS, llvm::SmallVectorImpl<T> &RHS) {
701     LHS.swap(RHS);
702   }
703
704   /// Implement std::swap in terms of SmallVector swap.
705   template<typename T, unsigned N>
706   inline void
707   swap(llvm::SmallVector<T, N> &LHS, llvm::SmallVector<T, N> &RHS) {
708     LHS.swap(RHS);
709   }
710 }
711
712 #endif