/*- * 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 void swap(T1&t1, T2&t2) { T2 t; t = t2; t2 = t1; t1 = t; } bool operator==(const pair >&v1, const pair >&v2) { return v1.first == v2.first && v1.second._DB_STL_value() == v2.second._DB_STL_value(); } template bool operator==(const pair&v1, const pair &v2) { return v1.first == v2.first && v1.second == v2.second; } } // namespace std template bool is_equal(db_map >& dv, map&v) { size_t s1, s2; bool ret; typename db_map >::iterator itr1; typename map::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 bool is_equal(db_map >& dv, map&v) { size_t s1, s2; bool ret; typename db_map >::iterator itr1; typename map::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 bool is_equal(const db_set >&s1, const set&s2) { bool ret; typename db_set >::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 bool is_equal(const db_vector& dv, const vector&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==(ElementHolders1, const char *s2); bool operator==(ElementHolders1, const wchar_t *s2); bool operator!=(ElementHolders1, const char *s2); bool operator!=(ElementHolders1, const wchar_t *s2); template bool is_equal(const db_vector >& dv, const vector&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 bool is_equal(db_vector& dv, list&v) { size_t s1, s2; bool ret; typename db_vector::iterator itr; typename list::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 >&v1, std::list &v2) { db_vector >::iterator itr; std::list::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 class atom_equal { public: bool operator()(T1 a, T1 b) { return a == b; } }; template<> class atom_equal { public: bool operator()(const char *s1, const char *s2) { return strcmp(s1, s2) == 0; } }; template bool is_equal(const db_vector >& dv, const list&v) { size_t s1, s2; bool ret; typename db_vector >::const_iterator itr; typename list::const_iterator itr2; atom_equal 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 void fill(db_vector >&v, vector&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 void fill(db_vector >&v, vector&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 void fill(db_map, ptype >&m, map&sm, T start = 0, int n = 5) { int i; ptype 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 void fill(db_map >&m, map&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 void fill(db_set >&m, set&sm, T start = 0, int n = 5) { int i; ptype pi; m.clear(); sm.clear(); for (i = 0; i < n; i++) { pi = i + start; m.insert(pi); sm.insert(pi.v); } } template void fill(db_set >&m, set&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 void fill(db_multimap, ptype >&m, multimap&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(i))); sm.insert(make_pair(i, i)); } i -= start; } } template void fill(db_multimap >&m, multimap&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 void fill(db_multiset >&m, multiset&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(i)); sm.insert(i); } i -= start; } } template void fill(db_multiset >&m, multiset&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 >& s) { return ( s.second._DB_STL_value() % 2) != 0; } #else bool is_odd_pair(pair >& s) { return ( s.second._DB_STL_value() % 2) != 0; } #endif template void square_pair(pair_type&s) { cout< void square_pair2(pair_type&s) { cout< >& i) { return (i.second._DB_STL_value() > (9)) && (i.second._DB_STL_value() < (100)); } #else bool is2digits_pair(pair >& 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 void pprint(db_vector&v, const char *prefix = NULL) { return; size_t i; size_t sz = v.size(); cout<<"\n"; if (prefix) cout< void pprint(db_map&v, const char *prefix = NULL) { return; if (g_test_start_txn) begin_txn(0, g_env); cout<<"\n"; if (prefix) cout<::iterator itr; for (itr = v.begin(); itr != v.end(); itr++) cout<<'\t'<first<<'\t'<second; if (g_test_start_txn) commit_txn(g_env); } template void pprint(db_set&v, const char *prefix = NULL) { return; if (g_test_start_txn) begin_txn(0, g_env); cout<<"\n"; if (prefix) cout<::iterator itr; for (itr = v.begin(); itr != v.end(); itr++) cout<<'\t'<<*itr; if (g_test_start_txn) commit_txn(g_env); }