[cfe-commits] r152082 - in /cfe/trunk/include/clang: AST/ASTContext.h AST/Expr.h AST/UsuallyTinyPtrVector.h Basic/UsuallyTinyPtrVector.h
Argyrios Kyrtzidis
kyrtzidis at apple.com
Mon Mar 5 18:14:52 PST 2012
On Mar 5, 2012, at 5:29 PM, Chris Lattner wrote:
>
> 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?
I think it should; r152090 and r152091.
>
> -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
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
More information about the cfe-commits
mailing list