main.cpp

来自「stl的源码」· C++ 代码 · 共 408 行

CPP
408
字号
/***********************************************************************************  Main.cpp * Copyright (c) 1997 * Mark of the Unicorn, Inc. * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation.  Mark of the Unicorn makes no * representations about the suitability of this software for any * purpose.  It is provided "as is" without express or implied warranty. * Copyright (c) 1997 * Moscow Center for SPARC Technology * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation.  Moscow Center for SPARC Technology makesno * representations about the suitability of this software for any * purpose.  It is provided "as is" without express or implied warranty.***********************************************************************************/#include "Prefix.h"#include "Tests.h"#if defined (EH_NEW_IOSTREAMS)# include <iostream># else# include <iostream.h>#endif#if defined(macintosh)&&(!defined(__MRC__) && !defined(__SC__)) || defined (_MAC) && defined(__MWERKS__)# include <console.h># include <Types.h># include <Strings.h># ifdef EH_NEW_HEADERS#  include <cstdio>#  include <cstring>#  include <cassert># else#  include <stdio.h>#  include <string.h>#  include <assert.h># endif# if defined (_STL_DEBUG)#  if defined ( EH_USE_SGI_STL )// Override assertion behavior#  include <cstdarg>//#  include <stldebug.h>void STLPORT::__stl_debug_message(const char * format_str, ...){  std::va_list args;  va_start( args, format_str );  char msg[256];  std::vsnprintf(msg, sizeof(msg)/sizeof(*msg) - 1, format_str, args );  DebugStr( c2pstr(msg) );}#  else/*===================================================================================  __assertion_failed  (override standard library function)  EFFECTS: Breaks into the debugger and shows the assertion. This implementation           is Mac-specific; others could be added for other platforms.====================================================================================*/extern "C"{  void __assertion_failed(char *condition, char *testfilename, int lineno);  void __assertion_failed(char *condition, char *testfilename, int lineno)  {      char msg[256];      std::strncpy( msg, condition, 255 );      std::strncat( msg, ": ", 255 );      std::strncat(  msg, testfilename, 255 );      std::strncat( msg, ", ", 255 );      char line[20];      std::sprintf( line, "%d", lineno );      std::strncat(  msg, line, 255 );      DebugStr( c2pstr( msg ) );  }}#  endif# endif#endif#include "nc_alloc.h"#if defined (EH_NEW_HEADERS)# include <vector># include <cstring># else# include <vector.h># include <string.h>#endif#include "TestClass.h"#include "LeakCheck.h"#include "test_construct.h"#ifdef __BORLANDC__# include <except.h>#endif# if defined(EH_USE_NAMESPACES)namespace  // dwa 1/21/00 - must use unnamed namespace here to avoid conflict under gcc using native streams{  using namespace std;  // using std::cerr;  // using std::endl;}# endif/*===================================================================================  usage  (file-static helper)  EFFECTS: Prints a message describing the command-line parameters====================================================================================*/static void usage(const char* name){    cerr<<"Usage : "<<name<<" [-n <iterations>] [-s <size>] [-l] [-e] [-q]/[-v] [-t] [test_name...]\n";    cerr<<"\t[-n <iterations>] : number of test iterations, default==100;"<<endl;    cerr<<"\t[-s <size>] : base value for random container sizes, default==1000;"<<endl;    cerr<<"\t[-e] : don't throw exceptions, test for leak in normal conditions;"<<endl;// This option was never actually used -- dwa 9/22/97//    cerr<<"\t[-i] : ignore leak errors;"<<endl;    cerr<<"\t[-q] : quiet mode;"<<endl;    cerr<<"\t[-v] : verbose mode;"<<endl;    cerr<<"\t[-t] : track each allocation;"<<endl;    cerr<<"\t[test name [test name...]] : run only some of the tests by name (default==all tests):"<<endl;    cerr<<"\t\tpossible test names are : algo vector bit_vector list slist deque set map hash_set hash_map rope string bitset valarray"<<endl;    EH_CSTD::exit(1);}#ifdef EH_NEW_HEADERS#  include <set>#else#  include <set.h>#endif#if defined(_WIN32_WCE)#include <fstream>#endifint _STLP_CALL main(int argc, char** argv){#if defined(_WIN32_WCE)  std::ofstream file( "\\eh_test.txt" );  std::streambuf* old_cout_buf = cout.rdbuf(file.rdbuf());  std::streambuf* old_cerr_buf = cerr.rdbuf(file.rdbuf());#endif#if defined( __MWERKS__ ) && defined( macintosh )  // Get command line.  argc = ccommand(&argv);  // Allow the i/o window to be repositioned.//  EH_STD::string s;//  getline(EH_STD::cin, s);#endif    unsigned int niters=2;    bool run_all=true;    bool run_slist = false;    bool run_list = false;    bool run_vector = false;    bool run_bit_vector = false;    bool run_deque = false;    bool run_hash_map = false;    bool run_hash_set = false;    bool run_set = false;    bool run_map = false;    bool run_algo = false;    bool run_algobase = false;    bool run_rope = false;    bool run_string = false;    bool run_bitset = false;    bool run_valarray = false;    int cur_argv;    char *p, *p1;#if defined (EH_NEW_IOSTREAMS)    std::ios_base::sync_with_stdio(false);#endif    cerr << argv[0]<<" : Exception handling testsuite.\n";    cerr.flush();  bool track_allocations = false;    // parse parameters :    // leak_test [-iterations] [-test] ...    for (cur_argv=1; cur_argv<argc; cur_argv++) {        p = argv[cur_argv];        if (*p == '-') {            switch (p[1]) {            case 'q':                gTestController.SetVerbose(false);                break;            case 'v':                gTestController.SetVerbose(true);                break;#if 0  // This option was never actually used -- dwa 9/22/97            case 'i':                gTestController.IgnoreLeaks(true);                break;#endif            case 'n':                p1 = argv[++cur_argv];                if (p1 && EH_CSTD::sscanf(p1, "%i", &niters)==1)                    cerr <<" Doing "<<niters<<" iterations\n";                else                    usage(argv[0]);                break;            case 't':              track_allocations = true;              break;            case 'e':                gTestController.TurnOffExceptions();                break;            case 's':                p1 = argv[++cur_argv];                if (p1 && EH_CSTD::sscanf(p1, "%i", &random_base)==1)                    cerr <<" Setting  "<<random_base<<" as base for random sizes.\n";                else                    usage(argv[0]);                break;            default:                usage(argv[0]);                break;            }        } else {            run_all = false;            // test name            if (EH_CSTD::strcmp(p, "algo")==0) {                run_algo=true;            } else if (EH_CSTD::strcmp(p, "vector")==0) {                run_vector=true;            } else if (EH_CSTD::strcmp(p, "bit_vector")==0) {                run_bit_vector=true;            } else if (EH_CSTD::strcmp(p, "list")==0) {                run_list=true;            } else if (EH_CSTD::strcmp(p, "slist")==0) {                run_slist=true;            } else if (EH_CSTD::strcmp(p, "deque")==0) {                run_deque=true;            } else if (EH_CSTD::strcmp(p, "set")==0) {                run_set=true;            } else if (EH_CSTD::strcmp(p, "map")==0) {                run_map=true;            } else if (EH_CSTD::strcmp(p, "hash_set")==0) {                run_hash_set=true;            } else if (EH_CSTD::strcmp(p, "hash_map")==0) {                run_hash_map=true;            } else if (EH_CSTD::strcmp(p, "rope")==0) {                run_rope=true;            } else if (EH_CSTD::strcmp(p, "string")==0) {                run_string=true;            } else if (EH_CSTD::strcmp(p, "bitset")==0) {                run_bitset=true;            } else if (EH_CSTD::strcmp(p, "valarray")==0) {                run_valarray=true;            } else {                usage(argv[0]);            }        }    }  gTestController.TrackAllocations( track_allocations );    // Over and over...    for ( unsigned i = 0; i < niters ; i++ )    {     cerr << "iteration #" << i << "\n";        if (run_all || run_algobase) {            gTestController.SetCurrentContainer("algobase");            cerr << "EH test : algobase" << endl;            test_algobase();        }        if (run_all || run_algo) {            gTestController.SetCurrentContainer("algo");            cerr << "EH test : algo" << endl;            test_algo();        }        if (run_all || run_vector) {            gTestController.SetCurrentContainer("vector");            cerr << "EH test : vector" << endl;            test_vector();        }#if defined( EH_BIT_VECTOR_IMPLEMENTED )        if (run_all || run_bit_vector) {            gTestController.SetCurrentContainer("bit_vector");           cerr << "EH test : bit_vector" << endl;            test_bit_vector();        }#endif        if (run_all || run_list) {            gTestController.SetCurrentContainer("list");            cerr << "EH test : list" << endl;            test_list();        }#if defined( EH_SLIST_IMPLEMENTED )        if (run_all || run_slist) {            gTestController.SetCurrentContainer("slist");            cerr << "EH test : slist" << endl;            test_slist();        }#endif // EH_SLIST_IMPLEMENTED        if (run_all || run_deque) {            gTestController.SetCurrentContainer("deque");            cerr << "EH test : deque" << endl;            test_deque();        }        if (run_all || run_set) {            gTestController.SetCurrentContainer("set");            cerr << "EH test : set" << endl;            test_set();            gTestController.SetCurrentContainer("multiset");            cerr << "EH test : multiset" << endl;            test_multiset();        }        if (run_all || run_map) {            gTestController.SetCurrentContainer("map");            cerr << "EH test : map" << endl;            test_map();            gTestController.SetCurrentContainer("multimap");            cerr << "EH test : multimap" << endl;            test_multimap();        }#if defined( EH_HASHED_CONTAINERS_IMPLEMENTED )        if (run_all || run_hash_map) {            gTestController.SetCurrentContainer("hash_map");            cerr << "EH test : hash_map" << endl;            test_hash_map();            gTestController.SetCurrentContainer("hash_multimap");            cerr << "EH test : hash_multimap" << endl;            test_hash_multimap();        }        if (run_all || run_hash_set) {            gTestController.SetCurrentContainer("hash_set");            cerr << "EH test : hash_set" << endl;            test_hash_set();            gTestController.SetCurrentContainer("hash_multiset");            cerr << "EH test : hash_multiset" << endl;            test_hash_multiset();        }#endif // EH_HASHED_CONTAINERS_IMPLEMENTED#if defined( EH_ROPE_IMPLEMENTED )  // CW1.8 can't compile this for some reason!#if !( defined(__MWERKS__) && __MWERKS__ < 0x1900 )        if (run_all || run_rope) {            gTestController.SetCurrentContainer("rope");            cerr << "EH test : rope" << endl;            test_rope();        }#endif#endif // EH_ROPE_IMPLEMENTED#if defined( EH_STRING_IMPLEMENTED )        if (run_all || run_string) {            gTestController.SetCurrentContainer("string");            cerr << "EH test : string" << endl;            test_string();        }#endif#if defined( EH_BITSET_IMPLEMENTED )        if (run_all || run_bitset) {            gTestController.SetCurrentContainer("bitset");            cerr << "EH test : bitset" << endl;            test_bitset();        }#endif#if defined( EH_VALARRAY_IMPLEMENTED )        if (run_all || run_bitset) {            gTestController.SetCurrentContainer("valarray");            cerr << "EH test : valarray" << endl;            test_valarray();        }#endif    }  gTestController.TrackAllocations( false );  cerr << "EH test : Done\n";#if defined(_WIN32_WCE)  cout.rdbuf(old_cout_buf);  cerr.rdbuf(old_cerr_buf);  file.close();#endif  return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?