[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