1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
|
/***************************************************************************
* tests/containers/test_queue.cpp
*
* Part of the STXXL. See http://stxxl.sourceforge.net
*
* Copyright (C) 2005 Roman Dementiev <dementiev@ira.uka.de>
* Copyright (C) 2009 Andreas Beckmann <beckmann@cs.uni-frankfurt.de>
*
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
**************************************************************************/
// stxxl::queue contains deprecated funtions
#define STXXL_NO_DEPRECATED 1
#include <queue>
#include <stxxl/queue>
typedef unsigned my_type;
template <class q1type, class q2type>
void check(const q1type& q1, const q2type& q2)
{
STXXL_CHECK(q1.empty() == q2.empty());
STXXL_CHECK(q1.size() == q2.size());
if (!q1.empty())
{
if (q1.front() != q2.front() || q1.back() != q2.back())
STXXL_MSG(q1.size() << ": (" << q1.front() << ", " << q1.back() << ") (" << q2.front() << ", " << q2.back() << ")" << (q1.front() == q2.front() ? "" : " FRONT"));
STXXL_CHECK(q1.front() == q2.front());
STXXL_CHECK(q1.back() == q2.back());
}
}
// forced instantiation
template class stxxl::queue<my_type>;
int main()
{
#if 1
//stxxl::set_seed(424648671); // works fine with a single disk, fails with two disks
STXXL_MSG("SEED=" << stxxl::get_next_seed());
stxxl::srandom_number32(stxxl::get_next_seed());
stxxl::random_number32_r rnd;
#else
//stxxl::ran32State = 1028675152; // fails with two disks
STXXL_MSG("ran32State=" << stxxl::ran32State);
stxxl::random_number32 rnd;
#endif
unsigned cnt;
STXXL_MSG("Elements in a block: " << stxxl::queue<my_type>::block_type::size);
// FIXME: can this be raised to recommended (3, 2) without breaking "Testing special case 4" or any other tests?
stxxl::queue<my_type> xqueue(2, 2, -1);
std::queue<my_type> squeue;
check(xqueue, squeue);
STXXL_MSG("Testing special case 4");
cnt = stxxl::queue<my_type>::block_type::size;
while (cnt--)
{
my_type val = rnd();
xqueue.push(val);
squeue.push(val);
check(xqueue, squeue);
}
cnt = stxxl::queue<my_type>::block_type::size;
while (cnt--)
{
xqueue.pop();
squeue.pop();
check(xqueue, squeue);
}
STXXL_MSG("Testing other cases ");
cnt = 100 * stxxl::queue<my_type>::block_type::size;
while (cnt--)
{
if ((cnt % 1000000) == 0)
STXXL_MSG("Operations left: " << cnt << " queue size " << squeue.size());
int rndtmp = rnd() % 3;
if (rndtmp > 0 || squeue.empty())
{
my_type val = rnd();
xqueue.push(val);
squeue.push(val);
check(xqueue, squeue);
}
else
{
xqueue.pop();
squeue.pop();
check(xqueue, squeue);
}
}
while (!squeue.empty())
{
if ((cnt++ % 1000000) == 0)
STXXL_MSG("Operations: " << cnt << " queue size " << squeue.size());
int rndtmp = rnd() % 4;
if (rndtmp >= 3)
{
my_type val = rnd();
xqueue.push(val);
squeue.push(val);
check(xqueue, squeue);
}
else
{
xqueue.pop();
squeue.pop();
check(xqueue, squeue);
}
}
cnt = 10 * stxxl::queue<my_type>::block_type::size;
while (cnt--)
{
if ((cnt % 1000000) == 0)
STXXL_MSG("Operations left: " << cnt << " queue size " << squeue.size());
int rndtmp = rnd() % 3;
if (rndtmp > 0 || squeue.empty())
{
my_type val = rnd();
xqueue.push(val);
squeue.push(val);
check(xqueue, squeue);
}
else
{
xqueue.pop();
squeue.pop();
check(xqueue, squeue);
}
}
typedef stxxl::queue<my_type>::block_type block_type;
stxxl::read_write_pool<block_type> pool(5, 5);
stxxl::queue<my_type> xqueue1(pool, -1);
std::queue<my_type> squeue1;
cnt = 10 * stxxl::queue<my_type>::block_type::size;
while (cnt--)
{
if ((cnt % 1000000) == 0)
STXXL_MSG("Operations left: " << cnt << " queue size " << squeue1.size());
int rndtmp = rnd() % 3;
if (rndtmp > 0 || squeue1.empty())
{
my_type val = rnd();
xqueue1.push(val);
squeue1.push(val);
check(xqueue1, squeue1);
}
else
{
xqueue1.pop();
squeue1.pop();
check(xqueue1, squeue1);
}
}
{
// test proper destruction of a single-block queue
stxxl::queue<int> q;
q.push(42);
}
return 0;
}
|