[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
Wed Dec 31 15:44:49 PST 2014


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/20141231/edca3da0/attachment.html>


More information about the llvm-commits mailing list