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/*
20template<typename Key, typename Value>
21struct 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};
37typedef typename PairTestBase<int, int>::Strategy	IntIntTestStrategy;
38// ...
39*/
40
41// ugly work-around:
42
43template<typename Key, typename Value>
44struct 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
66DECLARE_TEST_STRATEGY(int, int, IntIntMap, IntIntTestStrategy,
67					  "VectorMap<int, int, Pair>")
68DECLARE_TEST_STRATEGY(int, string, IntStringMap, IntStringTestStrategy,
69					  "VectorMap<int, string, Pair>")
70DECLARE_TEST_STRATEGY(string, int, StringIntMap, StringIntTestStrategy,
71					  "VectorMap<string, int, Pair>")
72DECLARE_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())
80static inline
81int
82string_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
93struct ImplicitKeyTestGetKey {
94	int operator()(string value) const
95	{
96		return string_hash(value.c_str());
97	}
98};
99
100template<typename CompareStrategy>
101struct ImplicitKeyTestMap
102	: public VectorMap<int, string,
103		VectorMapEntryStrategy::ImplicitKey<int, string, ImplicitKeyTestGetKey,
104											CompareStrategy> > {
105};
106
107typedef ImplicitKeyStrategy<SimpleValueStrategy<int>,
108							SimpleValueStrategy<string>,
109							ImplicitKeyTestGetKey>
110	ImplicitKeyTestEntryStrategy;
111
112template<class CompareStrategy>
113struct ImplicitKeyTestStrategy : public TestStrategy<
114	ImplicitKeyTestMap, ImplicitKeyTestEntryStrategy, CompareStrategy> {
115	static const char *kClassName;
116};
117template<class CompareStrategy>
118const char *ImplicitKeyTestStrategy<CompareStrategy>::kClassName
119	= "VectorMap<int, string, ImplicitKey>";
120
121
122// constructor
123VectorMapTest::VectorMapTest(std::string name)
124	: BTestCase(name)
125{
126}
127
128// Suite
129CppUnit::Test*
130VectorMapTest::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