stxxl::vector
and stxxl::VECTOR_GENERATOR
. Vector type is configured to store 64-bit integers and have 2 pages each of 1 block
00001 /*************************************************************************** 00002 * containers/test_vector.cpp 00003 * 00004 * Part of the STXXL. See http://stxxl.sourceforge.net 00005 * 00006 * Copyright (C) 2002, 2003, 2006 Roman Dementiev <dementiev@mpi-sb.mpg.de> 00007 * 00008 * Distributed under the Boost Software License, Version 1.0. 00009 * (See accompanying file LICENSE_1_0.txt or copy at 00010 * http://www.boost.org/LICENSE_1_0.txt) 00011 **************************************************************************/ 00012 00017 00018 #include <iostream> 00019 #include <algorithm> 00020 #include <stxxl/vector> 00021 #include <stxxl/scan> 00022 00023 typedef stxxl::int64 int64; 00024 00025 struct counter 00026 { 00027 int value; 00028 counter(int v) : value(v) { } 00029 int operator () () 00030 { 00031 int old_val = value; 00032 value++; 00033 return old_val; 00034 } 00035 }; 00036 00037 template <class my_vec_type> 00038 void test_const_iterator(const my_vec_type & x) 00039 { 00040 typename my_vec_type::const_iterator i = x.begin(); 00041 i = x.end() - 1; 00042 i.touch(); 00043 i.flush(); 00044 i++; 00045 ++i; 00046 --i; 00047 i--; 00048 *i; 00049 } 00050 00051 00052 int main() 00053 { 00054 try 00055 { 00056 // use non-randomized striping to avoid side effects on random generator 00057 typedef stxxl::VECTOR_GENERATOR<int64, 2, 2, (2 * 1024 * 1024), stxxl::striping>::result vector_type; 00058 vector_type v(int64(64 * 1024 * 1024) / sizeof(int64)); 00059 00060 // test assignment const_iterator = iterator 00061 vector_type::const_iterator c_it = v.begin(); 00062 00063 unsigned int big_size = 1024 * 1024 * 2 * 16 * 16; 00064 typedef stxxl::vector<double> vec_big; 00065 vec_big my_vec(big_size); 00066 00067 vec_big::iterator big_it = my_vec.begin(); 00068 big_it += 6; 00069 00070 test_const_iterator(v); 00071 00072 stxxl::random_number32 rnd; 00073 int offset = rnd(); 00074 00075 STXXL_MSG("write " << v.size() << " elements"); 00076 00077 stxxl::ran32State = 0xdeadbeef; 00078 vector_type::size_type i; 00079 00080 // fill the vector with increasing sequence of integer numbers 00081 for (i = 0; i < v.size(); ++i) 00082 { 00083 v[i] = i + offset; 00084 assert(v[i] == int64(i + offset)); 00085 } 00086 00087 00088 // fill the vector with random numbers 00089 stxxl::generate(v.begin(), v.end(), stxxl::random_number32(), 4); 00090 v.flush(); 00091 00092 STXXL_MSG("seq read of " << v.size() << " elements"); 00093 00094 stxxl::ran32State = 0xdeadbeef; 00095 00096 // testing swap 00097 vector_type a; 00098 std::swap(v, a); 00099 std::swap(v, a); 00100 00101 for (i = 0; i < v.size(); i++) 00102 { 00103 assert(v[i] == rnd()); 00104 } 00105 00106 // check again 00107 STXXL_MSG("clear"); 00108 00109 v.clear(); 00110 00111 stxxl::ran32State = 0xdeadbeef + 10; 00112 00113 v.resize(int64(64 * 1024 * 1024) / sizeof(int64)); 00114 00115 STXXL_MSG("write " << v.size() << " elements"); 00116 stxxl::generate(v.begin(), v.end(), stxxl::random_number32(), 4); 00117 00118 stxxl::ran32State = 0xdeadbeef + 10; 00119 00120 STXXL_MSG("seq read of " << v.size() << " elements"); 00121 00122 for (i = 0; i < v.size(); i++) 00123 { 00124 assert(v[i] == rnd()); 00125 } 00126 00127 std::vector<stxxl::vector<int> > vector_of_stxxlvectors(2); 00128 // test copy operator 00129 vector_of_stxxlvectors[0] = vector_of_stxxlvectors[1]; 00130 00131 assert(vector_of_stxxlvectors[0] == vector_of_stxxlvectors[1]); 00132 } 00133 catch (const std::exception & ex) 00134 { 00135 STXXL_MSG("Caught exception: " << ex.what()); 00136 } 00137 catch (...) 00138 { 00139 STXXL_MSG("Caught unknown exception."); 00140 } 00141 00142 return 0; 00143 }