LCOV - code coverage report
Current view: top level - testsuite - IteratorTest.cc (source / functions) Hit Total Coverage
Test: STX B+ Tree Testsuite Lines: 373 374 99.7 %
Date: 2013-05-05 Functions: 9 9 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * STX B+ Tree Test Suite v0.9
       3             :  * Copyright (C) 2008-2013 Timo Bingmann
       4             :  *
       5             :  * This program is free software: you can redistribute it and/or modify it
       6             :  * under the terms of the GNU General Public License as published by the Free
       7             :  * Software Foundation, either version 3 of the License, or (at your option)
       8             :  * any later version.
       9             :  *
      10             :  * This program is distributed in the hope that it will be useful, but WITHOUT
      11             :  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
      12             :  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
      13             :  * more details.
      14             :  *
      15             :  * You should have received a copy of the GNU General Public License along with
      16             :  * this program. If not, see <http://www.gnu.org/licenses/>.
      17             :  */
      18             : 
      19             : #include "tpunit.h"
      20             : 
      21             : #include <stdlib.h>
      22             : 
      23             : #include <vector>
      24             : 
      25             : #include <stx/btree_multiset.h>
      26             : #include <stx/btree_multimap.h>
      27             : #include <stx/btree_map.h>
      28             : #include <stx/btree_set.h>
      29             : 
      30             : struct IteratorTest : public tpunit::TestFixture
      31             : {
      32           1 :     IteratorTest() : tpunit::TestFixture(
      33             :         TEST(IteratorTest::test_iterator1),
      34             :         TEST(IteratorTest::test_iterator2),
      35             :         TEST(IteratorTest::test_iterator3),
      36             :         TEST(IteratorTest::test_iterator4),
      37             :         TEST(IteratorTest::test_iterator5),
      38             :         TEST(IteratorTest::test_erase_iterator1)
      39           1 :         )
      40           1 :     {}
      41             : 
      42             :     template <typename KeyType>
      43             :     struct traits_nodebug : stx::btree_default_set_traits<KeyType>
      44             :     {
      45             :         static const bool       selfverify = true;
      46             :         static const bool       debug = false;
      47             : 
      48             :         static const int        leafslots = 8;
      49             :         static const int        innerslots = 8;
      50             :     };
      51             : 
      52           1 :     void test_iterator1()
      53             :     {
      54             :         typedef stx::btree_multiset<unsigned int,
      55             :             std::less<unsigned int>, traits_nodebug<unsigned int> > btree_type;
      56             : 
      57           1 :         std::vector<unsigned int> vector;
      58             : 
      59           1 :         srand(34234235);
      60        3201 :         for(unsigned int i = 0; i < 3200; i++)
      61             :         {
      62        3200 :             vector.push_back( rand() % 1000 );
      63             :         }
      64             : 
      65           1 :         ASSERT( vector.size() == 3200 );
      66             : 
      67             :         // test construction and insert(iter, iter) function
      68           1 :         btree_type bt(vector.begin(), vector.end());
      69             : 
      70           1 :         ASSERT( bt.size() == 3200 );
      71             : 
      72             :         // copy for later use
      73           1 :         btree_type bt2 = bt;
      74             : 
      75             :         // empty out the first bt
      76           1 :         srand(34234235);
      77        3201 :         for(unsigned int i = 0; i < 3200; i++)
      78             :         {
      79        3200 :             ASSERT(bt.size() == 3200 - i);
      80        3200 :             ASSERT( bt.erase_one(rand() % 1000) );
      81        3200 :             ASSERT(bt.size() == 3200 - i - 1);
      82             :         }
      83             : 
      84           1 :         ASSERT( bt.empty() );
      85             : 
      86             :         // copy btree values back to a vector
      87             : 
      88           1 :         std::vector<unsigned int> vector2;
      89           1 :         vector2.assign( bt2.begin(), bt2.end() );
      90             : 
      91             :         // afer sorting the vector, the two must be the same
      92           1 :         std::sort(vector.begin(), vector.end());
      93             : 
      94           1 :         ASSERT( vector == vector2 );
      95             : 
      96             :         // test reverse iterator
      97           1 :         vector2.clear();
      98           1 :         vector2.assign( bt2.rbegin(), bt2.rend() );
      99             : 
     100           1 :         std::reverse(vector.begin(), vector.end());
     101             : 
     102           1 :         btree_type::reverse_iterator ri = bt2.rbegin();
     103        3201 :         for(unsigned int i = 0; i < vector2.size(); ++i)
     104             :         {
     105        3200 :             ASSERT( vector[i] == vector2[i] );
     106        3200 :             ASSERT( vector[i] == *ri );
     107             : 
     108        3200 :             ri++;
     109             :         }
     110             : 
     111           1 :         ASSERT( ri == bt2.rend() );
     112             :     }
     113             : 
     114           1 :     void test_iterator2()
     115             :     {
     116             :         typedef stx::btree_multimap<unsigned int, unsigned int,
     117             :             std::less<unsigned int>, traits_nodebug<unsigned int> > btree_type;
     118             : 
     119           1 :         std::vector< btree_type::value_type > vector;
     120             : 
     121           1 :         srand(34234235);
     122        3201 :         for(unsigned int i = 0; i < 3200; i++)
     123             :         {
     124        3200 :             vector.push_back( btree_type::value_type(rand() % 1000, 0) );
     125             :         }
     126             : 
     127           1 :         ASSERT( vector.size() == 3200 );
     128             : 
     129             :         // test construction and insert(iter, iter) function
     130           1 :         btree_type bt(vector.begin(), vector.end());
     131             : 
     132           1 :         ASSERT( bt.size() == 3200 );
     133             : 
     134             :         // copy for later use
     135           1 :         btree_type bt2 = bt;
     136             : 
     137             :         // empty out the first bt
     138           1 :         srand(34234235);
     139        3201 :         for(unsigned int i = 0; i < 3200; i++)
     140             :         {
     141        3200 :             ASSERT(bt.size() == 3200 - i);
     142        3200 :             ASSERT( bt.erase_one(rand() % 1000) );
     143        3200 :             ASSERT(bt.size() == 3200 - i - 1);
     144             :         }
     145             : 
     146           1 :         ASSERT( bt.empty() );
     147             : 
     148             :         // copy btree values back to a vector
     149             : 
     150           1 :         std::vector< btree_type::value_type > vector2;
     151           1 :         vector2.assign( bt2.begin(), bt2.end() );
     152             : 
     153             :         // afer sorting the vector, the two must be the same
     154           1 :         std::sort(vector.begin(), vector.end());
     155             : 
     156           1 :         ASSERT( vector == vector2 );
     157             : 
     158             :         // test reverse iterator
     159           1 :         vector2.clear();
     160           1 :         vector2.assign( bt2.rbegin(), bt2.rend() );
     161             : 
     162           1 :         std::reverse(vector.begin(), vector.end());
     163             : 
     164           1 :         btree_type::reverse_iterator ri = bt2.rbegin();
     165        3201 :         for(unsigned int i = 0; i < vector2.size(); ++i, ++ri)
     166             :         {
     167        3200 :             ASSERT( vector[i].first == vector2[i].first );
     168        3200 :             ASSERT( vector[i].first == ri->first );
     169        3200 :             ASSERT( vector[i].second == ri->second );
     170             :         }
     171             : 
     172           1 :         ASSERT( ri == bt2.rend() );
     173             :     }
     174             : 
     175           1 :     void test_iterator3()
     176             :     {
     177             :         typedef stx::btree_map<unsigned int, unsigned int,
     178             :             std::less<unsigned int>, traits_nodebug<unsigned int> > btree_type;
     179             : 
     180           1 :         btree_type map;
     181             : 
     182           1 :         unsigned int maxnum = 1000;
     183             : 
     184        1001 :         for(unsigned int i = 0; i < maxnum; ++i)
     185             :         {
     186        1000 :             map.insert( std::make_pair(i, i*3) );
     187             :         }
     188             : 
     189             :         { // test iterator prefix++
     190           1 :             unsigned int nownum = 0;
     191             : 
     192        2002 :             for(btree_type::iterator i = map.begin();
     193        1001 :                 i != map.end(); ++i)
     194             :             {
     195        1000 :                 ASSERT( nownum == i->first );
     196        1000 :                 ASSERT( nownum * 3 == i->second );
     197             : 
     198        1000 :                 nownum++;
     199             :             }
     200             : 
     201           1 :             ASSERT(nownum == maxnum);
     202             :         }
     203             : 
     204             :         { // test iterator prefix--
     205           1 :             unsigned int nownum = maxnum;
     206             : 
     207           1 :             btree_type::iterator i;
     208        1000 :             for(i = --map.end(); i != map.begin(); --i)
     209             :             {
     210         999 :                 nownum--;
     211             : 
     212         999 :                 ASSERT( nownum == i->first );
     213         999 :                 ASSERT( nownum * 3 == i->second );
     214             :             }
     215             : 
     216           1 :             nownum--;
     217             : 
     218           1 :             ASSERT( nownum == i->first );
     219           1 :             ASSERT( nownum * 3 == i->second );
     220             : 
     221           1 :             ASSERT(nownum == 0);
     222             :         }
     223             : 
     224             :         { // test const_iterator prefix++
     225           1 :             unsigned int nownum = 0;
     226             : 
     227        2002 :             for(btree_type::const_iterator i = map.begin();
     228        1001 :                 i != map.end(); ++i)
     229             :             {
     230        1000 :                 ASSERT( nownum == i->first );
     231        1000 :                 ASSERT( nownum * 3 == i->second );
     232             : 
     233        1000 :                 nownum++;
     234             :             }
     235             : 
     236           1 :             ASSERT(nownum == maxnum);
     237             :         }
     238             : 
     239             :         { // test const_iterator prefix--
     240           1 :             unsigned int nownum = maxnum;
     241             : 
     242           1 :             btree_type::const_iterator i;
     243        1000 :             for(i = --map.end(); i != map.begin(); --i)
     244             :             {
     245         999 :                 nownum--;
     246             : 
     247         999 :                 ASSERT( nownum == i->first );
     248         999 :                 ASSERT( nownum * 3 == i->second );
     249             :             }
     250             : 
     251           1 :             nownum--;
     252             : 
     253           1 :             ASSERT( nownum == i->first );
     254           1 :             ASSERT( nownum * 3 == i->second );
     255             : 
     256           1 :             ASSERT(nownum == 0);
     257             :         }
     258             : 
     259             :         { // test reverse_iterator prefix++
     260           1 :             unsigned int nownum = maxnum;
     261             : 
     262        2002 :             for(btree_type::reverse_iterator i = map.rbegin();
     263        1001 :                 i != map.rend(); ++i)
     264             :             {
     265        1000 :                 nownum--;
     266             : 
     267        1000 :                 ASSERT( nownum == i->first );
     268        1000 :                 ASSERT( nownum * 3 == i->second );
     269             :             }
     270             : 
     271           1 :             ASSERT(nownum == 0);
     272             :         }
     273             : 
     274             :         { // test reverse_iterator prefix--
     275           1 :             unsigned int nownum = 0;
     276             : 
     277           1 :             btree_type::reverse_iterator i;
     278        1000 :             for(i = --map.rend(); i != map.rbegin(); --i)
     279             :             {
     280         999 :                 ASSERT( nownum == i->first );
     281         999 :                 ASSERT( nownum * 3 == i->second );
     282             : 
     283         999 :                 nownum++;
     284             :             }
     285             : 
     286           1 :             ASSERT( nownum == i->first );
     287           1 :             ASSERT( nownum * 3 == i->second );
     288             : 
     289           1 :             nownum++;
     290             : 
     291           1 :             ASSERT(nownum == maxnum);
     292             :         }
     293             : 
     294             :         { // test const_reverse_iterator prefix++
     295           1 :             unsigned int nownum = maxnum;
     296             : 
     297        2002 :             for(btree_type::const_reverse_iterator i = map.rbegin();
     298        1001 :                 i != map.rend(); ++i)
     299             :             {
     300        1000 :                 nownum--;
     301             : 
     302        1000 :                 ASSERT( nownum == i->first );
     303        1000 :                 ASSERT( nownum * 3 == i->second );
     304             :             }
     305             : 
     306           1 :             ASSERT(nownum == 0);
     307             :         }
     308             : 
     309             :         { // test const_reverse_iterator prefix--
     310           1 :             unsigned int nownum = 0;
     311             : 
     312           1 :             btree_type::const_reverse_iterator i;
     313        1000 :             for(i = --map.rend(); i != map.rbegin(); --i)
     314             :             {
     315         999 :                 ASSERT( nownum == i->first );
     316         999 :                 ASSERT( nownum * 3 == i->second );
     317             : 
     318         999 :                 nownum++;
     319             :             }
     320             : 
     321           1 :             ASSERT( nownum == i->first );
     322           1 :             ASSERT( nownum * 3 == i->second );
     323             : 
     324           1 :             nownum++;
     325             : 
     326           1 :             ASSERT(nownum == maxnum);
     327             :         }
     328             : 
     329             :         // postfix
     330             : 
     331             :         { // test iterator postfix++
     332           1 :             unsigned int nownum = 0;
     333             : 
     334        2002 :             for(btree_type::iterator i = map.begin();
     335        1001 :                 i != map.end(); i++)
     336             :             {
     337        1000 :                 ASSERT( nownum == i->first );
     338        1000 :                 ASSERT( nownum * 3 == i->second );
     339             : 
     340        1000 :                 nownum++;
     341             :             }
     342             : 
     343           1 :             ASSERT(nownum == maxnum);
     344             :         }
     345             : 
     346             :         { // test iterator postfix--
     347           1 :             unsigned int nownum = maxnum;
     348             : 
     349           1 :             btree_type::iterator i;
     350        1000 :             for(i = --map.end(); i != map.begin(); i--)
     351             :             {
     352         999 :                 nownum--;
     353             : 
     354         999 :                 ASSERT( nownum == i->first );
     355         999 :                 ASSERT( nownum * 3 == i->second );
     356             :             }
     357             : 
     358           1 :             nownum--;
     359             : 
     360           1 :             ASSERT( nownum == i->first );
     361           1 :             ASSERT( nownum * 3 == i->second );
     362             : 
     363           1 :             ASSERT(nownum == 0);
     364             :         }
     365             : 
     366             :         { // test const_iterator postfix++
     367           1 :             unsigned int nownum = 0;
     368             : 
     369        2002 :             for(btree_type::const_iterator i = map.begin();
     370        1001 :                 i != map.end(); i++)
     371             :             {
     372        1000 :                 ASSERT( nownum == i->first );
     373        1000 :                 ASSERT( nownum * 3 == i->second );
     374             : 
     375        1000 :                 nownum++;
     376             :             }
     377             : 
     378           1 :             ASSERT(nownum == maxnum);
     379             :         }
     380             : 
     381             :         { // test const_iterator postfix--
     382           1 :             unsigned int nownum = maxnum;
     383             : 
     384           1 :             btree_type::const_iterator i;
     385        1000 :             for(i = --map.end(); i != map.begin(); i--)
     386             :             {
     387         999 :                 nownum--;
     388             : 
     389         999 :                 ASSERT( nownum == i->first );
     390         999 :                 ASSERT( nownum * 3 == i->second );
     391             :             }
     392             : 
     393           1 :             nownum--;
     394             : 
     395           1 :             ASSERT( nownum == i->first );
     396           1 :             ASSERT( nownum * 3 == i->second );
     397             : 
     398           1 :             ASSERT(nownum == 0);
     399             :         }
     400             : 
     401             :         { // test reverse_iterator postfix++
     402           1 :             unsigned int nownum = maxnum;
     403             : 
     404        2002 :             for(btree_type::reverse_iterator i = map.rbegin();
     405        1001 :                 i != map.rend(); i++)
     406             :             {
     407        1000 :                 nownum--;
     408             : 
     409        1000 :                 ASSERT( nownum == i->first );
     410        1000 :                 ASSERT( nownum * 3 == i->second );
     411             :             }
     412             : 
     413           1 :             ASSERT(nownum == 0);
     414             :         }
     415             : 
     416             :         { // test reverse_iterator postfix--
     417           1 :             unsigned int nownum = 0;
     418             : 
     419           1 :             btree_type::reverse_iterator i;
     420        1000 :             for(i = --map.rend(); i != map.rbegin(); i--)
     421             :             {
     422         999 :                 ASSERT( nownum == i->first );
     423         999 :                 ASSERT( nownum * 3 == i->second );
     424             : 
     425         999 :                 nownum++;
     426             :             }
     427             : 
     428           1 :             ASSERT( nownum == i->first );
     429           1 :             ASSERT( nownum * 3 == i->second );
     430             : 
     431           1 :             nownum++;
     432             : 
     433           1 :             ASSERT(nownum == maxnum);
     434             :         }
     435             : 
     436             :         { // test const_reverse_iterator postfix++
     437           1 :             unsigned int nownum = maxnum;
     438             : 
     439        2002 :             for(btree_type::const_reverse_iterator i = map.rbegin();
     440        1001 :                 i != map.rend(); i++)
     441             :             {
     442        1000 :                 nownum--;
     443             : 
     444        1000 :                 ASSERT( nownum == i->first );
     445        1000 :                 ASSERT( nownum * 3 == i->second );
     446             :             }
     447             : 
     448           1 :             ASSERT(nownum == 0);
     449             :         }
     450             : 
     451             :         { // test const_reverse_iterator postfix--
     452           1 :             unsigned int nownum = 0;
     453             : 
     454           1 :             btree_type::const_reverse_iterator i;
     455        1000 :             for(i = --map.rend(); i != map.rbegin(); i--)
     456             :             {
     457         999 :                 ASSERT( nownum == i->first );
     458         999 :                 ASSERT( nownum * 3 == i->second );
     459             : 
     460         999 :                 nownum++;
     461             :             }
     462             : 
     463           1 :             ASSERT( nownum == i->first );
     464           1 :             ASSERT( nownum * 3 == i->second );
     465             : 
     466           1 :             nownum++;
     467             : 
     468           1 :             ASSERT(nownum == maxnum);
     469           1 :         }
     470             :     }
     471             : 
     472           1 :     void test_iterator4()
     473             :     {
     474             :         typedef stx::btree_set<unsigned int,
     475             :             std::less<unsigned int>, traits_nodebug<unsigned int> > btree_type;
     476             : 
     477           1 :         btree_type set;
     478             : 
     479           1 :         unsigned int maxnum = 1000;
     480             : 
     481        1001 :         for(unsigned int i = 0; i < maxnum; ++i)
     482             :         {
     483        1000 :             set.insert(i);
     484             :         }
     485             : 
     486             :         { // test iterator prefix++
     487           1 :             unsigned int nownum = 0;
     488             : 
     489        2002 :             for(btree_type::iterator i = set.begin();
     490        1001 :                 i != set.end(); ++i)
     491             :             {
     492        1000 :                 ASSERT( nownum == *i );
     493        1000 :                 nownum++;
     494             :             }
     495             : 
     496           1 :             ASSERT(nownum == maxnum);
     497             :         }
     498             : 
     499             :         { // test iterator prefix--
     500           1 :             unsigned int nownum = maxnum;
     501             : 
     502           1 :             btree_type::iterator i;
     503        1000 :             for(i = --set.end(); i != set.begin(); --i)
     504             :             {
     505         999 :                 ASSERT( --nownum == *i );
     506             :             }
     507             : 
     508           1 :             ASSERT( --nownum == *i );
     509             : 
     510           1 :             ASSERT(nownum == 0);
     511             :         }
     512             : 
     513             :         { // test const_iterator prefix++
     514           1 :             unsigned int nownum = 0;
     515             : 
     516        2002 :             for(btree_type::const_iterator i = set.begin();
     517        1001 :                 i != set.end(); ++i)
     518             :             {
     519        1000 :                 ASSERT( nownum++ == *i );
     520             :             }
     521             : 
     522           1 :             ASSERT(nownum == maxnum);
     523             :         }
     524             : 
     525             :         { // test const_iterator prefix--
     526           1 :             unsigned int nownum = maxnum;
     527             : 
     528           1 :             btree_type::const_iterator i;
     529        1000 :             for(i = --set.end(); i != set.begin(); --i)
     530             :             {
     531         999 :                 ASSERT( --nownum == *i );
     532             :             }
     533             : 
     534           1 :             ASSERT( --nownum == *i );
     535             : 
     536           1 :             ASSERT(nownum == 0);
     537             :         }
     538             : 
     539             :         { // test reverse_iterator prefix++
     540           1 :             unsigned int nownum = maxnum;
     541             : 
     542        2002 :             for(btree_type::reverse_iterator i = set.rbegin();
     543        1001 :                 i != set.rend(); ++i)
     544             :             {
     545        1000 :                 ASSERT( --nownum == *i );
     546             :             }
     547             : 
     548           1 :             ASSERT(nownum == 0);
     549             :         }
     550             : 
     551             :         { // test reverse_iterator prefix--
     552           1 :             unsigned int nownum = 0;
     553             : 
     554           1 :             btree_type::reverse_iterator i;
     555        1000 :             for(i = --set.rend(); i != set.rbegin(); --i)
     556             :             {
     557         999 :                 ASSERT( nownum++ == *i );
     558             :             }
     559             : 
     560           1 :             ASSERT( nownum++ == *i );
     561             : 
     562           1 :             ASSERT(nownum == maxnum);
     563             :         }
     564             : 
     565             :         { // test const_reverse_iterator prefix++
     566           1 :             unsigned int nownum = maxnum;
     567             : 
     568        2002 :             for(btree_type::const_reverse_iterator i = set.rbegin();
     569        1001 :                 i != set.rend(); ++i)
     570             :             {
     571        1000 :                 ASSERT( --nownum == *i );
     572             :             }
     573             : 
     574           1 :             ASSERT(nownum == 0);
     575             :         }
     576             : 
     577             :         { // test const_reverse_iterator prefix--
     578           1 :             unsigned int nownum = 0;
     579             : 
     580           1 :             btree_type::const_reverse_iterator i;
     581        1000 :             for(i = --set.rend(); i != set.rbegin(); --i)
     582             :             {
     583         999 :                 ASSERT( nownum++ == *i );
     584             :             }
     585             : 
     586           1 :             ASSERT( nownum++ == *i );
     587             : 
     588           1 :             ASSERT(nownum == maxnum);
     589             :         }
     590             : 
     591             :         // postfix
     592             : 
     593             :         { // test iterator postfix++
     594           1 :             unsigned int nownum = 0;
     595             : 
     596        2002 :             for(btree_type::iterator i = set.begin();
     597        1001 :                 i != set.end(); i++)
     598             :             {
     599        1000 :                 ASSERT( nownum++ == *i );
     600             :             }
     601             : 
     602           1 :             ASSERT(nownum == maxnum);
     603             :         }
     604             : 
     605             :         { // test iterator postfix--
     606           1 :             unsigned int nownum = maxnum;
     607             : 
     608           1 :             btree_type::iterator i;
     609        1000 :             for(i = --set.end(); i != set.begin(); i--)
     610             :             {
     611             : 
     612         999 :                 ASSERT( --nownum == *i );
     613             :             }
     614             : 
     615           1 :             ASSERT( --nownum == *i );
     616             : 
     617           1 :             ASSERT(nownum == 0);
     618             :         }
     619             : 
     620             :         { // test const_iterator postfix++
     621           1 :             unsigned int nownum = 0;
     622             : 
     623        2002 :             for(btree_type::const_iterator i = set.begin();
     624        1001 :                 i != set.end(); i++)
     625             :             {
     626        1000 :                 ASSERT( nownum++ == *i );
     627             :             }
     628             : 
     629           1 :             ASSERT(nownum == maxnum);
     630             :         }
     631             : 
     632             :         { // test const_iterator postfix--
     633           1 :             unsigned int nownum = maxnum;
     634             : 
     635           1 :             btree_type::const_iterator i;
     636        1000 :             for(i = --set.end(); i != set.begin(); i--)
     637             :             {
     638         999 :                 ASSERT( --nownum == *i );
     639             :             }
     640             : 
     641           1 :             ASSERT( --nownum == *i );
     642             : 
     643           1 :             ASSERT(nownum == 0);
     644             :         }
     645             : 
     646             :         { // test reverse_iterator postfix++
     647           1 :             unsigned int nownum = maxnum;
     648             : 
     649        2002 :             for(btree_type::reverse_iterator i = set.rbegin();
     650        1001 :                 i != set.rend(); i++)
     651             :             {
     652        1000 :                 ASSERT( --nownum == *i );
     653             :             }
     654             : 
     655           1 :             ASSERT(nownum == 0);
     656             :         }
     657             : 
     658             :         { // test reverse_iterator postfix--
     659           1 :             unsigned int nownum = 0;
     660             : 
     661           1 :             btree_type::reverse_iterator i;
     662        1000 :             for(i = --set.rend(); i != set.rbegin(); i--)
     663             :             {
     664         999 :                 ASSERT( nownum++ == *i );
     665             :             }
     666             : 
     667           1 :             ASSERT( nownum++ == *i );
     668             : 
     669           1 :             ASSERT(nownum == maxnum);
     670             :         }
     671             : 
     672             :         { // test const_reverse_iterator postfix++
     673           1 :             unsigned int nownum = maxnum;
     674             : 
     675        2002 :             for(btree_type::const_reverse_iterator i = set.rbegin();
     676        1001 :                 i != set.rend(); i++)
     677             :             {
     678        1000 :                 ASSERT( --nownum == *i );
     679             :             }
     680             : 
     681           1 :             ASSERT(nownum == 0);
     682             :         }
     683             : 
     684             :         { // test const_reverse_iterator postfix--
     685           1 :             unsigned int nownum = 0;
     686             : 
     687           1 :             btree_type::const_reverse_iterator i;
     688        1000 :             for(i = --set.rend(); i != set.rbegin(); i--)
     689             :             {
     690         999 :                 ASSERT( nownum++ == *i );
     691             :             }
     692             : 
     693           1 :             ASSERT( nownum++ == *i );
     694             : 
     695           1 :             ASSERT(nownum == maxnum);
     696           1 :         }
     697             :     }
     698             : 
     699           1 :     void test_iterator5()
     700             :     {
     701             :         typedef stx::btree_set<unsigned int,
     702             :             std::less<unsigned int>, traits_nodebug<unsigned int> > btree_type;
     703             : 
     704           1 :         btree_type set;
     705             : 
     706           1 :         unsigned int maxnum = 100;
     707             : 
     708         101 :         for(unsigned int i = 0; i < maxnum; ++i)
     709             :         {
     710         100 :             set.insert(i);
     711             :         }
     712             : 
     713             :         {
     714           1 :             btree_type::iterator it;
     715             : 
     716           1 :             it = set.begin();
     717           1 :             it--;
     718           1 :             ASSERT( it == set.begin() );
     719             : 
     720           1 :             it = set.begin();
     721           1 :             --it;
     722           1 :             ASSERT( it == set.begin() );
     723             : 
     724           1 :             it = set.end();
     725           1 :             it++;
     726           1 :             ASSERT( it == set.end() );
     727             : 
     728           1 :             it = set.end();
     729           1 :             ++it;
     730           1 :             ASSERT( it == set.end() );
     731             :         }
     732             : 
     733             :         {
     734           1 :             btree_type::const_iterator it;
     735             : 
     736           1 :             it = set.begin();
     737           1 :             it--;
     738           1 :             ASSERT( it == set.begin() );
     739             : 
     740           1 :             it = set.begin();
     741           1 :             --it;
     742           1 :             ASSERT( it == set.begin() );
     743             : 
     744           1 :             it = set.end();
     745           1 :             it++;
     746           1 :             ASSERT( it == set.end() );
     747             : 
     748           1 :             it = set.end();
     749           1 :             ++it;
     750           1 :             ASSERT( it == set.end() );
     751             :         }
     752             : 
     753             :         {
     754           1 :             btree_type::reverse_iterator it;
     755             : 
     756           1 :             it = set.rbegin();
     757           1 :             it--;
     758           1 :             ASSERT( it == set.rbegin() );
     759             : 
     760           1 :             it = set.rbegin();
     761           1 :             --it;
     762           1 :             ASSERT( it == set.rbegin() );
     763             : 
     764           1 :             it = set.rend();
     765           1 :             it++;
     766           1 :             ASSERT( it == set.rend() );
     767             : 
     768           1 :             it = set.rend();
     769           1 :             ++it;
     770           1 :             ASSERT( it == set.rend() );
     771             :         }
     772             : 
     773             :         {
     774           1 :             btree_type::const_reverse_iterator it;
     775             : 
     776           1 :             it = set.rbegin();
     777           1 :             it--;
     778           1 :             ASSERT( it == set.rbegin() );
     779             : 
     780           1 :             it = set.rbegin();
     781           1 :             --it;
     782           1 :             ASSERT( it == set.rbegin() );
     783             : 
     784           1 :             it = set.rend();
     785           1 :             it++;
     786           1 :             ASSERT( it == set.rend() );
     787             : 
     788           1 :             it = set.rend();
     789           1 :             ++it;
     790           1 :             ASSERT( it == set.rend() );
     791           1 :         }
     792             :     }
     793             : 
     794           1 :     void test_erase_iterator1()
     795             :     {
     796             :         typedef stx::btree_multimap<int, int,
     797             :             std::less<int>, traits_nodebug<unsigned int> > btree_type;
     798             : 
     799           1 :         btree_type map;
     800             : 
     801           1 :         const int size1 = 32; 
     802           1 :         const int size2 = 256; 
     803             : 
     804          33 :         for (int i = 0; i < size1; ++i)
     805             :         {
     806        8224 :             for (int j = 0; j < size2; ++j)
     807             :             {
     808        8192 :                 map.insert2(i,j);
     809             :             }
     810             :         }
     811             : 
     812           1 :         ASSERT( map.size() == size1 * size2 );
     813             : 
     814             :         // erase in reverse order. that should be the worst case for
     815             :         // erase_iter()
     816             : 
     817          33 :         for (int i = size1-1; i >= 0; --i)
     818             :         {
     819        8224 :             for (int j = size2-1; j >= 0; --j)
     820             :             {
     821             :                 // find iterator
     822        8192 :                 btree_type::iterator it = map.find(i);
     823             :                 
     824       16384 :                 while (it != map.end() && it.key() == i && it.data() != j)
     825           0 :                     ++it;
     826             : 
     827        8192 :                 ASSERT( it.key() == i );
     828        8192 :                 ASSERT( it.data() == j );
     829             : 
     830        8192 :                 unsigned int mapsize = map.size();
     831        8192 :                 map.erase(it);
     832        8192 :                 ASSERT( map.size() == mapsize - 1 );
     833             :             }
     834             :         }
     835             : 
     836           1 :         ASSERT( map.size() == 0 );
     837             :     }
     838             : 
     839           3 : } __IteratorTest;

Generated by: LCOV version 1.10