On Mar 5, 2012, at 4:49 PM, Argyrios Kyrtzidis wrote: > Author: akirtzidis > Date: Mon Mar 5 18:49:28 2012 > New Revision: 152082 > > URL: http://llvm.org/viewvc/llvm-project?rev=152082&view=rev > Log: > Move include/clang/AST/UsuallyTinyPtrVector.h -> > include/clang/Basic/UsuallyTinyPtrVector.h > and add an erase method to it.
Should this move to llvm/ADT? -Chris > > Patch by Andrew Craik! > > Added: > cfe/trunk/include/clang/Basic/UsuallyTinyPtrVector.h > - copied, changed from r152075, > cfe/trunk/include/clang/AST/UsuallyTinyPtrVector.h > Removed: > cfe/trunk/include/clang/AST/UsuallyTinyPtrVector.h > Modified: > cfe/trunk/include/clang/AST/ASTContext.h > cfe/trunk/include/clang/AST/Expr.h > > Modified: cfe/trunk/include/clang/AST/ASTContext.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTContext.h?rev=152082&r1=152081&r2=152082&view=diff > ============================================================================== > --- cfe/trunk/include/clang/AST/ASTContext.h (original) > +++ cfe/trunk/include/clang/AST/ASTContext.h Mon Mar 5 18:49:28 2012 > @@ -20,6 +20,7 @@ > #include "clang/Basic/OperatorKinds.h" > #include "clang/Basic/PartialDiagnostic.h" > #include "clang/Basic/VersionTuple.h" > +#include "clang/Basic/UsuallyTinyPtrVector.h" > #include "clang/AST/Decl.h" > #include "clang/AST/LambdaMangleContext.h" > #include "clang/AST/NestedNameSpecifier.h" > @@ -27,7 +28,6 @@ > #include "clang/AST/TemplateName.h" > #include "clang/AST/Type.h" > #include "clang/AST/CanonicalType.h" > -#include "clang/AST/UsuallyTinyPtrVector.h" > #include "llvm/ADT/DenseMap.h" > #include "llvm/ADT/FoldingSet.h" > #include "llvm/ADT/IntrusiveRefCntPtr.h" > > Modified: cfe/trunk/include/clang/AST/Expr.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Expr.h?rev=152082&r1=152081&r2=152082&view=diff > ============================================================================== > --- cfe/trunk/include/clang/AST/Expr.h (original) > +++ cfe/trunk/include/clang/AST/Expr.h Mon Mar 5 18:49:28 2012 > @@ -21,7 +21,7 @@ > #include "clang/AST/OperationKinds.h" > #include "clang/AST/ASTVector.h" > #include "clang/AST/TemplateBase.h" > -#include "clang/AST/UsuallyTinyPtrVector.h" > +#include "clang/Basic/UsuallyTinyPtrVector.h" > #include "clang/Basic/TargetInfo.h" > #include "clang/Basic/TypeTraits.h" > #include "llvm/ADT/APSInt.h" > > Removed: cfe/trunk/include/clang/AST/UsuallyTinyPtrVector.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/UsuallyTinyPtrVector.h?rev=152081&view=auto > ============================================================================== > --- cfe/trunk/include/clang/AST/UsuallyTinyPtrVector.h (original) > +++ cfe/trunk/include/clang/AST/UsuallyTinyPtrVector.h (removed) > @@ -1,114 +0,0 @@ > -//===-- UsuallyTinyPtrVector.h - Pointer vector class -----------*- C++ > -*-===// > -// > -// The LLVM Compiler Infrastructure > -// > -// This file is distributed under the University of Illinois Open Source > -// License. See LICENSE.TXT for details. > -// > -//===----------------------------------------------------------------------===// > -// > -// This file defines the UsuallyTinyPtrVector class, which is a vector that > -// optimizes the case where there is only one element. > -// > -//===----------------------------------------------------------------------===// > - > -#ifndef LLVM_CLANG_AST_USUALLY_TINY_PTR_VECTOR_H > -#define LLVM_CLANG_AST_USUALLY_TINY_PTR_VECTOR_H > - > -#include <vector> > - > -namespace clang { > - > -/// \brief A vector class template that is optimized for storing a single > -/// pointer element. > -template<typename T> > -class UsuallyTinyPtrVector { > - /// \brief Storage for the vector. > - /// > - /// When the low bit is zero, this is a T *. When the > - /// low bit is one, this is a std::vector<T *> *. > - mutable uintptr_t Storage; > - > - typedef std::vector<T*> vector_type; > - > -public: > - UsuallyTinyPtrVector() : Storage(0) { } > - explicit UsuallyTinyPtrVector(T *Element) > - : Storage(reinterpret_cast<uintptr_t>(Element)) { } > - > - bool empty() const { return !Storage; } > - > - typedef const T **iterator; > - iterator begin() const; > - iterator end() const; > - size_t size() const; > - > - void push_back(T *Method); > - void Destroy(); > -}; > - > -template<typename T> > -typename UsuallyTinyPtrVector<T>::iterator > -UsuallyTinyPtrVector<T>::begin() const { > - if ((Storage & 0x01) == 0) > - return reinterpret_cast<iterator>(&Storage); > - > - vector_type *Vec = reinterpret_cast<vector_type *>(Storage & ~0x01); > - return &Vec->front(); > -} > - > -template<typename T> > -typename UsuallyTinyPtrVector<T>::iterator > -UsuallyTinyPtrVector<T>::end() const { > - if ((Storage & 0x01) == 0) { > - if (Storage == 0) > - return reinterpret_cast<iterator>(&Storage); > - > - return reinterpret_cast<iterator>(&Storage) + 1; > - } > - > - vector_type *Vec = reinterpret_cast<vector_type *>(Storage & ~0x01); > - return &Vec->front() + Vec->size(); > -} > - > -template<typename T> > -size_t UsuallyTinyPtrVector<T>::size() const { > - if ((Storage & 0x01) == 0) > - return (Storage == 0) ? 0 : 1; > - > - vector_type *Vec = reinterpret_cast<vector_type *>(Storage & ~0x01); > - return Vec->size(); > -} > - > -template<typename T> > -void UsuallyTinyPtrVector<T>::push_back(T *Element) { > - if (Storage == 0) { > - // 0 -> 1 element. > - Storage = reinterpret_cast<uintptr_t>(Element); > - return; > - } > - > - vector_type *Vec; > - if ((Storage & 0x01) == 0) { > - // 1 -> 2 elements. Allocate a new vector and push the element into that > - // vector. > - Vec = new vector_type; > - Vec->push_back(reinterpret_cast<T *>(Storage)); > - Storage = reinterpret_cast<uintptr_t>(Vec) | 0x01; > - } else > - Vec = reinterpret_cast<vector_type *>(Storage & ~0x01); > - > - // Add the new element to the vector. > - Vec->push_back(Element); > -} > - > -template<typename T> > -void UsuallyTinyPtrVector<T>::Destroy() { > - if (Storage & 0x01) > - delete reinterpret_cast<vector_type *>(Storage & ~0x01); > - > - Storage = 0; > -} > - > -} > -#endif > > Copied: cfe/trunk/include/clang/Basic/UsuallyTinyPtrVector.h (from r152075, > cfe/trunk/include/clang/AST/UsuallyTinyPtrVector.h) > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/UsuallyTinyPtrVector.h?p2=cfe/trunk/include/clang/Basic/UsuallyTinyPtrVector.h&p1=cfe/trunk/include/clang/AST/UsuallyTinyPtrVector.h&r1=152075&r2=152082&rev=152082&view=diff > ============================================================================== > --- cfe/trunk/include/clang/AST/UsuallyTinyPtrVector.h (original) > +++ cfe/trunk/include/clang/Basic/UsuallyTinyPtrVector.h Mon Mar 5 18:49:28 > 2012 > @@ -12,8 +12,8 @@ > // > //===----------------------------------------------------------------------===// > > -#ifndef LLVM_CLANG_AST_USUALLY_TINY_PTR_VECTOR_H > -#define LLVM_CLANG_AST_USUALLY_TINY_PTR_VECTOR_H > +#ifndef LLVM_CLANG_BASIC_USUALLY_TINY_PTR_VECTOR_H > +#define LLVM_CLANG_BASIC_USUALLY_TINY_PTR_VECTOR_H > > #include <vector> > > @@ -44,6 +44,7 @@ > size_t size() const; > > void push_back(T *Method); > + iterator erase(const iterator ElementPos); > void Destroy(); > }; > > @@ -103,6 +104,28 @@ > } > > template<typename T> > +typename UsuallyTinyPtrVector<T>::iterator > +UsuallyTinyPtrVector<T>::erase( > + const typename UsuallyTinyPtrVector<T>::iterator ElementPos) { > + // only one item > + if ((Storage & 0x01) == 0) { > + // if the element is found remove it > + if (ElementPos == reinterpret_cast<T **>(&Storage)) > + Storage = 0; > + } else { > + // multiple items in a vector; just do the erase, there is no > + // benefit to collapsing back to a pointer > + vector_type *Vec = reinterpret_cast<vector_type *>(Storage & ~0x01); > + unsigned index = ElementPos - > + const_cast<typename > UsuallyTinyPtrVector<T>::iterator>(&Vec->front()); > + if (index < Vec->size()) > + return const_cast<typename UsuallyTinyPtrVector<T>::iterator>( > + &*(Vec->erase(Vec->begin() + > index))); > + } > + return end(); > +} > + > +template<typename T> > void UsuallyTinyPtrVector<T>::Destroy() { > if (Storage & 0x01) > delete reinterpret_cast<vector_type *>(Storage & ~0x01); > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
