move_alloc.pass.cpp revision b64f8b07c104c6cc986570ac8ee0ed16a9f23976
1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//===----------------------------------------------------------------------===//
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// This file is dual licensed under the MIT and the University of Illinois Open
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Source Licenses. See LICENSE.TXT for details.
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//===----------------------------------------------------------------------===//
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// <unordered_map>
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//           class Alloc = allocator<pair<const Key, T>>>
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// class unordered_map
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// unordered_map(unordered_map&& u, const allocator_type& a);
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <unordered_map>
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <string>
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <cassert>
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "../../../test_compare.h"
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "../../../test_hash.h"
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "../../../test_allocator.h"
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int main()
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles){
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    {
3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        typedef std::pair<int, std::string> P;
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typedef test_allocator<std::pair<const int, std::string>> A;
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typedef std::unordered_map<int, std::string,
3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                   test_hash<std::hash<int> >,
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   test_compare<std::equal_to<int> >,
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   A
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   > C;
3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        P a[] =
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        {
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            P(1, "one"),
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            P(2, "two"),
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            P(3, "three"),
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            P(4, "four"),
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            P(1, "four"),
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            P(2, "four"),
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        };
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        C c0(a, a + sizeof(a)/sizeof(a[0]),
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            7,
4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)            test_hash<std::hash<int> >(8),
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            test_compare<std::equal_to<int> >(9),
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            A(10)
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)           );
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        C c(std::move(c0), A(12));
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        assert(c.bucket_count() >= 5);
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        assert(c.size() == 4);
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        assert(c.at(1) == "one");
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        assert(c.at(2) == "two");
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        assert(c.at(3) == "three");
58        assert(c.at(4) == "four");
59        assert(c.hash_function() == test_hash<std::hash<int> >(8));
60        assert(c.key_eq() == test_compare<std::equal_to<int> >(9));
61        assert(c.get_allocator() == A(12));
62        assert(!c.empty());
63        assert(std::distance(c.begin(), c.end()) == c.size());
64        assert(std::distance(c.cbegin(), c.cend()) == c.size());
65        assert(c.load_factor() == (float)c.size()/c.bucket_count());
66        assert(c.max_load_factor() == 1);
67
68        assert(c0.empty());
69    }
70    {
71        typedef std::pair<int, std::string> P;
72        typedef test_allocator<std::pair<const int, std::string>> A;
73        typedef std::unordered_map<int, std::string,
74                                   test_hash<std::hash<int> >,
75                                   test_compare<std::equal_to<int> >,
76                                   A
77                                   > C;
78        P a[] =
79        {
80            P(1, "one"),
81            P(2, "two"),
82            P(3, "three"),
83            P(4, "four"),
84            P(1, "four"),
85            P(2, "four"),
86        };
87        C c0(a, a + sizeof(a)/sizeof(a[0]),
88            7,
89            test_hash<std::hash<int> >(8),
90            test_compare<std::equal_to<int> >(9),
91            A(10)
92           );
93        C c(std::move(c0), A(10));
94        assert(c.bucket_count() == 7);
95        assert(c.size() == 4);
96        assert(c.at(1) == "one");
97        assert(c.at(2) == "two");
98        assert(c.at(3) == "three");
99        assert(c.at(4) == "four");
100        assert(c.hash_function() == test_hash<std::hash<int> >(8));
101        assert(c.key_eq() == test_compare<std::equal_to<int> >(9));
102        assert(c.get_allocator() == A(10));
103        assert(!c.empty());
104        assert(std::distance(c.begin(), c.end()) == c.size());
105        assert(std::distance(c.cbegin(), c.cend()) == c.size());
106        assert(c.load_factor() == (float)c.size()/c.bucket_count());
107        assert(c.max_load_factor() == 1);
108
109        assert(c0.empty());
110    }
111#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
112}
113