[llvm] r225054 - Add a SmallMapVector class that is a MapVector with a Map of SmallDenseMap and a Vector of SmallVector.

David Blaikie dblaikie at gmail.com
Fri Jan 2 14:20:19 PST 2015


On Wed, Dec 31, 2014 at 10:19 PM, Michael Gottesman <mgottesman at apple.com>
wrote:

> TBH I was just following what we did for SmallDenseMap. I am fine making
> this change.
>

Looks like the alias template wasn't supported in MSVC2012? Fair enough.

I'd still suggest changing it from:

class ... : public ... {
public:
  ...() {}
};

to

struct ... : ... {
};

for simplicity.


>
> Michael
>
> On Dec 31, 2014, at 6:44 PM, David Blaikie <dblaikie at gmail.com> wrote:
>
>
>
> On Wed, Dec 31, 2014 at 3:33 PM, Michael Gottesman <mgottesman at apple.com>
> wrote:
>
>> Author: mgottesman
>> Date: Wed Dec 31 17:33:21 2014
>> New Revision: 225054
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=225054&view=rev
>> Log:
>> Add a SmallMapVector class that is a MapVector with a Map of
>> SmallDenseMap and a Vector of SmallVector.
>>
>> Modified:
>>     llvm/trunk/include/llvm/ADT/MapVector.h
>>     llvm/trunk/unittests/ADT/MapVectorTest.cpp
>>
>> Modified: llvm/trunk/include/llvm/ADT/MapVector.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/MapVector.h?rev=225054&r1=225053&r2=225054&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/ADT/MapVector.h (original)
>> +++ llvm/trunk/include/llvm/ADT/MapVector.h Wed Dec 31 17:33:21 2014
>> @@ -18,6 +18,7 @@
>>  #define LLVM_ADT_MAPVECTOR_H
>>
>>  #include "llvm/ADT/DenseMap.h"
>> +#include "llvm/ADT/SmallVector.h"
>>  #include <vector>
>>
>>  namespace llvm {
>> @@ -181,6 +182,16 @@ void MapVector<KeyT, ValueT, MapType, Ve
>>    Vector.erase(O, Vector.end());
>>  }
>>
>> +/// \brief A MapVector that performs no allocations if smaller than a
>> certain
>> +/// size.
>> +template <typename KeyT, typename ValueT, unsigned N>
>> +class SmallMapVector
>> +    : public MapVector<KeyT, ValueT, SmallDenseMap<KeyT, unsigned, N>,
>> +                       SmallVector<std::pair<KeyT, ValueT>, N>> {
>>
>
> Should this be an alias template instead? (or is that not supported on all
> our compilers? (I imagine it probably isn't supported on MSVC?))
>
>
>> +public:
>> +  SmallMapVector() {}
>>
>
> This is just the default, isn't it? Perhaps you could omit it (I'd
> probably just make SmallMapVector a struct instead of a class - with no
> members and rely on the implicit public-ness of inheritance in structs)
>
> - David
>
>
>> +};
>> +
>>  } // end namespace llvm
>>
>>  #endif
>>
>> Modified: llvm/trunk/unittests/ADT/MapVectorTest.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/MapVectorTest.cpp?rev=225054&r1=225053&r2=225054&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/unittests/ADT/MapVectorTest.cpp (original)
>> +++ llvm/trunk/unittests/ADT/MapVectorTest.cpp Wed Dec 31 17:33:21 2014
>> @@ -122,3 +122,221 @@ TEST(MapVectorTest, iteration_test) {
>>      count--;
>>    }
>>  }
>> +
>> +TEST(SmallMapVectorSmallTest, insert_pop) {
>> +  SmallMapVector<int, int, 32> MV;
>> +  std::pair<SmallMapVector<int, int, 32>::iterator, bool> R;
>> +
>> +  R = MV.insert(std::make_pair(1, 2));
>> +  ASSERT_EQ(R.first, MV.begin());
>> +  EXPECT_EQ(R.first->first, 1);
>> +  EXPECT_EQ(R.first->second, 2);
>> +  EXPECT_TRUE(R.second);
>> +
>> +  R = MV.insert(std::make_pair(1, 3));
>> +  ASSERT_EQ(R.first, MV.begin());
>> +  EXPECT_EQ(R.first->first, 1);
>> +  EXPECT_EQ(R.first->second, 2);
>> +  EXPECT_FALSE(R.second);
>> +
>> +  R = MV.insert(std::make_pair(4, 5));
>> +  ASSERT_NE(R.first, MV.end());
>> +  EXPECT_EQ(R.first->first, 4);
>> +  EXPECT_EQ(R.first->second, 5);
>> +  EXPECT_TRUE(R.second);
>> +
>> +  EXPECT_EQ(MV.size(), 2u);
>> +  EXPECT_EQ(MV[1], 2);
>> +  EXPECT_EQ(MV[4], 5);
>> +
>> +  MV.pop_back();
>> +  EXPECT_EQ(MV.size(), 1u);
>> +  EXPECT_EQ(MV[1], 2);
>> +
>> +  R = MV.insert(std::make_pair(4, 7));
>> +  ASSERT_NE(R.first, MV.end());
>> +  EXPECT_EQ(R.first->first, 4);
>> +  EXPECT_EQ(R.first->second, 7);
>> +  EXPECT_TRUE(R.second);
>> +
>> +  EXPECT_EQ(MV.size(), 2u);
>> +  EXPECT_EQ(MV[1], 2);
>> +  EXPECT_EQ(MV[4], 7);
>> +}
>> +
>> +TEST(SmallMapVectorSmallTest, erase) {
>> +  SmallMapVector<int, int, 32> MV;
>> +
>> +  MV.insert(std::make_pair(1, 2));
>> +  MV.insert(std::make_pair(3, 4));
>> +  MV.insert(std::make_pair(5, 6));
>> +  ASSERT_EQ(MV.size(), 3u);
>> +
>> +  MV.erase(MV.find(1));
>> +  ASSERT_EQ(MV.size(), 2u);
>> +  ASSERT_EQ(MV.find(1), MV.end());
>> +  ASSERT_EQ(MV[3], 4);
>> +  ASSERT_EQ(MV[5], 6);
>> +
>> +  ASSERT_EQ(MV.erase(3), 1u);
>> +  ASSERT_EQ(MV.size(), 1u);
>> +  ASSERT_EQ(MV.find(3), MV.end());
>> +  ASSERT_EQ(MV[5], 6);
>> +
>> +  ASSERT_EQ(MV.erase(79), 0u);
>> +  ASSERT_EQ(MV.size(), 1u);
>> +}
>> +
>> +TEST(SmallMapVectorSmallTest, remove_if) {
>> +  SmallMapVector<int, int, 32> MV;
>> +
>> +  MV.insert(std::make_pair(1, 11));
>> +  MV.insert(std::make_pair(2, 12));
>> +  MV.insert(std::make_pair(3, 13));
>> +  MV.insert(std::make_pair(4, 14));
>> +  MV.insert(std::make_pair(5, 15));
>> +  MV.insert(std::make_pair(6, 16));
>> +  ASSERT_EQ(MV.size(), 6u);
>> +
>> +  MV.remove_if([](const std::pair<int, int> &Val) { return Val.second %
>> 2; });
>> +  ASSERT_EQ(MV.size(), 3u);
>> +  ASSERT_EQ(MV.find(1), MV.end());
>> +  ASSERT_EQ(MV.find(3), MV.end());
>> +  ASSERT_EQ(MV.find(5), MV.end());
>> +  ASSERT_EQ(MV[2], 12);
>> +  ASSERT_EQ(MV[4], 14);
>> +  ASSERT_EQ(MV[6], 16);
>> +}
>> +
>> +TEST(SmallMapVectorSmallTest, iteration_test) {
>> +  SmallMapVector<int, int, 32> MV;
>> +
>> +  MV.insert(std::make_pair(1, 11));
>> +  MV.insert(std::make_pair(2, 12));
>> +  MV.insert(std::make_pair(3, 13));
>> +  MV.insert(std::make_pair(4, 14));
>> +  MV.insert(std::make_pair(5, 15));
>> +  MV.insert(std::make_pair(6, 16));
>> +  ASSERT_EQ(MV.size(), 6u);
>> +
>> +  int count = 1;
>> +  for (auto P : make_range(MV.begin(), MV.end())) {
>> +    ASSERT_EQ(P.first, count);
>> +    count++;
>> +  }
>> +
>> +  count = 6;
>> +  for (auto P : make_range(MV.rbegin(), MV.rend())) {
>> +    ASSERT_EQ(P.first, count);
>> +    count--;
>> +  }
>> +}
>> +
>> +TEST(SmallMapVectorLargeTest, insert_pop) {
>> +  SmallMapVector<int, int, 1> MV;
>> +  std::pair<SmallMapVector<int, int, 1>::iterator, bool> R;
>> +
>> +  R = MV.insert(std::make_pair(1, 2));
>> +  ASSERT_EQ(R.first, MV.begin());
>> +  EXPECT_EQ(R.first->first, 1);
>> +  EXPECT_EQ(R.first->second, 2);
>> +  EXPECT_TRUE(R.second);
>> +
>> +  R = MV.insert(std::make_pair(1, 3));
>> +  ASSERT_EQ(R.first, MV.begin());
>> +  EXPECT_EQ(R.first->first, 1);
>> +  EXPECT_EQ(R.first->second, 2);
>> +  EXPECT_FALSE(R.second);
>> +
>> +  R = MV.insert(std::make_pair(4, 5));
>> +  ASSERT_NE(R.first, MV.end());
>> +  EXPECT_EQ(R.first->first, 4);
>> +  EXPECT_EQ(R.first->second, 5);
>> +  EXPECT_TRUE(R.second);
>> +
>> +  EXPECT_EQ(MV.size(), 2u);
>> +  EXPECT_EQ(MV[1], 2);
>> +  EXPECT_EQ(MV[4], 5);
>> +
>> +  MV.pop_back();
>> +  EXPECT_EQ(MV.size(), 1u);
>> +  EXPECT_EQ(MV[1], 2);
>> +
>> +  R = MV.insert(std::make_pair(4, 7));
>> +  ASSERT_NE(R.first, MV.end());
>> +  EXPECT_EQ(R.first->first, 4);
>> +  EXPECT_EQ(R.first->second, 7);
>> +  EXPECT_TRUE(R.second);
>> +
>> +  EXPECT_EQ(MV.size(), 2u);
>> +  EXPECT_EQ(MV[1], 2);
>> +  EXPECT_EQ(MV[4], 7);
>> +}
>> +
>> +TEST(SmallMapVectorLargeTest, erase) {
>> +  SmallMapVector<int, int, 1> MV;
>> +
>> +  MV.insert(std::make_pair(1, 2));
>> +  MV.insert(std::make_pair(3, 4));
>> +  MV.insert(std::make_pair(5, 6));
>> +  ASSERT_EQ(MV.size(), 3u);
>> +
>> +  MV.erase(MV.find(1));
>> +  ASSERT_EQ(MV.size(), 2u);
>> +  ASSERT_EQ(MV.find(1), MV.end());
>> +  ASSERT_EQ(MV[3], 4);
>> +  ASSERT_EQ(MV[5], 6);
>> +
>> +  ASSERT_EQ(MV.erase(3), 1u);
>> +  ASSERT_EQ(MV.size(), 1u);
>> +  ASSERT_EQ(MV.find(3), MV.end());
>> +  ASSERT_EQ(MV[5], 6);
>> +
>> +  ASSERT_EQ(MV.erase(79), 0u);
>> +  ASSERT_EQ(MV.size(), 1u);
>> +}
>> +
>> +TEST(SmallMapVectorLargeTest, remove_if) {
>> +  SmallMapVector<int, int, 1> MV;
>> +
>> +  MV.insert(std::make_pair(1, 11));
>> +  MV.insert(std::make_pair(2, 12));
>> +  MV.insert(std::make_pair(3, 13));
>> +  MV.insert(std::make_pair(4, 14));
>> +  MV.insert(std::make_pair(5, 15));
>> +  MV.insert(std::make_pair(6, 16));
>> +  ASSERT_EQ(MV.size(), 6u);
>> +
>> +  MV.remove_if([](const std::pair<int, int> &Val) { return Val.second %
>> 2; });
>> +  ASSERT_EQ(MV.size(), 3u);
>> +  ASSERT_EQ(MV.find(1), MV.end());
>> +  ASSERT_EQ(MV.find(3), MV.end());
>> +  ASSERT_EQ(MV.find(5), MV.end());
>> +  ASSERT_EQ(MV[2], 12);
>> +  ASSERT_EQ(MV[4], 14);
>> +  ASSERT_EQ(MV[6], 16);
>> +}
>> +
>> +TEST(SmallMapVectorLargeTest, iteration_test) {
>> +  SmallMapVector<int, int, 1> MV;
>> +
>> +  MV.insert(std::make_pair(1, 11));
>> +  MV.insert(std::make_pair(2, 12));
>> +  MV.insert(std::make_pair(3, 13));
>> +  MV.insert(std::make_pair(4, 14));
>> +  MV.insert(std::make_pair(5, 15));
>> +  MV.insert(std::make_pair(6, 16));
>> +  ASSERT_EQ(MV.size(), 6u);
>> +
>> +  int count = 1;
>> +  for (auto P : make_range(MV.begin(), MV.end())) {
>> +    ASSERT_EQ(P.first, count);
>> +    count++;
>> +  }
>> +
>> +  count = 6;
>> +  for (auto P : make_range(MV.rbegin(), MV.rend())) {
>> +    ASSERT_EQ(P.first, count);
>> +    count--;
>> +  }
>> +}
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150102/2d35fa0c/attachment.html>


More information about the llvm-commits mailing list