xref: /haiku/src/tests/system/kernel/util/VectorMapTest.cpp (revision 77aa0e2a5ef8e6d00570dbeb7a12aeb23e9e5cf0)
1 
2 #include <stdio.h>
3 #include <stdlib.h>
4 
5 #include <map>
6 
7 #include <TestUtils.h>
8 #include <cppunit/Test.h>
9 #include <cppunit/TestCaller.h>
10 #include <cppunit/TestSuite.h>
11 
12 #include <VectorMap.h>
13 
14 #include "common.h"
15 #include "OrderedMapTest.h"
16 #include "VectorMapTest.h"
17 
18 // That's how it should work, if we had a working compiler.
19 /*
20 template<typename Key, typename Value>
21 struct PairTestBase {
22 	typedef SimpleValueStrategy<Key>						KeyStrategy;
23 	typedef SimpleValueStrategy<Value>						ValueStrategy;
24 	typedef PairEntryStrategy<KeyStrategy, ValueStrategy>	EntryStrategy;
25 
26 	template<typename CompareStrategy>
27 	struct MyMap
28 		: public VectorMap<Key, Value, VectorMapEntryStrategy::Pair<Key, Value,
29 						   CompareStrategy> > {
30 	};
31 
32 	template<class CompareStrategy>
33 	struct Strategy : public TestStrategy<MyMap, EntryStrategy,
34 										  CompareStrategy> {
35 	};
36 };
37 typedef typename PairTestBase<int, int>::Strategy	IntIntTestStrategy;
38 // ...
39 */
40 
41 // ugly work-around:
42 
43 template<typename Key, typename Value>
44 struct PairTestBase {
45 	typedef SimpleValueStrategy<Key>						KeyStrategy;
46 	typedef SimpleValueStrategy<Value>						ValueStrategy;
47 	typedef PairEntryStrategy<KeyStrategy, ValueStrategy>	EntryStrategy;
48 
49 	template<typename CompareStrategy>
50 	struct MyMap
51 		: public VectorMap<Key, Value, VectorMapEntryStrategy::Pair<Key, Value,
52 						   CompareStrategy> > {
53 	};
54 };
55 
56 #define DECLARE_TEST_STRATEGY(Key, Value, Map, Strategy, ClassName) \
57 	template<typename CS> struct Map : PairTestBase<Key, Value>::MyMap<CS> {};\
58 	template<typename CS> \
59 	struct Strategy \
60 		: public TestStrategy<Map, PairTestBase<Key, Value>::EntryStrategy, \
61 							  CS> { \
62 		static const char *kClassName; \
63 	}; \
64 	template<typename CS> const char *Strategy<CS>::kClassName = ClassName;
65 
66 DECLARE_TEST_STRATEGY(int, int, IntIntMap, IntIntTestStrategy,
67 					  "VectorMap<int, int, Pair>")
68 DECLARE_TEST_STRATEGY(int, string, IntStringMap, IntStringTestStrategy,
69 					  "VectorMap<int, string, Pair>")
70 DECLARE_TEST_STRATEGY(string, int, StringIntMap, StringIntTestStrategy,
71 					  "VectorMap<string, int, Pair>")
72 DECLARE_TEST_STRATEGY(string, string, StringStringMap,
73 					  StringStringTestStrategy,
74 					  "VectorMap<string, string, Pair>")
75 
76 
77 // TestStrategy for the ImplicitKey entry strategy
78 
79 // string_hash (from the Dragon Book: a slightly modified hashpjw())
80 static inline
81 int
string_hash(const char * name)82 string_hash(const char *name)
83 {
84 	uint32 h = 0;
85 	for (; *name; name++) {
86 		if (uint32 g = h & 0xf0000000)
87 			h ^= g >> 24;
88 		h = (h << 4) + *name;
89 	}
90 	return (int)h;
91 }
92 
93 struct ImplicitKeyTestGetKey {
operator ()ImplicitKeyTestGetKey94 	int operator()(string value) const
95 	{
96 		return string_hash(value.c_str());
97 	}
98 };
99 
100 template<typename CompareStrategy>
101 struct ImplicitKeyTestMap
102 	: public VectorMap<int, string,
103 		VectorMapEntryStrategy::ImplicitKey<int, string, ImplicitKeyTestGetKey,
104 											CompareStrategy> > {
105 };
106 
107 typedef ImplicitKeyStrategy<SimpleValueStrategy<int>,
108 							SimpleValueStrategy<string>,
109 							ImplicitKeyTestGetKey>
110 	ImplicitKeyTestEntryStrategy;
111 
112 template<class CompareStrategy>
113 struct ImplicitKeyTestStrategy : public TestStrategy<
114 	ImplicitKeyTestMap, ImplicitKeyTestEntryStrategy, CompareStrategy> {
115 	static const char *kClassName;
116 };
117 template<class CompareStrategy>
118 const char *ImplicitKeyTestStrategy<CompareStrategy>::kClassName
119 	= "VectorMap<int, string, ImplicitKey>";
120 
121 
122 // constructor
VectorMapTest(std::string name)123 VectorMapTest::VectorMapTest(std::string name)
124 	: BTestCase(name)
125 {
126 }
127 
128 // Suite
129 CppUnit::Test*
Suite()130 VectorMapTest::Suite()
131 {
132 	CppUnit::TestSuite *suite = new CppUnit::TestSuite("VectorMap");
133 
134 	suite->addTest(OrderedMapTest<IntIntTestStrategy>::Suite());
135 	suite->addTest(OrderedMapTest<IntStringTestStrategy>::Suite());
136 	suite->addTest(OrderedMapTest<StringIntTestStrategy>::Suite());
137 	suite->addTest(OrderedMapTest<StringStringTestStrategy>::Suite());
138 	suite->addTest(OrderedMapTest<ImplicitKeyTestStrategy>::Suite());
139 
140 	return suite;
141 }
142 
143