[llvm-commits] [llvm] r155562 - in /llvm/trunk: docs/ProgrammersManual.html include/llvm/ADT/FlatArrayMap.h include/llvm/ADT/MultiImplMap.h include/llvm/ADT/SmallMap.h unittests/ADT/SmallMapTest.cpp
Stepan Dyatkovskiy
STPWORLD at narod.ru
Wed Apr 25 11:30:12 PDT 2012
Thanks guys )
-Stepan.
25.04.2012, 22:03, "Benjamin Kramer" <benny.kra at googlemail.com>:
> On 25.04.2012, at 19:54, Chandler Carruth wrote:
>
>> Just as an FYI to Stepan, I'm going to try to fix this, just wanted bots to recover in the mean time...
>
> I was faster, r155568 :D
>
> - Ben
>
>> On Apr 25, 2012 10:52 AM, "Eric Christopher" <echristo at apple.com> wrote:
>> Author: echristo
>> Date: Wed Apr 25 12:51:00 2012
>> New Revision: 155562
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=155562&view=rev
>> Log:
>> Revert "First implementation of:"
>>
>> This reverts commit 76271a3366731d4c372fdebcd8d3437e6e09a61b.
>>
>> as it's breaking the bots.
>>
>> Removed:
>> llvm/trunk/include/llvm/ADT/FlatArrayMap.h
>> llvm/trunk/include/llvm/ADT/MultiImplMap.h
>> llvm/trunk/include/llvm/ADT/SmallMap.h
>> llvm/trunk/unittests/ADT/SmallMapTest.cpp
>> Modified:
>> llvm/trunk/docs/ProgrammersManual.html
>>
>> Modified: llvm/trunk/docs/ProgrammersManual.html
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/ProgrammersManual.html?rev=155562&r1=155561&r2=155562&view=diff
>> ==============================================================================
>> --- llvm/trunk/docs/ProgrammersManual.html (original)
>> +++ llvm/trunk/docs/ProgrammersManual.html Wed Apr 25 12:51:00 2012
>> @@ -95,9 +95,6 @@
>> <li><a href="#dss_stringmap">"llvm/ADT/StringMap.h"</a></li>
>> <li><a href="#dss_indexedmap">"llvm/ADT/IndexedMap.h"</a></li>
>> <li><a href="#dss_densemap">"llvm/ADT/DenseMap.h"</a></li>
>> - <li><a href="#dss_multiimplmap">"llvm/ADT/MultiImplMap.h"</a></li>
>> - <li><a href="#dss_flatarraymap">"llvm/ADT/FlatArrayMap.h"</a></li>
>> - <li><a href="#dss_smallmap">"llvm/ADT/SmallMap.h"</a></li>
>> <li><a href="#dss_valuemap">"llvm/ADT/ValueMap.h"</a></li>
>> <li><a href="#dss_intervalmap">"llvm/ADT/IntervalMap.h"</a></li>
>> <li><a href="#dss_map"><map></a></li>
>> @@ -1815,84 +1812,6 @@
>>
>> <!-- _______________________________________________________________________ -->
>> <h4>
>> - <a name="dss_multiimplmap">"llvm/ADT/MultiImplMap.h"</a>
>> -</h4>
>> -
>> -<div>
>> -
>> -<p>
>> -MultiImplMap is map that has two modes, one for small amount of elements and
>> -one for big amount. User should set map implementation for both of them.
>> -User also should set the maximum possible number of elements for small mode.
>> -</p>
>> -
>> -<p>
>> -If user want to use MultiImplMap instead of
>> -<a href="#dss_densemap">DenseMap</a>, he should pass template parameter
>> -DenseMapCompatible = true. Note, that in this case map implementations
>> -should present additional DenseMap specific methods (see below):
>> -<code>isPointerIntoBucketsArray</code>, <code>getPointerIntoBucketsArray</code>
>> -and <code>FindAndConstruct</code>.
>> -</p>
>> -
>> -<p>
>> -Initially MultiImplMap uses small mode and small map implementation. It
>> -triggered to the big mode when the number of contained elements exceeds
>> -maximum possible elements for small mode.
>> -</p>
>> -
>> -</div>
>> -
>> -<!-- _______________________________________________________________________ -->
>> -<h4>
>> - <a name="dss_flatarraymap">"llvm/ADT/FlatArrayMap.h"</a>
>> -</h4>
>> -
>> -<div>
>> -
>> -<p>
>> -FlatArrayMap optimized for small amount of elements. It uses flat array
>> -implementation inside:
>> -</p>
>> -<pre>[ key0, value0, key1, value1, ... keyN, valueN ]</pre>
>> -
>> -
>> -<p>
>> -User should pass key type, mapped type (type of value), and maximum
>> -number of elements.
>> -</p>
>> -
>> -<p>
>> -After maximum number of elements is reached, map declines any further
>> -attempts to insert new elements ("insert" method returns <end(),
>> -false>).
>> -</p>
>> -
>> -<p>
>> -FlatArrayMap has interface that is compatible with
>> -<a href="#dss_densemap">DenseMap</a>, so user can replace it with DenseMap
>> -without any code changing and vice versa.
>> -</p>
>> -
>> -</div>
>> -
>> -<!-- _______________________________________________________________________ -->
>> -<h4>
>> - <a name="dss_smallmap">"llvm/ADT/SmallMap.h"</a>
>> -</h4>
>> -
>> -<div>
>> -
>> -<p>
>> -SmallMap is wrapper around <a href="#dss_multiimplmap">MultiImplMap</a>.
>> -It uses <a href="#dss_flatarraymap">FlatArrayMap</a> for small mode, and
>> -<a href="#dss_densemap">DenseMap</a> for big mode.
>> -</p>
>> -
>> -</div>
>> -
>> -<!-- _______________________________________________________________________ -->
>> -<h4>
>> <a name="dss_intervalmap">"llvm/ADT/IntervalMap.h"</a>
>> </h4>
>>
>> Removed: llvm/trunk/include/llvm/ADT/FlatArrayMap.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/FlatArrayMap.h?rev=155561&view=auto
>> ==============================================================================
>> --- llvm/trunk/include/llvm/ADT/FlatArrayMap.h (original)
>> +++ llvm/trunk/include/llvm/ADT/FlatArrayMap.h (removed)
>> @@ -1,323 +0,0 @@
>> -//===- llvm/ADT/FlatArrayMap.h - 'Normally small' pointer set ----*- 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 FlatArrayMap class.
>> -// See FlatArrayMap doxygen comments for more details.
>> -//
>> -//===----------------------------------------------------------------------===//
>> -
>> -#ifndef FLATARRAYMAP_H_
>> -#define FLATARRAYMAP_H_
>> -
>> -#include <algorithm>
>> -#include <utility>
>> -#include "llvm/Support/type_traits.h"
>> -
>> -namespace llvm {
>> -
>> - template <typename KeyTy, typename MappedTy>
>> - struct FlatArrayMapTypes {
>> - typedef KeyTy key_type;
>> - typedef MappedTy mapped_type;
>> - typedef typename std::pair<key_type, mapped_type> value_type;
>> - };
>> -
>> - template<typename KeyTy, typename MappedTy, bool IsConst = false>
>> - class FlatArrayMapIterator;
>> -
>> - //===--------------------------------------------------------------------===//
>> - /// FlatArrayMap presents map container interface.
>> - /// It uses flat array implementation inside:
>> - /// [ <key0, value0>, <key1, value1>, ... <keyN, valueN> ]
>> - /// It works fast for small amount of elements.
>> - /// User should pass key type, mapped type (type of value), and maximum
>> - /// number of elements.
>> - /// After maximum number of elements is reached, map declines any farther
>> - /// attempts to insert new elements ("insert" method returns <end(),false>).
>> - ///
>> - template <typename KeyTy, typename MappedTy, unsigned MaxArraySize>
>> - class FlatArrayMap {
>> - public:
>> - typedef FlatArrayMapTypes<KeyTy, MappedTy> Types;
>> -
>> - typedef typename Types::key_type key_type;
>> - typedef typename Types::mapped_type mapped_type;
>> - typedef typename Types::value_type value_type;
>> -
>> - typedef FlatArrayMapIterator<KeyTy, MappedTy> iterator;
>> - typedef FlatArrayMapIterator<KeyTy, MappedTy, true> const_iterator;
>> -
>> - typedef FlatArrayMap<KeyTy, MappedTy, MaxArraySize> self;
>> -
>> - private:
>> -
>> - enum { BadIndex = ~0UL };
>> -
>> - key_type EmptyKey;
>> - mapped_type EmptyValue;
>> -
>> - value_type Array[MaxArraySize + 1];
>> - unsigned NumElements;
>> -
>> - unsigned findFor(const KeyTy Ptr) const {
>> - // Linear search for the item.
>> - for (const value_type *APtr = Array, *E = Array + NumElements;
>> - APtr != E; ++APtr) {
>> - if (APtr->first == Ptr) {
>> - return APtr - Array;
>> - }
>> - }
>> - return BadIndex;
>> - }
>> -
>> - bool lookupFor(const KeyTy &Ptr, const value_type*& Found) const {
>> - unsigned FoundIdx = findFor(Ptr);
>> - if (FoundIdx != BadIndex) {
>> - Found = Array + FoundIdx;
>> - return true;
>> - }
>> - return false;
>> - }
>> -
>> - bool lookupFor(const KeyTy &Ptr, value_type*& Found) {
>> - unsigned FoundIdx = findFor(Ptr);
>> - if (FoundIdx != BadIndex) {
>> - Found = Array + FoundIdx;
>> - return true;
>> - }
>> - return false;
>> - }
>> -
>> -
>> - void copyFrom(const self &RHS) {
>> - memcpy(Array, RHS.Array, sizeof(value_type) * (MaxArraySize + 1));
>> - NumElements = RHS.NumElements;
>> - }
>> -
>> - void init () {
>> - memset(Array + MaxArraySize, 0, sizeof(value_type));
>> - NumElements = 0;
>> - }
>> -
>> - bool insertInternal(KeyTy Ptr, MappedTy Val, value_type*& Item) {
>> - // Check to see if it is already in the set.
>> - value_type *Found;
>> - if (lookupFor(Ptr, Found)) {
>> - Item = Found;
>> - return false;
>> - }
>> - if (NumElements < MaxArraySize) {
>> - unsigned Idx = NumElements++;
>> - Array[Idx] = std::make_pair(Ptr, Val);
>> - Item = Array + Idx;
>> - return true;
>> - }
>> - Item = Array + MaxArraySize; // return end()
>> - return false;
>> - }
>> -
>> - public:
>> -
>> - // Constructors
>> -
>> - FlatArrayMap() : EmptyKey(), EmptyValue() {
>> - init();
>> - }
>> -
>> - FlatArrayMap(const self &that) :
>> - EmptyKey(), EmptyValue() {
>> - copyFrom(that);
>> - }
>> -
>> - template<typename It>
>> - FlatArrayMap(It I, It E) :
>> - EmptyKey(), EmptyValue() {
>> - init();
>> - insert(I, E);
>> - }
>> -
>> - // Size
>> -
>> - unsigned size() const {
>> - return NumElements;
>> - }
>> -
>> - bool empty() const {
>> - return !NumElements;
>> - }
>> -
>> - // Iterators
>> -
>> - iterator begin() {
>> - return iterator(Array);
>> - }
>> - const_iterator begin() const {
>> - return const_iterator(Array);
>> - }
>> -
>> - iterator end() {
>> - return iterator(Array + MaxArraySize);
>> - }
>> - const_iterator end() const {
>> - return const_iterator(Array + MaxArraySize);
>> - }
>> -
>> - // Modifiers
>> -
>> - void clear() {
>> - for (unsigned i = 0; i < NumElements; ++i) {
>> - Array[i].first = EmptyKey;
>> - Array[i].second = EmptyValue;
>> - }
>> - NumElements = 0;
>> - }
>> -
>> - // The map container is extended by inserting a single new element.
>> - // The behavior is the same as the std::map::insert, except the
>> - // case when maximum number of elements is reached;
>> - // in this case map declines any farther attempts
>> - // to insert new elements ("insert" method returns <end(),false>).
>> - std::pair<iterator, bool> insert(const value_type& KV) {
>> - value_type* Item;
>> - bool Res = insertInternal(KV.first, KV.second, Item);
>> - return std::make_pair(iterator(Item), Res);
>> - }
>> -
>> - template <typename IterT>
>> - void insert(IterT I, IterT E) {
>> - for (; I != E; ++I)
>> - insert(*I);
>> - }
>> -
>> - void erase(key_type K) {
>> - unsigned Found = findFor(K);
>> - if (Found != BadIndex) {
>> - value_type *APtr = Array + Found;
>> - value_type *E = Array + NumElements;
>> - *APtr = E[-1];
>> - E[-1].first.~key_type();
>> - E[-1].second.~mapped_type();
>> - --NumElements;
>> - }
>> - }
>> -
>> - void erase(iterator i) {
>> - erase(i->first);
>> - }
>> -
>> - void swap(self& RHS) {
>> - std::swap_ranges(Array, Array+MaxArraySize, RHS.Array);
>> - std::swap(this->NumElements, RHS.NumElements);
>> - }
>> -
>> - // Search operations
>> -
>> - iterator find(const key_type& K) {
>> - value_type *Found;
>> - if (lookupFor(K, Found))
>> - return iterator(Found);
>> - return end();
>> - }
>> -
>> - const_iterator find(const key_type& K) const {
>> - const value_type *Found;
>> - if (lookupFor(K, Found))
>> - return const_iterator(Found);
>> - return end();
>> - }
>> -
>> - bool count(const key_type& K) const {
>> - return find(K) != end();
>> - }
>> -
>> - mapped_type &operator[](const key_type &Key) {
>> - std::pair<iterator, bool> res = insert(Key, mapped_type());
>> - return res.first->second;
>> - }
>> -
>> - // Other operations
>> -
>> - self& operator=(const self& other) {
>> - clear();
>> - copyFrom(other);
>> - return *this;
>> - }
>> -
>> - /// isPointerIntoBucketsArray - Return true if the specified pointer points
>> - /// somewhere into the map's array of buckets (i.e. either to a key or
>> - /// value).
>> - bool isPointerIntoBucketsArray(const void *Ptr) const {
>> - return Ptr >= Array && Ptr < Array + NumElements;
>> - }
>> -
>> - /// getPointerIntoBucketsArray() - Return an opaque pointer into the buckets
>> - /// array.
>> - const void *getPointerIntoBucketsArray() const { return Array; }
>> - };
>> -
>> - template<typename KeyTy, typename MappedTy, bool IsConst>
>> - class FlatArrayMapIterator {
>> -
>> - typedef FlatArrayMapTypes<KeyTy, MappedTy> Types;
>> -
>> - typedef typename conditional<IsConst,
>> - const typename Types::value_type,
>> - typename Types::value_type>::type value_type;
>> - typedef value_type *pointer;
>> - typedef value_type &reference;
>> -
>> - typedef FlatArrayMapIterator<KeyTy, MappedTy, IsConst> self;
>> - typedef FlatArrayMapIterator<KeyTy, MappedTy, false> non_const_self;
>> - typedef FlatArrayMapIterator<KeyTy, MappedTy, true> const_self;
>> -
>> - friend class FlatArrayMapIterator<KeyTy, MappedTy, false>;
>> - friend class FlatArrayMapIterator<KeyTy, MappedTy, true>;
>> -
>> - pointer TheBucket;
>> -
>> - public:
>> -
>> - FlatArrayMapIterator() : TheBucket(0) {}
>> -
>> - explicit FlatArrayMapIterator(pointer BP) :
>> - TheBucket(BP) {}
>> -
>> - // If IsConst is true this is a converting constructor from iterator to
>> - // const_iterator and the default copy constructor is used.
>> - // Otherwise this is a copy constructor for iterator.
>> - FlatArrayMapIterator(const non_const_self& I)
>> - : TheBucket(I.TheBucket) {}
>> -
>> - bool operator==(const const_self &RHS) const {
>> - return TheBucket->first == RHS.TheBucket->first;
>> - }
>> - bool operator!=(const const_self &RHS) const {
>> - return TheBucket->first != RHS.TheBucket->first;
>> - }
>> -
>> - reference operator*() const {
>> - return *TheBucket;
>> - }
>> -
>> - pointer operator->() const {
>> - return TheBucket;
>> - }
>> -
>> - inline self& operator++() { // Preincrement
>> - ++TheBucket;
>> - return *this;
>> - }
>> -
>> - self operator++(int) { // Postincrement
>> - FlatArrayMapIterator tmp = *this; ++*this; return tmp;
>> - }
>> - };
>> -}
>> -
>> -#endif /* FLATARRAYMAP_H_ */
>>
>> Removed: llvm/trunk/include/llvm/ADT/MultiImplMap.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/MultiImplMap.h?rev=155561&view=auto
>> ==============================================================================
>> --- llvm/trunk/include/llvm/ADT/MultiImplMap.h (original)
>> +++ llvm/trunk/include/llvm/ADT/MultiImplMap.h (removed)
>> @@ -1,550 +0,0 @@
>> -//===- llvm/ADT/MultiImplMap.h - 'Normally small' pointer set ----*- 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 MultiImplMap class.
>> -// MultiImplMap presents map container interface.
>> -// It has two modes, one for small amount of elements and one for big amount.
>> -// User should set map implementation for both of them. User also should
>> -// set the maximum possible number of elements for small mode.
>> -// If user want to use MultiImplMap instead of DenseMap, he should pass
>> -// DenseMapCompatible = true. Note that in this case map implementations should
>> -// present additional DenseMap specific methods (see below).
>> -// Initially MultiImplMap uses small mode and small map implementation.
>> -// It triggered to the big mode when number of contained elements exceeds
>> -// maximum possible elements for small mode.
>> -//
>> -// Types that should be defined in nested map class:
>> -//
>> -// key_type;
>> -// mapped_type;
>> -// value_type; // std::pair<key_type, mapped_type>
>> -// // or std::pair<const key_type, mapped_type>
>> -// iterator;
>> -// const_iterator;
>> -//
>> -// Map implementation should provide the next interface:
>> -//
>> -// // Constructors
>> -// (default constructor)
>> -// (copy constructor)
>> -//
>> -// // Size
>> -// unsigned size() const;
>> -// bool empty() const;
>> -//
>> -// // Iterators
>> -// iterator begin();
>> -// const_iterator begin();
>> -// iterator end();
>> -// const_iterator end();
>> -//
>> -// // Modifiers
>> -// void clear();
>> -// std::pair<iterator, bool> insert(const value_type& KV);
>> -// template <typename IterT>
>> -// void insert(IterT I, IterT E);
>> -// void erase(key_type K);
>> -// void erase(iterator i);
>> -// void swap(MultiImplMap& rhs);
>> -//
>> -// // Search operations
>> -// iterator find(const key_type& K);
>> -// const_iterator find(const key_type& K) const;
>> -// bool count(const key_type& K) const;
>> -// mapped_type &operator[](const key_type &Key);
>> -//
>> -// // Other operations
>> -// self& operator=(const self& other);
>> -//
>> -// // If DenseMapCompatible == true, you also should present next methods.
>> -// // See DenseMap comments for more details about its behavior.
>> -// bool isPointerIntoBucketsArray(const void *Ptr) const;
>> -// const void *getPointerIntoBucketsArray() const;
>> -// value_type& FindAndConstruct(const key_type &Key);
>> -//
>> -// The list of methods that should be implemented in nested map iterator class:
>> -//
>> -// (conversion constructor from non-constant iterator)
>> -//
>> -// bool operator==(const const_iterator& rhs) const;
>> -// bool operator!=(const const_iterator& rhs) const;
>> -// reference operator*() const;
>> -// pointer operator->() const;
>> -// inline self& operator++();
>> -//
>> -//
>> -//===----------------------------------------------------------------------===//
>> -
>> -#ifndef MULTIIMPLEMENTATIONMAP_H_
>> -#define MULTIIMPLEMENTATIONMAP_H_
>> -
>> -
>> -#include <algorithm>
>> -#include <utility>
>> -#include "llvm/ADT/DenseMap.h"
>> -#include "llvm/ADT/FlatArrayMap.h"
>> -#include "llvm/Support/type_traits.h"
>> -
>> -namespace llvm {
>> -
>> - template<class SmallMapTy, class BigMapTy, bool IsConst = false>
>> - class MultiImplMapIterator;
>> -
>> - template<class SmallMapTy, class BigMapTy>
>> - struct MultiImplMapIteratorsFactory;
>> -
>> - template<class SmallMapTy, class BigMapTy>
>> - struct MultiImplMapTypes {
>> - typedef typename SmallMapTy::key_type key_type;
>> - typedef typename SmallMapTy::mapped_type mapped_type;
>> - typedef typename std::pair<key_type, mapped_type> value_type;
>> - };
>> -
>> - //===--------------------------------------------------------------------===//
>> - /// MultiImplMap is map that has two modes, one for small amount of
>> - /// elements and one for big amount.
>> - /// User should set map implementation for both of them. User also should
>> - /// set the maximum possible number of elements for small mode.
>> - /// If user want to use MultiImplMap instead of DenseMap, he should pass
>> - /// DenseMapCompatible = true.
>> - /// Initially MultiImplMap uses small mode and small map implementation.
>> - /// It triggered to the big mode when number of contained elements exceeds
>> - /// maximum possible elements for small mode.
>> - template<class SmallMapTy, class BigMapTy, unsigned MaxSmallN,
>> - bool DenseMapCompatible = false,
>> - class ItFactory =
>> - MultiImplMapIteratorsFactory<SmallMapTy, BigMapTy> >
>> - class MultiImplMap {
>> -
>> - protected:
>> - SmallMapTy SmallMap;
>> - BigMapTy BigMap;
>> - bool UseSmall;
>> - enum { MaxSmallSize = MaxSmallN };
>> -
>> - public:
>> - typedef MultiImplMapTypes<SmallMapTy, BigMapTy> Types;
>> -
>> - typedef typename Types::key_type key_type;
>> - typedef typename Types::mapped_type mapped_type;
>> - typedef typename Types::value_type value_type;
>> -
>> - typedef typename ItFactory::iterator iterator;
>> - typedef typename ItFactory::const_iterator const_iterator;
>> -
>> - typedef std::pair<iterator, bool> ins_res;
>> -
>> - typedef typename std::pair<typename SmallMapTy::iterator, bool>
>> - small_ins_res;
>> -
>> - typedef typename std::pair<typename BigMapTy::iterator, bool>
>> - big_ins_res;
>> -
>> - typedef MultiImplMap<SmallMapTy, BigMapTy, MaxSmallN> self;
>> -
>> - MultiImplMap() : UseSmall(true) {}
>> -
>> - MultiImplMap(const self& other) {
>> - if (other.UseSmall) {
>> - SmallMap = other.SmallMap;
>> - UseSmall = true;
>> - } else {
>> - if (other.size() <= MaxSmallN) {
>> - SmallMap.insert(other.BigMap.begin(), other.BigMap.end());
>> - UseSmall = true;
>> - } else {
>> - BigMap = other.BigMap;
>> - UseSmall = false;
>> - }
>> - }
>> - }
>> -
>> - // Size
>> -
>> - unsigned size() const {
>> - if (UseSmall)
>> - return SmallMap.size();
>> - return BigMap.size();
>> - }
>> -
>> - bool empty() const {
>> - if (UseSmall)
>> - return SmallMap.empty();
>> - return BigMap.empty();
>> - }
>> -
>> - // Iterators
>> -
>> - iterator begin() {
>> - if (UseSmall)
>> - return ItFactory::begin(SmallMap);
>> - return ItFactory::begin(BigMap);
>> - }
>> - const_iterator begin() const {
>> - if (UseSmall)
>> - return ItFactory::begin(SmallMap);
>> - return ItFactory::begin(BigMap);
>> - }
>> -
>> - iterator end() {
>> - if (UseSmall)
>> - return ItFactory::end(SmallMap);
>> - return ItFactory::end(BigMap);
>> - }
>> - const_iterator end() const {
>> - if (UseSmall)
>> - return ItFactory::end(SmallMap);
>> - return ItFactory::end(BigMap);
>> - }
>> -
>> - // Modifiers
>> -
>> - void clear() {
>> - if (UseSmall)
>> - SmallMap.clear();
>> - else
>> - BigMap.clear();
>> - }
>> -
>> - std::pair<iterator, bool> insert(const value_type& KV) {
>> - if (UseSmall) {
>> - if (SmallMap.size() < MaxSmallSize) {
>> - small_ins_res Res = SmallMap.insert(KV);
>> - return std::make_pair(ItFactory::it(SmallMap, Res.first), Res.second);
>> - }
>> -
>> - // Move all to big map.
>> - BigMap.insert(SmallMap.begin(), SmallMap.end());
>> - SmallMap.clear();
>> -
>> - UseSmall = false;
>> - }
>> - big_ins_res Res = BigMap.insert(KV);
>> - return std::make_pair(ItFactory::it(BigMap, Res.first), Res.second);
>> - }
>> -
>> - template <typename OtherValTy>
>> - std::pair<iterator, bool> insert(const OtherValTy& OtherKV) {
>> - const value_type* KV = reinterpret_cast<const value_type*>(
>> - reinterpret_cast<const void*>(OtherKV));
>> - return insert(*KV);
>> - }
>> -
>> - template <typename IterT>
>> - void insert(IterT I, IterT E) {
>> - for (; I != E; ++I)
>> - insert(*I);
>> - }
>> -
>> - void erase(key_type K) {
>> - if (UseSmall)
>> - SmallMap.erase(K);
>> - else
>> - BigMap.erase(K);
>> - }
>> -
>> - void erase(iterator i) {
>> - erase(i->first);
>> - }
>> -
>> - void swap(MultiImplMap& rhs) {
>> - SmallMap.swap(rhs.SmallMap);
>> - BigMap.swap(rhs.BigMap);
>> - std::swap(UseSmall, rhs.UseSmall);
>> - }
>> -
>> - // Search operations
>> -
>> - iterator find(const key_type& K) {
>> - if (UseSmall)
>> - return ItFactory::it(SmallMap, SmallMap.find(K));
>> - return ItFactory::it(BigMap, BigMap.find(K));
>> - }
>> -
>> - const_iterator find(const key_type& K) const {
>> - if (UseSmall)
>> - return ItFactory::const_it(SmallMap, SmallMap.find(K));
>> - return ItFactory::const_it(BigMap, BigMap.find(K));
>> - }
>> -
>> - bool count(const key_type& K) const {
>> - return find(K) != end();
>> - }
>> -
>> - mapped_type &operator[](const key_type &Key) {
>> - ins_res res = insert(std::make_pair(Key, mapped_type()));
>> - return res.first->second;
>> - }
>> -
>> - // Other operations
>> -
>> - self& operator=(const self& other) {
>> - if (other.isSmall()) {
>> - SmallMap = other.SmallMap;
>> - if (!UseSmall) {
>> - BigMap.clear();
>> - UseSmall = true;
>> - }
>> - return *this;
>> - }
>> - if (UseSmall) {
>> - SmallMap.clear();
>> - UseSmall = false;
>> - }
>> - BigMap = other.BigMap;
>> - return *this;
>> - }
>> -
>> - // Utilities
>> -
>> - bool isSmall()const {
>> - return UseSmall;
>> - }
>> -
>> - SmallMapTy& getSmallMap() {
>> - return SmallMap;
>> - }
>> -
>> - const SmallMapTy& getSmallMap() const {
>> - return SmallMap;
>> - }
>> -
>> - BigMapTy& getBigMap() {
>> - return BigMap;
>> - }
>> -
>> - const BigMapTy& getBigMap() const {
>> - return BigMap;
>> - }
>> - };
>> -
>> - template<class SmallMapTy, class BigMapTy, unsigned MaxSmallN>
>> - class MultiImplMap<SmallMapTy, BigMapTy, MaxSmallN, true> :
>> - public MultiImplMap<SmallMapTy, BigMapTy, MaxSmallN, false>
>> - {
>> - public:
>> - typedef MultiImplMap<SmallMapTy, BigMapTy, MaxSmallN, false> ParentTy;
>> - typedef typename ParentTy::Types Types;
>> -
>> - typedef typename Types::key_type key_type;
>> - typedef typename Types::mapped_type mapped_type;
>> - typedef typename Types::value_type value_type;
>> - typedef typename ParentTy::iterator iterator;
>> -
>> - /// isPointerIntoBucketsArray - Return true if the specified pointer points
>> - /// somewhere into the DenseMap's array of buckets (i.e. either to a key or
>> - /// value).
>> - bool isPointerIntoBucketsArray(const void *Ptr) const {
>> - if (this->UseSmall)
>> - return this->SmallMap.isPointerIntoBucketsArray(Ptr);
>> - return this->BigMap.isPointerIntoBucketsArray(Ptr);
>> - }
>> -
>> - /// getPointerIntoBucketsArray() - Return an opaque pointer into the buckets
>> - /// array. In conjunction with the previous method, this can be used to
>> - /// determine whether an insertion caused the map to reallocate data.
>> - const void *getPointerIntoBucketsArray() const {
>> - if (this->UseSmall)
>> - return this->SmallMap.getPointerIntoBucketsArray();
>> - return this->BigMap.getPointerIntoBucketsArray();
>> - }
>> -
>> - value_type& FindAndConstruct(const key_type &Key) {
>> - std::pair<iterator, bool> Res =
>> - this->insert(std::make_pair(Key, mapped_type()));
>> - return *Res.first;
>> - }
>> - };
>> -
>> - template<class SmallMapTy, class BigMapTy, bool IsConst>
>> - class MultiImplMapIterator {
>> - public:
>> -
>> - typedef MultiImplMapTypes<SmallMapTy, BigMapTy> Types;
>> -
>> - typedef typename Types::mapped_type mapped_type;
>> -
>> - typedef typename conditional<IsConst,
>> - const typename Types::value_type,
>> - typename Types::value_type>::type value_type;
>> -
>> - typedef typename conditional<IsConst,
>> - typename SmallMapTy::const_iterator,
>> - typename SmallMapTy::iterator>::type
>> - small_iterator;
>> -
>> - typedef typename conditional<IsConst,
>> - typename BigMapTy::const_iterator,
>> - typename BigMapTy::iterator>::type
>> - big_iterator;
>> -
>> - typedef typename conditional<IsConst, const void*, void*>::type void_ptr_ty;
>> -
>> - typedef value_type *pointer;
>> - typedef value_type &reference;
>> -
>> - typedef MultiImplMapIterator<SmallMapTy, BigMapTy, IsConst> self;
>> -
>> - typedef MultiImplMapIterator<SmallMapTy, BigMapTy, false> non_const_self;
>> - typedef MultiImplMapIterator<SmallMapTy, BigMapTy, true> const_self;
>> -
>> - friend class MultiImplMapIterator<SmallMapTy, BigMapTy, true>;
>> - friend class MultiImplMapIterator<SmallMapTy, BigMapTy, false>;
>> -
>> - protected:
>> -
>> - template <typename OtherValTy>
>> - static value_type* toValueTypePtr(OtherValTy& ValTyRef) {
>> - return reinterpret_cast<value_type*>(
>> - reinterpret_cast<void_ptr_ty>(&ValTyRef));
>> - }
>> -
>> - template <typename OtherValTy>
>> - static value_type& toValueTypeRef(OtherValTy& ValTyRef) {
>> - return *reinterpret_cast<value_type*>(
>> - reinterpret_cast<void_ptr_ty>(&ValTyRef));
>> - }
>> -
>> - small_iterator SmallIt;
>> - big_iterator BigIt;
>> - bool UseSmall;
>> -
>> - public:
>> -
>> - MultiImplMapIterator() : UseSmall(true) {}
>> - MultiImplMapIterator(small_iterator It) : SmallIt(It), UseSmall(true) {}
>> - MultiImplMapIterator(big_iterator It) : BigIt(It), UseSmall(false) {}
>> - MultiImplMapIterator(const non_const_self& src) :
>> - SmallIt(src.SmallIt), BigIt(src.BigIt), UseSmall(src.UseSmall) {}
>> -
>> - bool operator==(const const_self& rhs) const {
>> - if (UseSmall != rhs.UseSmall)
>> - return false;
>> - if (UseSmall)
>> - return SmallIt == rhs.SmallIt;
>> - return BigIt == rhs.BigIt;
>> - }
>> -
>> - bool operator!=(const const_self& rhs) const {
>> - if (UseSmall != rhs.UseSmall)
>> - return true;
>> - if (UseSmall)
>> - return SmallIt != rhs.SmallIt;
>> - return BigIt != rhs.BigIt;
>> - }
>> -
>> - reference operator*() const {
>> - return UseSmall ? toValueTypeRef(*SmallIt) : toValueTypeRef(*BigIt);;
>> - }
>> -
>> - pointer operator->() const {
>> - return UseSmall ? toValueTypePtr(*SmallIt) : toValueTypePtr(*BigIt);
>> - }
>> -
>> - // Preincrement
>> - inline self& operator++() {
>> - if (UseSmall) ++SmallIt;
>> - return *this;
>> - }
>> -
>> - // Postincrement
>> - self operator++(int) {
>> - self tmp = *this; ++*this; return tmp;
>> - }
>> - };
>> -
>> - template<class SmallMapTy, class BigMapTy>
>> - struct MultiImplMapIteratorsFactory {
>> -
>> - typedef MultiImplMapIterator<SmallMapTy, BigMapTy, false> iterator;
>> - typedef MultiImplMapIterator<SmallMapTy, BigMapTy, true> const_iterator;
>> -
>> - template<class MapImpl, class ItTy>
>> - static iterator it(MapImpl& impl, ItTy it) {
>> - return iterator(it);
>> - }
>> - template<class MapImpl, class ConstItTy>
>> - static const_iterator const_it(const MapImpl& impl, ConstItTy it) {
>> - return const_iterator(it);
>> - }
>> - template<class MapImpl>
>> - static iterator begin(MapImpl& impl) {
>> - return iterator(impl.begin());
>> - }
>> - template<class MapImpl>
>> - static const_iterator begin(const MapImpl& impl) {
>> - return const_iterator(impl.begin());
>> - }
>> - template<class MapImpl>
>> - static iterator end(MapImpl& impl) {
>> - return iterator(impl.end());
>> - }
>> - template<class MapImpl>
>> - static const_iterator end(const MapImpl& impl) {
>> - return const_iterator(impl.end());
>> - }
>> - };
>> -
>> - template<typename KeyTy, typename MappedTy, unsigned MaxArraySize,
>> - typename KeyInfoT>
>> - struct MultiImplMapIteratorsFactory<
>> - FlatArrayMap<KeyTy, MappedTy, MaxArraySize>,
>> - DenseMap<KeyTy, MappedTy, KeyInfoT> >
>> - {
>> -
>> - typedef FlatArrayMap<KeyTy, MappedTy, MaxArraySize> SmallMapTy;
>> - typedef DenseMap<KeyTy, MappedTy, KeyInfoT> BigMapTy;
>> -
>> - typedef DenseMapIterator<KeyTy, MappedTy, KeyInfoT, false>
>> - iterator;
>> - typedef DenseMapIterator<KeyTy, MappedTy, KeyInfoT, true>
>> - const_iterator;
>> -
>> - static iterator it(SmallMapTy& impl, typename SmallMapTy::iterator it) {
>> - return iterator(&(*it), &(*impl.end()));
>> - }
>> - static const_iterator const_it(
>> - const SmallMapTy& impl, typename SmallMapTy::const_iterator it) {
>> - return const_iterator(&(*it), &(*impl.end()));
>> - }
>> - static iterator it(BigMapTy& impl, typename BigMapTy::iterator it) {
>> - return it;
>> - }
>> - static const_iterator const_it(
>> - const BigMapTy& impl, typename BigMapTy::const_iterator it) {
>> - return it;
>> - }
>> - static iterator begin(SmallMapTy& impl) {
>> - return it(impl, impl.begin());
>> - }
>> - static const_iterator begin(const SmallMapTy& impl) {
>> - return it(impl, impl.begin());
>> - }
>> - static iterator begin(BigMapTy& impl) {
>> - return impl.begin();
>> - }
>> - static const_iterator begin(const BigMapTy& impl) {
>> - return impl.begin();
>> - }
>> - static iterator end(SmallMapTy& impl) {
>> - return it(impl, impl.end());
>> - }
>> - static const_iterator end(const SmallMapTy& impl) {
>> - return const_it(impl, impl.end());
>> - }
>> - static iterator end(BigMapTy& impl) {
>> - return impl.end();
>> - }
>> - static const_iterator end(const BigMapTy& impl) {
>> - return impl.end();
>> - }
>> - };
>> -}
>> -
>> -#endif /* MULTIIMPLEMENTATIONMAP_H_ */
>>
>> Removed: llvm/trunk/include/llvm/ADT/SmallMap.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/SmallMap.h?rev=155561&view=auto
>> ==============================================================================
>> --- llvm/trunk/include/llvm/ADT/SmallMap.h (original)
>> +++ llvm/trunk/include/llvm/ADT/SmallMap.h (removed)
>> @@ -1,37 +0,0 @@
>> -//===- llvm/ADT/SmallMap.h - 'Normally small' pointer set -------*- 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 SmallMap class.
>> -// SmallMap is DenseMap compatible MultiImplMap.
>> -// It uses FlatArrayMap for small mode, and DenseMap for big mode.
>> -// See MultiMapImpl comments for more details on the algorithm is used.
>> -//
>> -//===----------------------------------------------------------------------===//
>> -
>> -#ifndef SMALLPTRMAP_H_
>> -#define SMALLPTRMAP_H_
>> -
>> -#include "llvm/ADT/DenseMap.h"
>> -#include "llvm/ADT/FlatArrayMap.h"
>> -#include "llvm/ADT/MultiImplMap.h"
>> -
>> -namespace llvm {
>> -
>> - //===--------------------------------------------------------------------===//
>> - /// SmallMap is wrapper around MultiImplMap. It uses FlatArrayMap for
>> - /// small mode, and DenseMap for big mode.
>> - template <typename KeyTy, typename MappedTy, unsigned N = 16>
>> - class SmallMap : public MultiImplMap<
>> - FlatArrayMap<KeyTy, MappedTy, N>,
>> - DenseMap<KeyTy, MappedTy>,
>> - N, true> {
>> - };
>> -}
>> -
>> -#endif /* SMALLPTRMAP_H_ */
>>
>> Removed: llvm/trunk/unittests/ADT/SmallMapTest.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/SmallMapTest.cpp?rev=155561&view=auto
>> ==============================================================================
>> --- llvm/trunk/unittests/ADT/SmallMapTest.cpp (original)
>> +++ llvm/trunk/unittests/ADT/SmallMapTest.cpp (removed)
>> @@ -1,133 +0,0 @@
>> -//===- llvm/unittest/ADT/SmallMapTest.cpp ------------------------------===//
>> -//
>> -// The LLVM Compiler Infrastructure
>> -//
>> -// This file is distributed under the University of Illinois Open Source
>> -// License. See LICENSE.TXT for details.
>> -//
>> -//===----------------------------------------------------------------------===//
>> -//
>> -// SmallMap unit tests.
>> -//
>> -//===----------------------------------------------------------------------===//
>> -
>> -#include "gtest/gtest.h"
>> -#include "llvm/ADT/SmallMap.h"
>> -
>> -using namespace llvm;
>> -
>> -// SmallMap test.
>> -TEST(SmallMapTest, GeneralTest) {
>> -
>> - int buf[10];
>> -
>> - SmallMap<int *, int, 3> a;
>> - SmallMap<int *, int, 3> b;
>> - SmallMap<int *, int, 3>::iterator found;
>> - std::pair<SmallMap<int *, int, 3>::iterator, bool> insRes;
>> - SmallMap<int *, int, 3>::const_iterator foundc;
>> -
>> - a.insert(std::make_pair(&buf[0], 0));
>> - insRes = a.insert(std::make_pair(&buf[1], 1));
>> - EXPECT_TRUE(insRes.second);
>> -
>> - // Check insertion, looking up, and data editing in small mode.
>> - insRes = a.insert(std::make_pair(&buf[1], 6));
>> - EXPECT_FALSE(insRes.second);
>> - EXPECT_EQ(insRes.first->second, 1);
>> - insRes.first->second = 5;
>> - found = a.find(&buf[1]);
>> - EXPECT_NE(found, a.end());
>> - EXPECT_EQ(found->second, 5);
>> - a[&buf[1]] = 10;
>> - EXPECT_EQ(found->second, 10);
>> - // Check "not found" case.
>> - found = a.find(&buf[8]);
>> - EXPECT_EQ(found, a.end());
>> -
>> - // Check increment for small mode.
>> - found = a.begin();
>> - ++found;
>> - EXPECT_EQ(found->second, 10);
>> -
>> - b.insert(std::make_pair(&buf[2], 2));
>> -
>> - std::swap(a, b);
>> - a.swap(b);
>> - std::swap(a, b);
>> -
>> - EXPECT_EQ(1U, a.size());
>> - EXPECT_EQ(2U, b.size());
>> - EXPECT_TRUE(a.count(&buf[2]));
>> - EXPECT_TRUE(b.count(&buf[0]));
>> - EXPECT_TRUE(b.count(&buf[1]));
>> -
>> - insRes = b.insert(std::make_pair(&buf[3], 3));
>> - EXPECT_TRUE(insRes.second);
>> -
>> - // Check insertion, looking up, and data editing in big mode.
>> - insRes = b.insert(std::make_pair(&buf[3], 6));
>> - EXPECT_FALSE(insRes.second);
>> - EXPECT_EQ(insRes.first->second, 3);
>> - insRes.first->second = 7;
>> - found = b.find(&buf[3]);
>> - EXPECT_EQ(found->second, 7);
>> - b[&buf[3]] = 14;
>> - EXPECT_EQ(found->second, 14);
>> - // Check constant looking up.
>> - foundc = b.find(&buf[3]);
>> - EXPECT_EQ(foundc->first, &buf[3]);
>> - EXPECT_EQ(foundc->second, 14);
>> - // Check not found case.
>> - found = b.find(&buf[8]);
>> - EXPECT_EQ(found, b.end());
>> -
>> - // Check increment for big mode.
>> - found = b.find(&buf[1]);
>> - ++found;
>> - EXPECT_EQ(found->second, 14);
>> -
>> - std::swap(a, b);
>> - a.swap(b);
>> - std::swap(a, b);
>> -
>> - EXPECT_EQ(3U, a.size());
>> - EXPECT_EQ(1U, b.size());
>> - EXPECT_TRUE(a.count(&buf[0]));
>> - EXPECT_TRUE(a.count(&buf[1]));
>> - EXPECT_TRUE(a.count(&buf[3]));
>> - EXPECT_TRUE(b.count(&buf[2]));
>> - EXPECT_EQ(b.find(&buf[2])->second, 2);
>> -
>> - std::swap(a, b);
>> - a.swap(b);
>> - std::swap(a, b);
>> -
>> - EXPECT_EQ(1U, a.size());
>> - EXPECT_EQ(3U, b.size());
>> - EXPECT_TRUE(a.count(&buf[2]));
>> - EXPECT_TRUE(b.count(&buf[0]));
>> - EXPECT_TRUE(b.count(&buf[1]));
>> - EXPECT_TRUE(b.count(&buf[3]));
>> -
>> - a.insert(std::make_pair(&buf[4], 4));
>> - a.insert(std::make_pair(&buf[5], 5));
>> - a.insert(std::make_pair(&buf[6], 6));
>> -
>> - std::swap(b, a);
>> -
>> - EXPECT_EQ(3U, a.size());
>> - EXPECT_EQ(4U, b.size());
>> - EXPECT_TRUE(b.count(&buf[2]));
>> - EXPECT_TRUE(b.count(&buf[4]));
>> - EXPECT_TRUE(b.count(&buf[5]));
>> - EXPECT_TRUE(b.count(&buf[6]));
>> - EXPECT_TRUE(a.count(&buf[0]));
>> - EXPECT_TRUE(a.count(&buf[1]));
>> - EXPECT_TRUE(a.count(&buf[3]));
>> -
>> - // Check findAndConstruct
>> - SmallMap<int *, int, 3>::value_type Buf7;
>> - Buf7 = a.FindAndConstruct(&buf[7]);
>> - EXPECT_EQ(Buf7.second, 0);
>> -}
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list