diff options
Diffstat (limited to 'db-4.8.30/test_stl/base/test_util.h')
-rw-r--r-- | db-4.8.30/test_stl/base/test_util.h | 605 |
1 files changed, 605 insertions, 0 deletions
diff --git a/db-4.8.30/test_stl/base/test_util.h b/db-4.8.30/test_stl/base/test_util.h new file mode 100644 index 0000000..ca0fc87 --- /dev/null +++ b/db-4.8.30/test_stl/base/test_util.h @@ -0,0 +1,605 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2009 Oracle. All rights reserved. + * + * $Id$ + */ + +#include "test.h" +#include "ptype.h" + +/* + * this function should not be included into dbstl because swapping + * different type of vars is possible to lose precision, this is why std::swap + * requires same type. here I know I won't lose precision so I do it at my + * cost + */ +namespace std { +template <Typename T1, Typename T2> +void swap(T1&t1, T2&t2) +{ + T2 t; + t = t2; + t2 = t1; + t1 = t; + +} + +bool operator==(const pair<ptint, ElementHolder<ptint> >&v1, const pair<ptint, ElementHolder<ptint> >&v2) +{ + return v1.first == v2.first && v1.second._DB_STL_value() == v2.second._DB_STL_value(); +} + +template <typename T1, typename T2, typename T3, typename T4> +bool operator==(const pair<T1, T2>&v1, const pair<T3, T4> &v2) +{ + return v1.first == v2.first && v1.second == v2.second; +} +} // namespace std + +template <Typename T1, Typename T2, Typename T3, Typename T4> +bool is_equal(db_map<T1, T2, ElementHolder<T2> >& dv, map<T3, T4>&v) +{ + size_t s1, s2; + bool ret; + typename db_map<T1, T2, ElementHolder<T2> >::iterator itr1; + typename map<T3, T4>::iterator itr2; + + if (g_test_start_txn) + begin_txn(0, g_env); + if ((s1 = dv.size()) != (s2 = v.size())){ + ret = false; + goto done; + } + + for (itr1 = dv.begin(), itr2 = v.begin(); itr1 != dv.end(); ++itr1, ++itr2) { + if (itr1->first != itr2->first || itr1->second != itr2->second){ + ret = false; + goto done; + } + + } + + ret = true; +done: + if (g_test_start_txn) + commit_txn(g_env); + return ret; + +} + +template <Typename T1, Typename T2, Typename T3, Typename T4> +bool is_equal(db_map<T1, T2, ElementRef<T2> >& dv, map<T3, T4>&v) +{ + size_t s1, s2; + bool ret; + typename db_map<T1, T2, ElementRef<T2> >::iterator itr1; + typename map<T3, T4>::iterator itr2; + + if (g_test_start_txn) + begin_txn(0, g_env); + if ((s1 = dv.size()) != (s2 = v.size())){ + + ret = false; + goto done; + } + + + for (itr1 = dv.begin(), itr2 = v.begin(); itr1 != dv.end(); ++itr1, ++itr2) { + if (itr1->first != itr2->first || itr1->second != itr2->second){ + ret = false; + goto done; + } + } + + ret = true; +done: + if (g_test_start_txn) + commit_txn(g_env); + return ret; + +} + + +template<Typename T1, Typename T2> +bool is_equal(const db_set<T1, ElementHolder<T1> >&s1, const set<T2>&s2) +{ + bool ret; + typename db_set<T1, ElementHolder<T1> >::iterator itr; + + if (g_test_start_txn) + begin_txn(0, g_env); + if (s1.size() != s2.size()){ + ret = false; + goto done; + } + + for (itr = s1.begin(); itr != s1.end(); itr++) { + if (s2.count(*itr) == 0) { + ret = false; + goto done; + } + } + ret = true; +done: + if (g_test_start_txn) + commit_txn(g_env); + return ret; + +} + + +template <Typename T1, Typename T2> +bool is_equal(const db_vector<T1>& dv, const vector<T2>&v) +{ + size_t s1, s2; + bool ret; + T1 t1; + size_t i, sz = v.size(); + + if (g_test_start_txn) + begin_txn(0, g_env); + if ((s1 = dv.size()) != (s2 = v.size())) { + ret = false; + goto done; + } + + + for (i = 0; i < sz; i++) { + t1 = T1(dv[(index_type)i] ); + if (t1 != v[i]){ + ret = false; + goto done; + } + } + ret = true; +done: + + if (g_test_start_txn) + commit_txn(g_env); + return ret; +} + +// The following four functions are designed to work with is_equal to compare +// char*/wchar_t* strings properly, unforturnately they can not override +// the default pointer value comparison behavior. +bool operator==(ElementHolder<const char *>s1, const char *s2); +bool operator==(ElementHolder<const wchar_t *>s1, const wchar_t *s2); +bool operator!=(ElementHolder<const char *>s1, const char *s2); +bool operator!=(ElementHolder<const wchar_t *>s1, const wchar_t *s2); + +template <Typename T1> +bool is_equal(const db_vector<T1, ElementHolder<T1> >& dv, const vector<T1>&v) +{ + size_t s1, s2; + bool ret; + size_t i, sz = v.size(); + + if (g_test_start_txn) + begin_txn(0, g_env); + if ((s1 = dv.size()) != (s2 = v.size())) { + ret = false; + goto done; + } + + for (i = 0; i < sz; i++) { + if (dv[(index_type)i] != v[i]) { + ret = false; + goto done; + } + } + ret = true; +done: + + if (g_test_start_txn) + commit_txn(g_env); + return ret; +} + + +template <Typename T1, Typename T2> +bool is_equal(db_vector<T1>& dv, list<T2>&v) +{ + size_t s1, s2; + bool ret; + typename db_vector<T1>::iterator itr; + typename list<T2>::iterator itr2; + + if (g_test_start_txn) + begin_txn(0, g_env); + if ((s1 = dv.size()) != (s2 = v.size())) { + ret = false; + goto done; + } + + + for (itr = dv.begin(), itr2 = v.begin(); + itr2 != v.end(); ++itr, ++itr2) { + if (*itr != *itr2) { + ret = false; + goto done; + } + } + ret = true; +done: + + if (g_test_start_txn) + commit_txn(g_env); + return ret; +} + +bool is_equal(db_vector<char *, ElementHolder<char *> >&v1, std::list<string> &v2) +{ + db_vector<char *, ElementHolder<char *> >::iterator itr; + std::list<string>::iterator itr2; + + if (v1.size() != v2.size()) + return false; + + for (itr = v1.begin(), itr2 = v2.begin(); itr2 != v2.end(); ++itr, ++itr2) + if (strcmp(*itr, (*itr2).c_str()) != 0) + return false; + + return true; +} + +template <Typename T1> +class atom_equal { +public: + bool operator()(T1 a, T1 b) + { + return a == b; + } +}; +template<> +class atom_equal<const char *> { +public: + bool operator()(const char *s1, const char *s2) + { + return strcmp(s1, s2) == 0; + } +}; + +template <Typename T1> +bool is_equal(const db_vector<T1, ElementHolder<T1> >& dv, const list<T1>&v) +{ + size_t s1, s2; + bool ret; + typename db_vector<T1, ElementHolder<T1> >::const_iterator itr; + typename list<T1>::const_iterator itr2; + atom_equal<T1> eqcmp; + if (g_test_start_txn) + begin_txn(0, g_env); + if ((s1 = dv.size()) != (s2 = v.size())) { + ret = false; + goto done; + } + + + for (itr = dv.begin(), itr2 = v.begin(); + itr2 != v.end(); ++itr, ++itr2) { + if (!eqcmp(*itr, *itr2)) { + ret = false; + goto done; + } + } + ret = true; +done: + + if (g_test_start_txn) + commit_txn(g_env); + return ret; +} + +// fill the two vectors with identical n integers,starting from start +template<Typename T> +void fill(db_vector<ptype<T> >&v, vector<T>&sv, T start = 0, int n = 5) +{ + T i; + + v.clear(); + sv.clear(); + for (i = start; i < n + start; i++) { + v.push_back(i); + sv.push_back(i); + } +} + + +template<Typename T> +void fill(db_vector<T, ElementHolder<T> >&v, vector<T>&sv, T start = 0, int n = 5 ) +{ + int i; + + v.clear(); + sv.clear(); + for (i = 0; i < n; i++) { + v.push_back(i + start); + sv.push_back(i + start); + } +} + +template <Typename T> +void fill(db_map<ptype<T>, ptype<T> >&m, map<T, T>&sm, + T start = 0, int n = 5) +{ + int i; + ptype<T> pi; + + m.clear(); + sm.clear(); + for (i = 0; i < n; i++) { + pi = i + start; + m.insert(make_pair(pi, pi)); + sm.insert(make_pair(pi.v, pi.v)); + } + +} + + +template <Typename T> +void fill(db_map<T, T, ElementHolder<T> >&m, map<T, T>&sm, + T start = 0, int n = 5) +{ + int i; + T pi; + + m.clear(); + sm.clear(); + for (i = 0; i < n; i++) { + pi = i + start; + m.insert(make_pair(pi, pi)); + sm.insert(make_pair(pi, pi)); + } + +} + + +template <Typename T> +void fill(db_set<ptype<T> >&m, set<T>&sm, T start = 0, int n = 5) +{ + int i; + ptype<T> pi; + + m.clear(); + sm.clear(); + + for (i = 0; i < n; i++) { + + pi = i + start; + m.insert(pi); + sm.insert(pi.v); + } + +} + + +template <Typename T> +void fill(db_set<T, ElementHolder<T> >&m, set<T>&sm, + T start = 0, int n = 5) +{ + int i; + T pi; + + m.clear(); + sm.clear(); + for (i = 0; i < n; i++) { + pi = i + start; + m.insert(pi); + sm.insert(pi); + } + +} + + +size_t g_count[256]; +template <Typename T> +void fill(db_multimap<ptype<T>, ptype<T> >&m, multimap<T, T>&sm, + T start = 0, int n = 5, size_t randn = 5) +{ + + int i; + size_t j, cnt; + + if (randn == 0) + randn = 1; + + m.clear(); + sm.clear(); + for (i = 0; i < n; i++) { + if (randn > 1) + cnt = abs(rand()) % randn; + if (cnt == 0) + cnt = randn; + i += start; + g_count[i] = cnt; + for (j = 0; j < cnt; j++) {// insert duplicates + m.insert(make_pair(i, ptype<T>(i))); + sm.insert(make_pair(i, i)); + } + i -= start; + } +} + + +template <Typename T> +void fill(db_multimap<T, T, ElementHolder<T> >&m, multimap<T, T>&sm, + T start = 0, int n = 5, size_t randn = 5) +{ + int i; + size_t j, cnt = 0; + + if (randn < 5) + randn = 5; + + m.clear(); + sm.clear(); + for (i = 0; i < n; i++) { + cnt = abs(rand()) % randn; + if (cnt == 0) + cnt = randn; + i += start; + g_count[i] = cnt; + for (j = 0; j < cnt; j++) {// insert duplicates + m.insert(make_pair(i, i)); + sm.insert(make_pair(i, i)); + } + i -= start; + } + +} + + +template <Typename T> +void fill(db_multiset<ptype<T> >&m, multiset<T>&sm, T start, + int n, size_t randn) +{ + + int i; + size_t j, cnt; + + if (randn == 0) + randn = 1; + + m.clear(); + sm.clear(); + for (i = 0; i < n; i++) { + if (randn > 1) + cnt = abs(rand()) % randn; + if (cnt == 0) + cnt = randn; + i += start; + g_count[i] = cnt; + for (j = 0; j < cnt; j++) {// insert duplicates + m.insert(ptype<T>(i)); + sm.insert(i); + } + i -= start; + } +} + + +template <Typename T> +void fill(db_multiset<T, ElementHolder<T> >&m, multiset<T>&sm, + T start = 0, int n = 5 , size_t randn = 5) +{ + int i; + size_t j, cnt; + + if (randn < 5) + randn = 5; + + m.clear(); + sm.clear(); + for (i = 0; i < n; i++) { + cnt = abs(rand()) % randn; + if (cnt == 0) + cnt = randn; + i += start; + g_count[i] = cnt; + for (j = 0; j < cnt; j++) {// insert duplicates + m.insert(i); + sm.insert(i); + } + i -= start; + } +} + + +#ifdef TEST_PRIMITIVE +bool is_odd_pair(pair<ptint, ElementHolder<ptint> >& s) +{ + return ( s.second._DB_STL_value() % 2) != 0; +} +#else +bool is_odd_pair(pair<ptint, ElementRef<ptint> >& s) +{ + return ( s.second._DB_STL_value() % 2) != 0; +} +#endif + + +template<Typename pair_type> +void square_pair(pair_type&s) +{ + cout<<s.second*s.second<<'\t'; +} + +template<Typename pair_type> +void square_pair2(pair_type&s) +{ + cout<<s.second*s.second<<'\t'; +} + + + + +#ifndef TEST_PRIMITIVE +bool is2digits_pair(pair<ptint, ElementRef<ptint> >& i) +{ + return (i.second._DB_STL_value() > (9)) && (i.second._DB_STL_value() < (100)); +} + +#else +bool is2digits_pair(pair<ptint, ElementHolder<ptint> >& i) +{ + return (i.second._DB_STL_value() > (9)) && (i.second._DB_STL_value() < (100)); +} +#endif +bool is7(const ptint& value) { return (value == (ptint)7); } + + +template <Typename T, Typename value_type_sub> +void pprint(db_vector<T, value_type_sub>&v, const char *prefix = NULL) +{ +return; + size_t i; + size_t sz = v.size(); + + cout<<"\n"; + if (prefix) + cout<<prefix; + if (g_test_start_txn) + begin_txn(0, g_env); + for (i = 0; i < sz; i++) { + cout<<"\t"<<(v[(index_type)i]); + } + if (g_test_start_txn) + commit_txn(g_env); +} + + +template <Typename T, Typename ddt, Typename value_type_sub> +void pprint(db_map<T, ddt, value_type_sub>&v, const char *prefix = NULL) +{ +return; + if (g_test_start_txn) + begin_txn(0, g_env); + cout<<"\n"; + if (prefix) + cout<<prefix; + typename db_map<T, ddt, value_type_sub>::iterator itr; + for (itr = v.begin(); itr != v.end(); itr++) + cout<<'\t'<<itr->first<<'\t'<<itr->second; + if (g_test_start_txn) + commit_txn(g_env); +} + + +template <Typename T, Typename value_type_sub> +void pprint(db_set<T, value_type_sub>&v, const char *prefix = NULL) +{ +return; + if (g_test_start_txn) + begin_txn(0, g_env); + cout<<"\n"; + if (prefix) + cout<<prefix; + typename db_set<T, value_type_sub>::iterator itr; + for (itr = v.begin(); itr != v.end(); itr++) + cout<<'\t'<<*itr; + if (g_test_start_txn) + commit_txn(g_env); +} + |