summaryrefslogtreecommitdiff
path: root/db-4.8.30/test_stl/base/test_vector.h
diff options
context:
space:
mode:
authorJesse Morgan <jesse@jesterpm.net>2016-12-17 21:28:53 -0800
committerJesse Morgan <jesse@jesterpm.net>2016-12-17 21:28:53 -0800
commit54df2afaa61c6a03cbb4a33c9b90fa572b6d07b8 (patch)
tree18147b92b969d25ffbe61935fb63035cac820dd0 /db-4.8.30/test_stl/base/test_vector.h
Berkeley DB 4.8 with rust build script for linux.
Diffstat (limited to 'db-4.8.30/test_stl/base/test_vector.h')
-rw-r--r--db-4.8.30/test_stl/base/test_vector.h1338
1 files changed, 1338 insertions, 0 deletions
diff --git a/db-4.8.30/test_stl/base/test_vector.h b/db-4.8.30/test_stl/base/test_vector.h
new file mode 100644
index 0000000..efcf165
--- /dev/null
+++ b/db-4.8.30/test_stl/base/test_vector.h
@@ -0,0 +1,1338 @@
+/*-
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 2009 Oracle. All rights reserved.
+ *
+ * $Id$
+ */
+
+#include "test.h"
+
+#include <list>
+
+using std::list;
+using std::priority_queue;
+
+// This class tests all methods of db_vector and db_vector_iterator
+// Most tests are done by doing identical operations to db_vector
+// and std::vector and check the result data set in the two vectors
+// are identical. Also, almost all algorithms in std are applied to
+// the different ranges created from db_vector and std::vector, and
+// also compare result of the in the same way.
+//
+class TestVector
+{
+public:
+ ~TestVector();
+ TestVector(void *param1);
+ void start_test()
+ {
+
+ tb.begin("db_vector");
+ // Do not change the order of these functions.
+
+ // Test each member function of db_vector and
+ // db_vector_iterator that are shared by all three
+ // std containers std::vector, std::deque and std::list.
+ test_member_functions();
+
+ // Test std::list specific methods.
+ test_list_specific_member_functions();
+
+ // Use std functions to manipulate db_vector containers.
+ test_std_functions();
+
+ // Test storing primitive data.
+ test_primitive();
+
+ // Test whether db_vector works with std container adapters
+ // std::stack, std::queue and std::priority_queue
+ test_queue_stack();
+ tb.end();
+ }
+
+ void test_member_functions();
+ void test_list_specific_member_functions();
+ void test_std_functions();
+ void test_primitive();
+ void test_queue_stack();
+private:
+
+ int n;
+ int flags, setflags, EXPLICIT_TXN, TEST_AUTOCOMMIT;
+ DBTYPE dbtype;
+ DbEnv *penv;
+ Db *db, *db2, *db3;
+ Db *quedb, *pquedb;
+ test_block tb;
+
+ vector<int> svi, svi2, svi3;
+
+};
+
+TestVector::~TestVector()
+{
+
+}
+
+TestVector::TestVector(void *param1)
+{
+ check_expr(param1 != NULL);
+ TestParam *param = (TestParam*)param1;
+ TestParam *ptp = param;
+ penv = param->dbenv;
+ db = db2 = db3 = NULL;
+ flags = 0, setflags = 0, EXPLICIT_TXN = 1, TEST_AUTOCOMMIT = 0;
+ flags = param->flags;
+ dbtype = param->dbtype;
+ setflags = param->setflags;
+ TEST_AUTOCOMMIT = param->TEST_AUTOCOMMIT;
+ EXPLICIT_TXN = param->EXPLICIT_TXN;
+ n = 5;
+ dbtype = DB_BTREE;
+ db = dbstl::open_db(penv, "db1.db",
+ DB_RECNO, DB_CREATE | ptp->dboflags | DB_THREAD, DB_RENUMBER);
+ db2 = dbstl::open_db(penv, "db2.db",
+ DB_RECNO, DB_CREATE | ptp->dboflags, DB_RENUMBER);
+ db3 = dbstl::open_db(penv, "db3.db",
+ DB_RECNO, DB_CREATE | ptp->dboflags, DB_RENUMBER);
+ // NO DB_RENUMBER needed
+ quedb = dbstl::open_db(penv, "dbquedb.db",
+ DB_RECNO, DB_CREATE | ptp->dboflags | DB_THREAD, 0);
+ pquedb = dbstl::open_db(penv, "dbpquedb.db",
+ DB_RECNO, DB_CREATE | ptp->dboflags | DB_THREAD, DB_RENUMBER);
+}
+
+void TestVector::test_member_functions()
+{
+ int i;
+ ptint_vector::iterator itr1, itr;
+ ptint_vector::reverse_iterator ritr1, ritr;
+ vector<int>::iterator sitr, sitr1;
+ vector<int>::reverse_iterator rsitr, rsitr1;
+
+
+ ptint_vector vi(db, penv);
+ const ptint_vector& cnstvi = vi;
+ vi.clear();
+ if ( EXPLICIT_TXN)
+ dbstl::begin_txn(0, penv);
+
+ fill(vi, svi, 0, n);
+
+ for (i = 0; i < n; i++) {
+ ptint_vector::const_iterator citr, citr1;
+ citr = vi.begin() + i;
+ check_expr(*citr == vi[i]);
+ itr = citr;
+ check_expr(*citr == *itr);
+ *itr = i * 2 + 1;
+ citr1 = itr;
+ check_expr(*citr == *itr);
+ check_expr(*citr == *citr1);
+ check_expr(*citr == vi[i]);
+ }
+
+ for (i = 0; i < n; i++) {
+ ptint_vector::const_iterator citr = vi.begin() + i;
+ check_expr(*citr == vi[i]);
+ itr = citr;
+ check_expr(*citr == *itr);
+ *itr = i * 2 + 1;
+ ptint_vector::const_iterator citr1 = itr;
+ check_expr(*citr == *itr);
+ check_expr(*citr == *citr1);
+ check_expr(*citr == vi[i]);
+ }
+
+ for (i = 0; i < n; i++) {
+ ptint_vector::iterator ncitr, ncitr1;
+ ptint_vector::const_iterator citr, citr1;
+
+ ncitr = cnstvi.begin() + i;
+ check_expr(*ncitr == cnstvi[i]);
+ citr = ncitr;
+ check_expr(*citr == *ncitr);
+ //*ncitr = i * 2 + 1;
+ citr1 = ncitr;
+ ncitr1 = citr1;
+ check_expr(*citr == *ncitr);
+ check_expr(*citr == *ncitr1);
+ check_expr(*citr == *citr1);
+ check_expr(*citr == cnstvi[i]);
+ }
+
+ for (i = 0; i < n; i++) {
+
+ ptint_vector::iterator ncitr = cnstvi.begin() + i;
+ check_expr(*ncitr == cnstvi[i]);
+ ptint_vector::const_iterator citr = ncitr;
+ check_expr(*citr == *ncitr);
+ //*itr = i * 2 + 1;
+ ptint_vector::const_iterator citr1 = ncitr;
+ ptint_vector::iterator ncitr1 = citr1;
+
+ check_expr(*citr == *ncitr);
+ check_expr(*citr == *ncitr1);
+ check_expr(*citr == *citr1);
+ check_expr(*citr == cnstvi[i]);
+ }
+
+ {
+ vi.clear();
+ svi.clear();
+ vi.push_back(123);
+ svi.push_back(123);
+ ptint_vector::iterator ncitr = vi.begin();
+ vector<int>::iterator ncsitr = svi.begin();
+ *ncitr += 5;
+ *ncitr -= 3;
+ *ncitr *= 4;
+ *ncitr /= 2;
+ *ncitr %= 97;
+ (*ncitr)++;
+ (*ncitr)--;
+ ++(*ncitr);
+ --(*ncitr);
+ *ncsitr += 5;
+ *ncsitr -= 3;
+ *ncsitr *= 4;
+ *ncsitr /= 2;
+ *ncsitr %= 97;
+ (*ncsitr)++;
+ (*ncsitr)--;
+ ++(*ncsitr);
+ --(*ncsitr);
+ check_expr(*ncsitr == *ncitr);
+
+ *ncitr &= 0x9874abcd;
+ *ncitr |= 0x12345678;
+ *ncitr ^= 0x11223344;
+ *ncsitr &= 0x9874abcd;
+ *ncsitr |= 0x12345678;
+ *ncsitr ^= 0x11223344;
+ ncitr.refresh(true);
+ check_expr(*ncsitr == *ncitr);
+
+ vi.clear();
+ svi.clear();
+ db_vector<ptype<int> > tmpvi;
+ const db_vector<ptype<int> > & ctmpvi = tmpvi;
+ fill(tmpvi, svi, 0, n);
+ db_vector<ptype<int> >::const_reverse_iterator critr;
+ vector<int>::const_reverse_iterator crsitr;
+ db_vector<ptype<int> >::const_iterator citr2;
+ vector<int>::const_iterator csitr2;
+
+ check_expr(ctmpvi.back() == svi.back());
+ check_expr(ctmpvi.at(0) == svi.at(0));
+ critr = tmpvi.rbegin();//XXXXXXXXX modify db_reverse_iterator, use twin type
+ for (i = n - 1, crsitr = svi.rbegin(); critr != tmpvi.rend(); ++critr, ++crsitr, i--) {
+ check_expr(crsitr < crsitr + 1);
+ check_expr(critr < critr + 1);
+ check_expr(critr <= critr + 1);
+
+
+ check_expr(critr > critr - 1);
+ check_expr(critr >= critr - 1);
+ if (i > 0) {
+ ptype<int> tmpv1 = critr[1];
+ int tmpv2 = crsitr[1];
+ check_expr(tmpv1 == tmpv2);
+ }
+
+ check_expr(critr <= 2 + critr);
+ //if (i < n - 2)
+ check_expr(critr >= -2 + critr);
+ check_expr(*critr == *crsitr);
+ }
+
+ for (critr = ctmpvi.rbegin(), crsitr = svi.rbegin(), i = 0; critr != ctmpvi.rend(); critr += 3, crsitr += 3, i++) {
+ check_expr(*critr == *crsitr);
+ if (i > 0) {
+ critr -= 2;
+ crsitr -= 2;
+ }
+ check_expr(*critr == *crsitr);
+ }
+
+ for (citr2 = tmpvi.begin(), csitr2 = svi.begin(), i = 0; citr2 != tmpvi.rend(); ++citr2, ++csitr2, i++) {
+ check_expr(citr2 < citr2 + 1);
+ check_expr(citr2 <= citr2 + 1);
+ check_expr(citr2 > citr2 - 1);
+ check_expr(citr2 >= citr2 - 1);
+ check_expr(citr2 <= 2 + citr2);
+
+ if (i > 1)
+ check_expr(citr2 >= -2 + citr2);
+ check_expr(*citr2 == *csitr2);
+ if (i < n - 1)
+ check_expr(citr2[1] == csitr2[1]);
+ }
+
+ for (citr2 = ctmpvi.begin(), csitr2 = svi.begin(), i = 0; citr2 != ctmpvi.rend(); citr2 += 3, csitr2 += 3, i++) {
+ citr2.refresh(true);
+ check_expr(*citr2 == *csitr2);
+ if (i > 0) {
+ citr2 -= 2;
+ csitr2 -= 2;
+ }
+ check_expr(*citr2 == *csitr2);
+ check_expr(citr2->v == *csitr2);
+ }
+ citr2 = ctmpvi.begin() + 2;
+ csitr2 = svi.begin() + 2;
+ check_expr(*citr2 == *csitr2);
+ citr2--;
+ csitr2--;
+ check_expr(*citr2 == *csitr2);
+ --citr2;
+ --csitr2;
+ check_expr(*citr2 == *csitr2);
+
+ db_vector<ptype<int> > tmpvi2;
+ vector<int> tmpsvi2;
+ tmpvi2.insert(tmpvi2.begin(), tmpvi.begin() + 1, tmpvi.end() - 1);
+ //tmpsvi2.insert(svi.begin(), svi.begin() + 1, svi.end() - 1); c++ stl does not support this
+ for (i = 1; i < (int)tmpvi.size() - 1; i++)
+ tmpsvi2.push_back(tmpvi[i]);
+ check_expr(is_equal(tmpvi2, tmpsvi2));
+
+ tmpvi2.clear(false);
+ tmpsvi2.clear();
+
+ tmpvi2.insert(tmpvi2.end(), tmpvi.begin(), tmpvi.end());
+ tmpsvi2.insert(tmpsvi2.end(), svi.begin(), svi.end());
+ check_expr(is_equal(tmpvi2, tmpsvi2));
+
+ tmpvi2.insert(tmpvi2.end() - 3, tmpvi.begin() + 2, tmpvi.end() - 1);
+ tmpsvi2.insert(tmpsvi2.end() - 3, svi.begin() + 2, svi.end() - 1);
+ check_expr(is_equal(tmpvi2, tmpsvi2));
+
+ db_vector<char, ElementHolder<char> > charvec(n);
+ for (i = 0; i < n; i++)
+ charvec[i] = (char)i;
+ db_vector<char, ElementHolder<char> > charvec3(charvec);
+ const db_vector<char, ElementHolder<char> > &ccharvec3 = charvec3;
+ check_expr(ctmpvi == charvec);
+ charvec[n / 2] *= 2;
+ check_expr(ctmpvi != charvec);
+ charvec.push_back(127);
+ check_expr(ctmpvi != charvec);
+ charvec.resize(charvec.size());
+ charvec.assign(ccharvec3.begin(), ccharvec3.end());
+ check_expr(charvec == ccharvec3);
+ charvec.clear(false);
+ charvec.insert(charvec.begin(), ccharvec3.begin(), ccharvec3.end());
+ charvec.insert(charvec.begin(), 113);
+ db_vector<char, ElementHolder<char> > charvec2(5);
+ charvec2.assign(charvec.begin(), charvec.end(), false);
+ check_expr((charvec2 != charvec) == false);
+
+ db_vector<string> tmpvi3, tmpvi4;
+ db_vector<char *, ElementHolder<char *> > tmpvi5, tmpvi6;
+
+ std::list<string> tmpsvi3, tmpsvi4;
+ char tmpbuf[4];
+ tmpbuf[3] = '\0';
+ int exec_cnt = 0;
+doagain:
+ for (i = 0; i < 64; i++) {
+ tmpbuf[0] = 'a' + rand() % 3;
+ tmpbuf[1] = 'a' + rand() % 3;
+ tmpbuf[2] = 'a' + rand() % 3;
+ tmpvi3.push_back(string(tmpbuf));
+ tmpsvi3.push_back(string(tmpbuf));
+ tmpvi5.push_back(tmpbuf);
+ }
+
+ // sort
+ if (exec_cnt == 0) {
+ tmpvi5.sort(strlt0);
+ tmpvi3.sort(strlt);
+ tmpsvi3.sort(strlt);
+ } else {
+ tmpvi5.sort();
+ tmpvi3.sort();
+ tmpsvi3.sort();
+ }
+ check_expr(is_equal(tmpvi3, tmpsvi3));
+ check_expr(is_equal(tmpvi5, tmpsvi3));
+
+ // unique
+ if (exec_cnt == 0) {
+ tmpvi5.unique(streq0);
+ tmpvi3.unique(streq);
+ tmpsvi3.unique(streq);
+ } else {
+ tmpvi5.unique();
+ tmpvi3.unique();
+ tmpsvi3.unique();
+ }
+ check_expr(is_equal(tmpvi3,tmpsvi3));
+ check_expr(is_equal(tmpvi5, tmpsvi3));
+
+ // merge
+ for (i = 0; i < 64; i++) {
+ tmpbuf[0] = 'b' + rand() % 3;
+ tmpbuf[1] = 'b' + rand() % 3;
+ tmpbuf[2] = 'b' + rand() % 3;
+ tmpvi4.push_back(string(tmpbuf));
+ tmpsvi4.push_back(string(tmpbuf));
+ tmpvi6.push_back(tmpbuf);
+ }
+
+ if (exec_cnt == 0) {
+ tmpvi6.sort(strlt0);
+ tmpvi4.sort(strlt);
+ tmpsvi4.sort(strlt);
+ tmpvi5.merge(tmpvi6, strlt0);
+ tmpvi3.merge(tmpvi4, strlt);
+ tmpsvi3.merge(tmpsvi4, strlt);
+ } else {
+ tmpvi6.sort();
+ tmpvi4.sort();
+ tmpsvi4.sort();
+ tmpvi5.merge(tmpvi6);
+ tmpvi3.merge(tmpvi4);
+ tmpsvi3.merge(tmpsvi4);
+ }
+ check_expr(is_equal(tmpvi3, tmpsvi3));
+ check_expr(is_equal(tmpvi5, tmpsvi3));
+
+ exec_cnt++;
+ if (exec_cnt == 1) {
+ tmpvi3.clear();
+ tmpvi4.clear();
+ tmpvi5.clear();
+ tmpvi6.clear();
+ tmpsvi3.clear();
+ tmpsvi4.clear();
+ goto doagain;
+ }
+ vi.clear();
+ svi.clear();
+ }
+
+ vi.clear();
+ // tested: push_back, operator!= , db_vector::size,
+ fill(vi, svi, 0, n);
+ pprint(vi);
+ check_expr(is_equal(vi, svi) == true);
+ ptint tmp;
+
+ // tested functions:
+ // db_vector<>::begin, end; iterator::operator ++/*/=,
+ // iterator copy constructor, RandDbc<>::operator=,
+ // RandDbc<>(const RandDbc&),
+ // T(const RandDbc<T>&),
+ // RandDbc<T>::operator=(const RandDbc<T>&),
+ // and also the reverse iterator versions of these functions/classes
+ //
+ for(itr1 = vi.begin(), itr = itr1, sitr1 = svi.begin(),
+ sitr = sitr1, i = 0;
+ itr1 != vi.end() && sitr1 != svi.end(); itr1++, sitr1++, i++) {
+
+ *itr = (tmp = ptint(*itr1) * 2);
+ cout<<"\n*itr = "<<(ptint(*itr))<<"\ttmp = "<<tmp;
+ itr = itr1;
+ *sitr = (*sitr1) * 2;
+ sitr = sitr1;
+ }
+ pprint(vi);
+ check_expr(is_equal(vi, svi) == true);
+ size_t ii;
+ for(itr1 = vi.begin(), sitr1 = svi.begin(), ii = 0;
+ ii < svi.size(); ii++) {
+ itr1[ii] = 2 * itr1[ii];
+ sitr1[ii] = 2 * sitr1[ii];
+ }
+ pprint(vi);
+ check_expr(is_equal(vi, svi) == true);
+ //itr.close_cursor();
+ if ( EXPLICIT_TXN) {
+
+ dbstl::commit_txn(penv);
+ dbstl::begin_txn(0, penv);
+ }
+ for(ritr1 = vi.rbegin(), ritr = ritr1, rsitr1 = svi.rbegin(),
+ rsitr = rsitr1, i = 0;
+ ritr1 != vi.rend() && rsitr1 != svi.rend();
+ ritr1++, rsitr1++, i++) {
+
+ *ritr = (tmp = (*ritr1 * 2));
+ cout<<"\n*itr = "<<(ptint(*ritr))<<"\ttmp = "<<tmp;
+ ritr = ritr1;
+ *rsitr = *rsitr1 * 2;
+ rsitr = rsitr1;
+ }
+
+ if (EXPLICIT_TXN) {
+
+ dbstl::commit_txn(penv);
+ dbstl::begin_txn(0, penv);
+ }
+ pprint(vi);
+ check_expr(is_equal(vi, svi) == true);
+
+ for(ritr1 = vi.rbegin(), ritr = ritr1, rsitr1 = svi.rbegin(),
+ rsitr = rsitr1, i = 0;
+ ritr1 != vi.rend() && rsitr1 != svi.rend();
+ ritr1++, rsitr1++, i++) {
+
+ *ritr = (tmp = ptint(*ritr1) * 2);
+ cout<<"\n*itr = "<<(ptint(*ritr))<<"\ttmp = "<<tmp;
+ ritr = ritr1;
+ *rsitr = (*rsitr1) * 2;
+ rsitr = rsitr1;
+ }
+
+ pprint(vi);
+ check_expr(is_equal(vi, svi) == true);
+ if (EXPLICIT_TXN){
+ dbstl::commit_txn(penv);
+ dbstl::begin_txn(0, penv);
+ }
+ for(itr1 = vi.begin(), itr = itr1, sitr1 = svi.begin(),
+ sitr = sitr1, i = 0;
+ itr1 != vi.end() && sitr1 != svi.end();
+ itr1++, sitr1++, i++) {
+
+ *itr = (tmp = ptint(*itr1) * 2);
+ cout<<"\n*itr = "<<(ptint(*itr))<<"\ttmp = "<<tmp;
+ itr = itr1;
+ *sitr = (*sitr1) * 2;
+ sitr = sitr1;
+ }
+
+ itr.close_cursor();
+ pprint(vi);
+ check_expr(is_equal(vi, svi) == true);
+ if (EXPLICIT_TXN) {
+
+ dbstl::commit_txn(penv);
+ dbstl::begin_txn(0, penv);
+ }
+
+ for (i = 0; i< n - 1; i++) {
+ vi[i] = ptint(vi[i]) * 2;
+ vi[i] = TOINT( ptint(vi[i]) - (ptint(vi[i + 1]) * 2));
+
+ svi[i] = svi[i] * 2;
+ svi[i] = TOINT(svi[i] - svi[i + 1] * 2);
+
+ }
+ pprint(vi);
+ check_expr(is_equal(vi, svi) == true);
+ if (EXPLICIT_TXN)
+ dbstl::commit_txn(penv);
+ if (!TEST_AUTOCOMMIT)
+ dbstl::begin_txn(0, penv);
+
+ // testing pop_back and back()
+ ptint t;
+ for (i = n - 1; i >= 0; i--) {
+ check_expr(ptint(vi.back()) == svi[i]);
+ vi.pop_back();
+ }
+
+ list<int> lvi;
+ list<int>::iterator lvit;
+ for (i = 0; i < n; i++) {
+ lvi.push_front(i);
+ vi.push_front(i);
+ }
+ pprint(vi, "inserted by push_front");
+ for (i = 0; i < n; i++) {
+ pprint(vi, "pop front :");
+ check_expr(ptint(vi.front()) == lvi.front());
+ vi.pop_front();
+ lvi.pop_front();
+ }
+ fill(vi, svi, 0, n);
+ if ( !TEST_AUTOCOMMIT)
+ dbstl::commit_txn(penv);
+ if (EXPLICIT_TXN)
+ dbstl::begin_txn(0, penv);
+
+ //testing front(), erase()
+ cout<<"front test\n";
+ for (i = 0, itr = vi.begin(); i < n; i++) {
+ pprint(vi);
+ check_expr(ptint(vi.front()) == svi[i]);
+ if (i % 2) // try both
+ itr = vi.erase(itr);
+ else {
+ vi.pop_front(); // here pop_front is also OK
+ itr = vi.begin();
+ }
+ }
+ itr.close_cursor();
+ fill(vi, svi, 0, n);
+
+
+ /*
+ * Currently we can only use a ref to ref the *itr and use
+ * the ref UNTIL we store changes, rahter than
+ * use *itr multiple times, because iterator::operator* will erase
+ * changed data members. this limitation won't influence std
+ * algorithms because they all manipulate the elements in their
+ * whole, never access their members.
+ */
+ for (itr1 = vi.begin(), itr = itr1,
+ sitr1 = svi.begin(), sitr = sitr1, i = 0;
+ itr1 != vi.end() && sitr1 != svi.end();i++, itr1++, sitr1++) {
+
+ if (i % 2 == 0) {
+ ptint_vector::iterator::reference itrref = (*itr);
+ t = itrref;
+ check_expr( t == *sitr);
+ itrref = (t) * 3;
+ (*sitr) = 3 * (*sitr);
+ itrref._DB_STL_StoreElement();
+ itr = itr1;
+ sitr = sitr1;
+
+ } else {
+ ptint_vector::reference itrref = vi[i];
+ t = itrref;
+ check_expr(t == svi[i]);
+ itrref = t * 3;
+ svi[i] = 3 * svi[i];
+ itrref._DB_STL_StoreElement();
+ }
+
+ }
+ pprint(vi);
+ check_expr(is_equal(vi, svi) == true);
+
+ ptint_vector vi2(db2, penv);
+ vi2.clear();
+
+ vi2.insert(vi2.end(), 1024);
+ svi2.insert(svi2.end(), 1024);
+ check_expr(is_equal(vi2, svi2) == true);
+ if ( EXPLICIT_TXN)
+ dbstl::commit_txn(penv);
+ if (!TEST_AUTOCOMMIT)
+ dbstl::begin_txn(0, penv);
+ pprint(vi, "vi before swapping: ");
+ fill(vi2, svi2, 6, 9);
+ check_expr(vi != vi2);
+ pprint(vi, "vi before swapping2:");
+ pprint(vi2, "vi2 before swapping: ");
+ vi.swap(vi2);
+ check_expr(vi != vi2);
+ svi.swap(svi2);
+ pprint(vi, "vi:");
+ pprint(vi2, "vi2:");
+ check_expr(is_equal(vi, svi) == true);
+ check_expr(is_equal(vi2, svi2) == true);
+ if (!TEST_AUTOCOMMIT)
+ dbstl::commit_txn(penv);
+ if (EXPLICIT_TXN)
+ dbstl::begin_txn(0, penv);
+ cout<<"\ntesting db container's insert method...";
+ vi.insert(vi.end(), 1024);
+ svi.insert(svi.end(), 1024);
+ vi.insert(vi.begin(), vi2.begin(), vi2.end());
+ svi.insert(svi.begin(), svi2.begin(), svi2.end());
+ vi.insert(vi.begin() + 3, 10101);
+ svi.insert(svi.begin() + 3, 10101);
+ vi.insert(vi.end(), (size_t)10, ptint (987));
+ svi.insert(svi.end(), 10, 987);
+ check_expr(is_equal(vi, svi) == true);
+ vi.insert(vi.end(), vi2.begin() + 3, vi2.end());
+ svi.insert(svi.end(), svi2.begin() + 3, svi2.end());
+ pprint(vi, "\nvi after inserting a range and 10 identical numbers");
+ check_expr(is_equal(vi, svi) == true);
+
+ vi.assign(vi2.begin(), vi2.end());
+ svi.assign(svi2.begin(), svi2.end());
+ check_expr(is_equal(vi, svi) == true);
+
+ vi.assign(vi2.begin(), vi2.end());
+ svi.assign(svi2.begin(), svi2.end());
+ check_expr(is_equal(vi, svi) == true);
+ pprint(vi, "vi before assigning");
+
+ vi.assign(vi2.begin() + 1, vi2.begin() + 3);
+ svi.assign(svi2.begin() + 1, svi2.begin() + 3);
+ check_expr(is_equal(vi, svi) == true);
+ vi.assign((size_t)10, ptint (141));
+ svi.assign(10, 141);
+ check_expr(is_equal(vi, svi) == true);
+
+ vi.insert(vi.begin(), vi2.begin(), vi2.end());
+ svi.insert(svi.begin(), svi2.begin(), svi2.end());
+
+ vi.resize(vi.size() / 2);
+ svi.resize(svi.size() / 2);
+ check_expr(is_equal(vi, svi) == true);
+ vi.resize(vi.size() * 4);
+ svi.resize(svi.size() * 4);
+ check_expr(is_equal(vi, svi) == true);
+
+ for (int ui = 0; ui < (int)svi.size(); ui++) {
+ svi[ui] = ui;
+ vi[ui] = ui;
+ }
+
+ itr = vi.begin() + 3;
+ itr1 = vi.begin() + vi.size() - 8;
+ sitr = svi.begin() + 3;
+ sitr1 = svi.begin() + svi.size() - 8;
+ pprint(vi, "vi before erasing range: ");
+ vi.erase(itr, itr1);
+ svi.erase(sitr, sitr1);
+ check_expr(is_equal(vi, svi) == true);
+
+ vi.clear();
+ svi.clear();
+ if ( EXPLICIT_TXN)
+ dbstl::commit_txn(penv);
+} // test_member_functions
+
+// Testing list specific methods.
+void TestVector::test_list_specific_member_functions()
+{
+ int i;
+ std::list<ptint> slvi;
+ std::list<ptint>::iterator slitr;
+ ptint_vector vi(db, penv);
+
+ if (EXPLICIT_TXN)
+ dbstl::begin_txn(0, penv);
+ fill(vi, svi, 1,10);
+ for (i = 1; i < 11; i++)
+ slvi.push_back(i);
+ pprint(vi, "vi after fill: ");
+ vi.push_back(8);
+ vi.push_back(1);
+ vi.push_front(2);
+ vi.push_front(100);
+ vi.insert(vi.begin() + 4, 7);
+ slvi.push_back(8);
+ slvi.push_back(1);
+ slvi.push_front(2);
+ slvi.push_front(100);
+ slitr = slvi.begin();
+ std::advance(slitr, 4);
+ slvi.insert(slitr, 7);
+ pprint(vi, "vi after push_back: ");
+
+ vi.remove(8);
+ slvi.remove(8);
+ pprint(vi, "vi after remove(8): ");
+ check_expr(is_equal(vi, slvi));
+ vi.remove_if(is7);
+ slvi.remove_if(is7);
+ check_expr(is_equal(vi, slvi));
+
+ vi.reverse();
+ slvi.reverse();
+ check_expr(is_equal(vi, slvi));
+
+ vi.sort();
+ slvi.sort();
+ check_expr(is_equal(vi, slvi));
+
+ vi.push_back(100);
+ slvi.push_back(100);
+ vi.push_front(1);
+ slvi.push_front(1);
+ pprint(vi, "vi before vi.unique():");
+ vi.unique();
+ slvi.unique();
+ pprint(vi, "vi after vi.unique():");
+ check_expr(is_equal(vi, slvi));
+
+ ptint_vector vi3(db3, penv);
+ list<ptint> slvi3;
+
+ fill(vi3, svi, 4, 15);
+ for (i = 4; i < 19; i++)
+ slvi3.push_back(i);
+
+ vi.merge(vi3);
+ slvi.merge(slvi3);
+ check_expr(is_equal(vi, slvi));
+ pprint(vi3, "vi3 after merge:");
+ check_expr(is_equal(vi3, slvi3));
+
+ vi3.clear();
+ slvi3.clear();
+ svi.clear();
+ fill(vi3, svi, 4, 15);
+ for (i = 4; i < 19; i++)
+ slvi3.push_back(i);
+
+ list<ptint>::iterator slitr2;
+ slitr = slvi3.begin();
+ std::advance(slitr, 4);
+ slitr2 = slvi.begin();
+ std::advance(slitr2, 6);
+
+ pprint(vi, "vi before splice :");
+ vi.splice(vi.begin() + 6, vi3, vi3.begin() + 4);
+ slvi.splice(slitr2, slvi3, slitr);
+ pprint(vi, "vi after splice :");
+ check_expr(is_equal(vi, slvi));
+ pprint(vi3, "vi3 after splice :");
+ check_expr(is_equal(vi3, slvi3));
+
+ slitr = slvi3.begin();
+ std::advance(slitr, 5);
+ vi.splice(vi.begin(), vi3, vi3.begin() + 5, vi3.end());
+ slvi.splice(slvi.begin(), slvi3, slitr, slvi3.end());
+ pprint(vi, "vi after splice :");
+ pprint(vi3, "vi3 after splice :");
+ check_expr(is_equal(vi, slvi));
+ check_expr(is_equal(vi3, slvi3));
+
+ vi.splice(vi.end(), vi3);
+ slvi.splice(slvi.end(), slvi3);
+ pprint(vi, "vi after splice :");
+ pprint(vi3, "vi3 after splice :");
+ check_expr(is_equal(vi, slvi));
+ check_expr(is_equal(vi3, slvi3));
+
+ vi.clear();
+ vi3.clear();
+
+ check_expr(!(vi < vi3));
+ fill(vi, svi, 1, 10);
+
+ fill(vi3, svi3, 1, 10);
+ check_expr(!(vi < vi3));
+ vi.push_front(0);
+ check_expr((vi < vi3));
+ vi3.push_front(0);
+ vi.push_back(10);
+ check_expr((vi3 < vi));
+ vi.erase(vi.begin());
+ check_expr((vi3 < vi));
+
+ if ( EXPLICIT_TXN)
+ dbstl::commit_txn(penv);
+
+}
+
+// Use std algorithms to manipulate dbstl containers.
+void TestVector::test_std_functions()
+{
+ ptint_vector::iterator itr1, itr;
+ ptint_vector::reverse_iterator ritr1, ritr;
+ vector<int>::iterator sitr, sitr1;
+ vector<int>::reverse_iterator rsitr, rsitr1;
+ ptint_vector vi(db, penv);
+ ptint_vector vi2(db2, penv);
+ ptint_vector vi3(db3, penv);
+ // test db_vector by applying it to each and every
+ // function in std algorithm
+ //
+ // for_each
+ // here after vi is supposed to be
+ // {6, 7, 8, 9, 10, 11, 12, 13, 14}
+ //
+ if (!TEST_AUTOCOMMIT)
+ dbstl::begin_txn(0, penv);
+ vi.clear();
+ svi.clear();
+ fill(vi, svi, 6, 9);
+ if (!TEST_AUTOCOMMIT)
+ dbstl::commit_txn(penv);
+
+ if (EXPLICIT_TXN)
+ dbstl::begin_txn(0, penv);
+ square squareobj;
+ cout<<"\nfor_each begin to end\n";
+ for_each(vi.begin(), vi.end(), squareobj);
+ cout<<endl;
+ for_each(svi.begin(), svi.end(), squareobj);
+ cout<<"\nfor_each begin +2 to begin +6\n";
+ for_each(vi.begin() + 2, vi.begin() + 6, squareobj);
+ cout<<endl;
+ for_each(svi.begin() + 2, svi.begin() + 6, squareobj);
+
+ vector<int>::difference_type ssi = svi.rend() - svi.rbegin();
+ ptint_vector::difference_type si;
+ si = vi.rend() - vi.rbegin();
+ check_expr(ssi == si);
+ vector<int>::reverse_iterator sj = svi.rbegin() + 3;
+ cout<<"si, sj ="<<si<<'\t'<<*sj;
+
+ //find
+ ptint tgt(12);
+ ptint_vector::iterator vpos =
+ find(vi.begin(), vi.end(), tgt);
+ check_expr(vpos != vi.end() && (ptint(*vpos) == tgt));
+ vpos = find(vi.begin() + 3, vi.begin() + 7, tgt);
+ check_expr(vpos != vi.end() && (ptint(*vpos) == tgt));
+ tgt = -123;
+ vpos = find(vi.begin(), vi.end(), tgt);
+ check_expr(vpos == vi.end());
+
+ // find_end
+ int subseq[] = {8, 9, 10};
+#ifdef WIN32
+ // C++ STL specification requires this equivalence relation hold for
+ // any iterators:
+ // "itr1==itr2" <===> "&*itr1 == &*itr2"
+ // this means that each iterator don't hold value for themselvs,
+ // but refer to a shared piece of memory held by its container object,
+ // which is not true for dbstl. The impl of find_end in gcc's stl lib
+ // relies on this requirement, but not for MS's stl lib. So this test
+ // only runs on WIN32.
+ pprint(vi, "vi before find_end(): ");
+ vpos = find_end(vi.begin(), vi.end(), vi.begin(), vi.begin() + 1);
+ check_expr(vpos == vi.begin());
+ vpos = find_end(vi.begin(), vi.end(), vi.begin() + 3,
+ vi.begin() + 5);
+ check_expr(vpos == vi.begin() + 3);
+ vpos = find_end(vi.begin() + 1, vi.end(), subseq, subseq + 3);
+ check_expr(vpos == vi.begin() + 2);
+#endif
+ //search
+ vpos = search(vi.begin(), vi.end(), vi.begin(), vi.begin() + 1);
+ check_expr(vpos == vi.begin());
+ vpos = search(vi.begin(), vi.end(), vi.begin() + 3, vi.begin() + 5);
+ check_expr(vpos == vi.begin() + 3);
+ vpos = search(vi.begin() + 1, vi.end(), subseq, subseq + 3);
+ check_expr(vpos == vi.begin() + 2);
+
+ // find_first_of
+ vpos = find_first_of(vi.begin(), vi.end(), vi.begin(),
+ vi.begin() + 1);
+ check_expr(vpos == vi.begin());
+ vpos = find_first_of(vi.begin() + 2, vi.begin() + 6,
+ vi.begin() + 4, vi.begin() + 5);
+ check_expr(vpos == vi.begin() + 4);
+ int subseq2[] = {9, 8, 10, 11};
+ vpos = find_first_of(vi.begin() + 1, vi.begin() + 7,
+ subseq2, subseq2 + 4);
+ check_expr(vpos == vi.begin() + 2);
+ vpos = find_first_of(vi.begin() + 6, vi.end(),
+ subseq2, subseq2 + 4);
+ check_expr(vpos == vi.end());
+
+ //find_if
+ vpos = find_if(vi.begin(), vi.end(), is2digits);
+ check_expr(ptint(*vpos) == 10);
+ vpos = find_if(vi.begin() + 5, vi.begin() + 8, is2digits);
+ check_expr(ptint(*vpos) == 11);
+ vpos = find_if(vi.begin() + 1, vi.begin() + 3, is2digits);
+ check_expr(vpos == vi.begin() + 3);
+
+ // count_if
+ ptint_vector::difference_type oddcnt =
+ count_if(vi.begin(), vi.end(), is_odd);
+ check_expr(oddcnt == 4);
+ oddcnt = count_if(vi.begin(), vi.begin() + 5, is_odd);
+ check_expr(oddcnt == 2);
+ oddcnt = count_if(vi.begin(), vi.begin(), is_odd);
+ check_expr(oddcnt == 0);
+
+ // mismatch
+ pair<intvec_t::iterator , int*> resmm = mismatch(vi.begin(),
+ vi.begin() + 3, subseq);
+ check_expr(resmm.first == vi.begin() && resmm.second == subseq);
+ resmm = mismatch(vi.begin() + 2, vi.begin() + 5, subseq);
+ check_expr(resmm.first == vi.begin() + 5 && resmm.second == subseq + 3);
+ resmm = mismatch(vi.begin() + 2, vi.begin() + 4, subseq);
+ check_expr(resmm.first == vi.begin() + 4 && resmm.second == subseq + 2);
+
+ //equal
+ check_expr (equal(vi.begin(), vi.begin() + 3, subseq) == false);
+ check_expr(equal(vi.begin() + 2, vi.begin() + 5, subseq) == true);
+ check_expr(equal(vi.begin() + 2, vi.begin() + 4, subseq) == true);
+ if ( EXPLICIT_TXN) {
+ dbstl::commit_txn(penv);
+ dbstl::begin_txn(0, penv);
+ }
+ //copy
+ pprint(vi2, "\nvi2 before copying");
+ pprint(vi, "\nvi1 before copying");
+ copy(vi.begin(), vi.begin() + 3, vi2.begin() + 1);
+ copy(svi.begin(), svi.begin() + 3, svi2.begin() + 1);
+ // vi2 should be 0, 6, 7, 8,4
+ int vi22[] = { 0, 6, 7, 8,4};
+ pprint(vi2, "\nvi2 after copying");
+ check_expr(equal(vi2.begin(), vi2.end(), vi22) == true);
+ check_expr(is_equal(vi, svi));
+
+ // copy_backward
+ copy_backward(vi.begin(), vi.begin() + 3, vi.begin() + 8);
+ copy_backward(svi.begin(), svi.begin() + 3, svi.begin() + 8);
+ pprint(vi);// should be 6,7,8,9,10,6,7,8,14
+ check_expr(is_equal(vi, svi));
+
+ copy_backward(vi.begin(), vi.begin() + 4, vi.begin() + 6);
+ copy_backward(svi.begin(), svi.begin() + 4, svi.begin() + 6);
+ pprint(vi);// should be 6,7, 6,7, 8, 9, 7, 8, 14
+ check_expr(is_equal(vi, svi));
+ copy_backward(vi.begin() + 7, vi.end(), vi.begin() + 5);
+ copy_backward(svi.begin() + 7, svi.end(), svi.begin() + 5);
+ pprint(vi);//should be 6,7,6,8,14,8,14,8,14
+ check_expr(is_equal(vi, svi)); //here the check_expr fails but I think
+ //the values in vi are right, those in svi are wrong
+
+
+ // swap_ranges
+ swap_ranges(vi.begin() + 3, vi.begin() + 7, vi.begin() + 4);
+ swap_ranges(svi.begin() + 3, svi.begin() + 7, svi.begin() + 4);
+ check_expr(is_equal(vi, svi));
+
+ /*
+ * std::swap can only swap data of same type, so following tests
+ * do not compile, we can provide our own swap(T, ElementRef<T>)
+ * func to address this
+ */
+ vector<ptint> spvi, spvi2;
+ spvi.insert(spvi.begin(), svi.begin(), svi.end());
+ spvi2.insert(spvi2.begin(), svi2.begin(), svi2.end());
+ swap_ranges(vi.begin() + 3, vi.begin() + 5, spvi.begin() + 6);
+ swap_ranges(spvi.begin() + 3, spvi.begin() + 5, vi.begin() + 6);
+ check_expr(is_equal(vi, spvi));
+
+ swap_ranges(spvi.begin() + 3, spvi.begin() + 7, vi.begin() + 5);
+ //swap back
+ swap_ranges(spvi.begin() + 3, spvi.begin() + 7, vi.begin() + 5);
+ check_expr(is_equal(vi, spvi));
+
+ transform(vi2.begin(), vi2.end(), vi.begin() + 2,
+ vi.begin() + 4, addup);
+ transform(spvi2.begin(), spvi2.end(), spvi.begin() + 2,
+ spvi.begin() + 4, addup);
+ check_expr(is_equal(vi, spvi));
+
+ replace(vi.begin(), vi.end(), 8, 88);
+ replace(spvi.begin(), spvi.end(), 8, 88);
+ check_expr(is_equal(vi, spvi));
+
+ generate(vi.begin(), vi.begin() + 2, randint);
+ generate(spvi.begin(), spvi.begin() + 2, randint);
+ pprint(vi);
+ check_expr(is_equal(vi, spvi));
+
+ remove(vi.begin(), vi.end(), -999);
+ remove(spvi.begin(), spvi.end(), -999);
+ pprint(vi, "\nafter remove");
+ check_expr(is_equal(vi, spvi));
+
+ reverse(vi.begin(), vi.end());
+ reverse(spvi.begin(), spvi.end());
+ pprint(vi, "\nafter reverse");
+ check_expr(is_equal(vi, spvi));
+
+ rotate(vi.begin() + 1, vi.begin() + 5, vi.end());
+ rotate(spvi.begin() + 1, spvi.begin() + 5, spvi.end());
+ pprint(vi, "\n after rotate");
+ check_expr(is_equal(vi, spvi));
+
+ separator<ptint> part;
+ part.mid = 11;
+ partition(vi.begin(), vi.end(), part);
+ partition(spvi.begin(), spvi.end(), part);
+ pprint(vi, "\nafter partition");
+ check_expr(is_equal(vi, spvi));
+
+ sort(vi.begin(), vi.end());
+ sort(spvi.begin(), spvi.end());
+ check_expr(is_equal(vi, spvi));
+
+ random_shuffle(vi.begin(), vi.end());
+ random_shuffle(spvi.begin(), spvi.end());
+ pprint(vi, "\nvi after random_shuffle");
+ sort(vi.begin(), vi.end());
+ sort(spvi.begin(), spvi.end());
+ pprint(vi, "\nvi after sort");
+ check_expr(is_equal(vi, spvi));
+
+ random_shuffle(vi2.begin(), vi2.end());
+ random_shuffle(spvi2.begin(), spvi2.end());
+#ifdef WIN32
+ // The implementation of __get_temporary_buffer in g++'s stl
+ // lib makes it impossible to correctly use ElementHolder or
+ // ElementRef<>, so this function dose not work with dbstl on gcc.
+ stable_sort(vi2.begin(), vi2.end());
+ stable_sort(spvi2.begin(), spvi2.end());
+#else
+ sort(vi2.begin(), vi2.end());
+ sort(spvi2.begin(), spvi2.end());
+#endif
+ check_expr(is_equal(vi2, spvi2));
+
+ random_shuffle(vi2.begin(), vi2.end());
+ random_shuffle(spvi2.begin(), spvi2.end());
+ pprint(vi2);
+ sort(vi2.begin(), vi2.end());
+ sort(spvi2.begin(), spvi2.end());
+ pprint(vi2);
+ check_expr(is_equal(vi2, spvi2));
+
+ vi3.clear();
+ vi3.insert(vi3.begin(), (size_t)100, ptint(0));
+ vector<ptint> spvi3(100);
+ merge(vi.begin(), vi.end(), vi2.begin(), vi2.end(), vi3.begin());
+ merge(spvi.begin(), spvi.end(), spvi2.begin(), spvi2.end(),
+ spvi3.begin());
+ pprint(vi3, "\n vi3 after merge vi1 with vi2:");
+ check_expr(is_equal(vi3, spvi3));
+
+ spvi3.clear();
+ vi3.clear();
+ sort(vi2.begin(), vi2.end());
+ sort(spvi2.begin(), spvi2.end());
+ pprint(vi2, "\nvi2 after sort:");
+ vi3.insert(vi3.begin(), vi2.begin(), vi2.end());
+ pprint(vi3, "\nvi3 after insert vi2 at beginning");
+ spvi3.insert(spvi3.begin(), spvi2.begin(), spvi2.end());
+ vi3.insert(vi3.begin(), vi.begin(), vi.end());
+ spvi3.insert(spvi3.begin(), spvi.begin(), spvi.end());
+ pprint(vi3, "\nvi3: v1 v2 combined in this order");
+#ifdef WIN32
+ // The implementation of __get_temporary_buffer in g++'s stl
+ // lib makes it impossible to correctly use ElementHolder or
+ // ElementRef<>, so this function dose not work with dbstl on gcc.
+ inplace_merge(vi3.begin(), vi3.begin() + (vi.end() - vi.begin()),
+ vi3.end());
+ inplace_merge(spvi3.begin(), spvi3.begin() + (spvi.end() -
+ spvi.begin()), spvi3.end());
+#endif
+ check_expr(is_equal(vi3, spvi3));
+ make_heap(vi3.begin(), vi3.end());
+ make_heap(spvi3.begin(), spvi3.end());
+ check_expr(is_equal(vi3, spvi3));
+ cout<<endl<<"pop_heap test"<<endl;
+
+ int r ;
+ int rdcnt = 0;
+ while (vi3.size() > 0) {
+ rdcnt++;
+
+ pop_heap(vi3.begin(), vi3.end());
+ vi3.pop_back();
+ pop_heap(spvi3.begin(), spvi3.end());
+ spvi3.pop_back();
+ pprint(vi3);
+
+ }
+ cout<<endl<<"push_heap test"<<endl;
+ rdcnt = 0;
+ while (vi3.size() < 10) {
+ rdcnt++;
+ r = rand();
+ vi3.push_back(ptint(r));
+ push_heap(vi3.begin(), vi3.end());
+ spvi3.push_back(ptint(r));
+ push_heap(spvi3.begin(), spvi3.end());
+ check_expr(is_equal(vi3, spvi3));
+ }
+
+ vi.clear();
+ vi2.clear();
+ vi3.clear();
+ if ( EXPLICIT_TXN)
+ dbstl::commit_txn(penv);
+
+} // void test_std_functions()
+
+void TestVector::test_primitive()
+{
+
+ int i;
+
+ if ( EXPLICIT_TXN)
+ dbstl::begin_txn(0, penv);
+
+
+ db_vector<int, ElementHolder<int> > ivi(db, penv);
+ vector<int> spvi4;
+ fill(ivi, spvi4);
+ check_expr(is_equal(ivi, spvi4));
+ ivi.clear(false);
+
+ db_vector<int, ElementHolder<int> > ivi2(db, penv);
+ vector<int> spvi5;
+ fill(ivi2, spvi5);
+ check_expr(is_equal(ivi2, spvi5));
+ size_t vsz = ivi2.size();
+ for (i = 0; i < (int)vsz - 1; i++) {
+ ivi2[i] += 3;
+ ivi2[i]--;
+ ivi2[i] <<= 2;
+ ivi2[i] = (~ivi2[i] | ivi2[i] & ivi2[i + 1] ^ (2 * (-ivi2[i + 1]) + ivi2[i]) * 3) / (ivi2[i] * ivi2[i + 1] + 1);
+
+ spvi5[i] += 3;
+ spvi5[i]--;
+ spvi5[i] <<= 2;
+ spvi5[i] = (~spvi5[i] | spvi5[i] & spvi5[i + 1] ^ (2 * (-spvi5[i + 1]) + spvi5[i]) * 3) / (spvi5[i] * spvi5[i + 1] + 1);
+ }
+ check_expr(is_equal(ivi2, spvi5));
+ ivi2.clear(false);
+
+ db_vector<ptype<int> > ivi3(db, penv);
+ vector<int> spvi6;
+ fill(ivi3, spvi6);
+ check_expr(is_equal(ivi3, spvi6));
+ ivi3.clear(false);
+
+ typedef db_vector<double, ElementHolder<double> > dbl_vct_t;
+ dbl_vct_t dvi(db, penv);
+ vector<double> dsvi;
+ for (i = 0; i < 10; i++) {
+ dvi.push_back(i * 3.14);
+ dsvi.push_back(i * 3.14);
+ }
+ check_expr(is_equal(dvi, dsvi));
+
+ dbl_vct_t::iterator ditr;
+ vector<double>::iterator sditr;
+ for (ditr = dvi.begin(), sditr = dsvi.begin();
+ ditr != dvi.end(); ++ditr, ++sditr){
+ *ditr *= 2;
+ *sditr *= 2;
+ }
+
+ check_expr(is_equal(dvi, dsvi));
+
+ for (i = 0; i < 9; i++) {
+ dvi[i] /= (-dvi[i] / 3 + 2 * dvi[i + 1]) / (1 + dvi[i]) + 1;
+ dsvi[i] /= (-dsvi[i] / 3 + 2 * dsvi[i + 1]) / (1 + dsvi[i]) + 1;
+ }
+ cout<<"\ndvi after math operations: \n";
+ pprint(dvi);
+ cout<<"\ndsvi after math operations: \n";
+ for (i = 0; i <= 9; i++)
+ cout<<dsvi[i]<<" ";
+ for (i = 0; i < 10; i++) {
+ cout<<i<<"\t";
+ check_expr((int)(dvi[i] * 100000) == (int)(dsvi[i] * 100000));
+ }
+
+ if ( EXPLICIT_TXN)
+ dbstl::commit_txn(penv);
+} // test_primitive
+
+void TestVector::test_queue_stack()
+{
+ int i;
+
+ if ( EXPLICIT_TXN)
+ dbstl::begin_txn(0, penv);
+ ptint_vector vi3(db3, penv);
+ // test whether db_vector works with std::queue,
+ // std::priority_queue and std::stack
+ cout<<"\n_testing db_vector working with std::queue\n";
+ vi3.clear();
+
+ // std::queue test
+ intvec_t quev(quedb, penv);
+ quev.clear();
+ std::queue<ptint, intvec_t> intq(quev);
+ std::queue<ptint> sintq;
+ check_expr(intq.empty());
+ check_expr(intq.size() == 0);
+ for (i = 0; i < 100; i++) {
+ intq.push(ptint(i));
+ sintq.push(i);
+ check_expr(intq.front() == 0);
+ check_expr(intq.back() == i);
+ }
+ check_expr(intq.size() == 100);
+ for (i = 0; i < 100; i++) {
+ check_expr(intq.front() == i);
+ check_expr(intq.back() == 99);
+ check_expr(intq.front() == sintq.front());
+ check_expr(sintq.back() == intq.back());
+ sintq.pop();
+ intq.pop();
+ }
+ check_expr(intq.size() == 0);
+ check_expr(intq.empty());
+ quev.clear();
+
+ // std::priority_queue test
+ cout<<"\n_testing db_vector working with std::priority_queue\n";
+
+ std::vector<ptint> squev;
+ intvec_t pquev(pquedb, penv);
+ pquev.clear();
+ std::priority_queue<ptint, intvec_t, ptintless_ft> intpq(ptintless, pquev);
+ std::priority_queue<ptint, vector<ptint>, ptintless_ft>
+ sintpq(ptintless, squev);
+
+ check_expr(intpq.empty());
+ check_expr(intpq.size() == 0);
+ ptint tmppq, tmppq1;
+ set<ptint> ptintset;
+ for (i = 0; i < 100; i++) {
+ for (;;) {// avoid duplicate
+ tmppq = rand();
+ if (ptintset.count(tmppq) == 0) {
+ intpq.push(tmppq);
+ sintpq.push(tmppq);
+ ptintset.insert(tmppq);
+ break;
+ }
+ }
+
+ }
+ check_expr(intpq.empty() == false);
+ check_expr(intpq.size() == 100);
+ for (i = 0; i < 100; i++) {
+ tmppq = intpq.top();
+ tmppq1 = sintpq.top();
+ if (i == 98 && tmppq != tmppq1) {
+ tmppq = intpq.top();
+ }
+ if (i < 98)
+ check_expr(tmppq == tmppq1);
+ if (i == 97)
+ intpq.pop();
+ else
+ intpq.pop();
+ sintpq.pop();
+ }
+ check_expr(intpq.empty());
+ check_expr(intpq.size() == 0);
+
+
+ // std::stack test
+ cout<<"\n_testing db_vector working with std::stack\n";
+ std::stack<ptint, intvec_t> intstk(quev);
+ std::stack<ptint> sintstk;
+ check_expr(intstk.size() == 0);
+ check_expr(intstk.empty());
+ for (i = 0; i < 100; i++) {
+ intstk.push(ptint(i));
+ sintstk.push(ptint(i));
+ check_expr(intstk.top() == i);
+ check_expr(intstk.size() == (size_t)i + 1);
+ }
+
+ for (i = 99; i >= 0; i--) {
+ check_expr(intstk.top() == ptint(i));
+ check_expr(intstk.top() == sintstk.top());
+ sintstk.pop();
+ intstk.pop();
+ check_expr(intstk.size() == (size_t)i);
+ }
+ check_expr(intstk.size() == 0);
+ check_expr(intstk.empty());
+
+ // Vector with no handles specified.
+ ptint_vector simple_vct(10);
+ vector<ptint> ssvct(10);
+ for (i = 0; i < 10; i++) {
+ simple_vct[i] = ptint(i);
+ ssvct[i] = ptint(i);
+ }
+ check_expr(is_equal(simple_vct, ssvct));
+
+ if ( EXPLICIT_TXN)
+ dbstl::commit_txn(penv);
+
+ return;
+} // test_queue_stack