int main(void) { srand(time(NULL)); Deque_int d; for (size_t i = 0; i < NCYCLES; ++i) { std::deque<int> s; Deque_int_ctor(&d, int_less); Deque_int d2; for (size_t i = 0; i < NITERATIONS; ++i) { for (size_t i = 0; i < NOPERATIONS; ++i) { int val; switch(rand() % 100) { case 0: d.clear(&d); s.clear(); break; default: switch(rand() % 3) { case 0: switch(rand() % 2) { case 0: if (s.empty()) continue; d.pop_front(&d); s.pop_front(); break; case 1: if (s.empty()) continue; d.pop_back(&d); s.pop_back(); } default: switch(rand() % 2) { case 0: val = int_ctor(); d.push_front(&d, val); s.push_front(val); break; case 1: val = int_ctor(); d.push_back(&d, val); s.push_back(val); } } } } assert(d.size(&d) == s.size()); assert(d.empty(&d) == s.empty()); for (size_t i = 0; i < s.size(); ++i) { //cout<< d.at(&d, i) << " " << s.at(i) <<endl; assert(d.at(&d, i) == s.at(i)); } Deque_int_ctor(&d2, int_less); for (size_t i = 0; i < s.size(); ++i) d2.push_back(&d2, s.at(i)); assert(Deque_int_equal(d, d2)); assert(Deque_int_equal(d2, d)); d2.dtor(&d2); Deque_int_Iterator dit = d.begin(&d); std::deque<int>::iterator sit = s.begin(); for (size_t i = 0; i < NITERATOR; ++i) { switch(rand() % 2) { case 0: if (sit == s.end()) continue; ++sit; dit.inc(&dit); break; case 1: if (sit == s.begin()) continue; --sit; dit.dec(&dit); break; } assert((sit == s.begin()) == Deque_int_Iterator_equal(dit, d.begin(&d))); assert((sit == s.end()) == Deque_int_Iterator_equal(dit, d.end(&d))); if (sit == s.end()) continue; assert(*sit == dit.deref(&dit)); } Deque_int_Iterator dit2 = dit = d.begin(&d); int itval = 0, itval2 = 0; for (size_t i = 0; i < NITERATOR; ++i) { switch(rand() % 4) { case 0: if (Deque_int_Iterator_equal(dit, d.end(&d))) continue; dit.inc(&dit); ++itval; break; case 1: if (Deque_int_Iterator_equal(dit, d.begin(&d))) continue; dit.dec(&dit); --itval; break; case 2: if (Deque_int_Iterator_equal(dit2, d.end(&d))) continue; dit2.inc(&dit2); ++itval2; break; case 3: if (Deque_int_Iterator_equal(dit2, d.begin(&d))) continue; dit2.dec(&dit2); --itval2; break; } assert((itval == itval2) == Deque_int_Iterator_equal(dit, dit2)); assert((itval == itval2) == Deque_int_Iterator_equal(dit2, dit)); } if (s.empty()) continue; assert(d.front(&d) == s.front()); assert(d.back(&d) == s.back()); } d.dtor(&d); } printf("OK\n"); return 0; }