Example #1
0
int
main(int argc, char *argv[])
{
    // Dictionary of possible tests
    testDictionary.insert("sage",               run_sage);
    testDictionary.insert("sawyer",             run_sawyer);
    testDictionary.insert("sawyer-pool",        run_sawyer_pool);
    testDictionary.insert("sawyer-bgl",         run_sawyer_bgl);
    testDictionary.insert("sawyer-bgl-pool",    run_sawyer_bgl_pool);
    testDictionary.insert("bgl-vec-vec",        run_bgl_vec_vec);
    testDictionary.insert("bgl-vec-list",       run_bgl_vec_list);
    testDictionary.insert("bgl-vec-set",        run_bgl_vec_set);
    testDictionary.insert("yagi",               run_yagi);
    testDictionary.insert("yagi-bidir",         run_yagi_bidir);
    testDictionary.insert("yagi-bgl",           run_yagi_bgl);
    testDictionary.insert("yagi-bgl-bidir",     run_yagi_bgl_bidir);
    testDictionary.insert("sage-inc",           run_sage_inc);
    testDictionary.insert("sage-inc-bidir",     run_sage_inc_bidir);

    // Parse command-line
    using Sawyer::CommandLine::Switch;
    Sawyer::CommandLine::SwitchGroup switches;
    switches.insert(Switch("help", 'h')
                    .action(userAction(showHelpAndExit))
                    .doc("Shows this documentation."));
    switches.insert(Switch("iterations", 'N')
                    .argument("n", Sawyer::CommandLine::integerParser(nruns))
                    .doc("Run the tests @v{N} times each."));
    switches.insert(Switch("list", 'L')
                    .action(userAction(listTestsAndExit))
                    .doc("List the available tests and exit."));
    Sawyer::CommandLine::Parser parser;
    parser.with(switches);
    parser.purpose("tests performance of various graph implementations");
    parser.doc("Synopsis", "@prop{programName} [@v{switches}...] @v{test_names}...");
    Sawyer::CommandLine::ParserResult cmdline = parser.parse(argc, argv).apply();

    // Run each specified test
    BOOST_FOREACH (const std::string &testName, cmdline.unreachedArgs()) {
        if (testName == "all") {
            BOOST_FOREACH (void(*func)(), testDictionary.values())
                func();
        } else if (void(*func)() = testDictionary.getOrElse(testName, NULL)) {
            func();
        } else {
            std::cerr <<"unknown graph type: " <<testName <<"\n"
                      <<"use --list to see a list of types\n";
        }
    }

    return 0;
}
void
CommandlineProcessing::insertBooleanSwitch(Sawyer::CommandLine::SwitchGroup &sg, const std::string &switchName,
                                           bool &storageLocation, const std::string &documentation) {
    using namespace Sawyer::CommandLine;

    ASSERT_forbid2(boost::starts_with(switchName, "-"), "specify only the name, not the prefix");

    std::string defaults = " This can be disabled with @s{no-" + switchName + "}. The default is " +
                           (storageLocation ? "yes" : "no") + ".";

    sg.insert(Switch(switchName)
              .intrinsicValue(true, storageLocation)
              .doc(documentation + defaults));
    sg.insert(Switch("no-"+switchName)
              .key(switchName)
              .intrinsicValue(false, storageLocation)
              .hidden(true));
}
Example #3
0
int main(int argc, char *argv[]) {

    size_t nverts = 1000;                               // number of vertices to insert
    bool skipEdges = false;                             // if true, then skip the step that inserts edges
    
    // Parse command-line
    using Sawyer::CommandLine::Switch;
    Sawyer::CommandLine::SwitchGroup switches;
    switches.insert(Switch("help", 'h')
                    .action(userAction(showHelpAndExit))
                    .doc("Shows this documentation."));
    switches.insert(Switch("nverts", 'v')
                    .argument("n", Sawyer::CommandLine::integerParser(nverts))
                    .doc("Populate the graph with @v{n} vertices. The default is " + lexical_cast<string>(nverts) + "."));
    switches.insert(Switch("no-edges")
                    .intrinsicValue(true, skipEdges)
                    .doc("Do not add edges to the graph.  The default, when this switch is not present, is to add a "
                         "directed edge from vertex i to vertex j for all i<j."));
    Sawyer::CommandLine::Parser parser;
    parser.with(switches);
    parser.purpose("tests vertex and edge insertion for Sage vs. Sawyer graphs");
    parser.doc("Synopsis", "@prop{programName} [@v{switches}...] sage|sawyer...");
    Sawyer::CommandLine::ParserResult cmdline = parser.parse(argc, argv).apply();

    if (cmdline.unparsedArgs().size() != 1) {
        std::cerr <<"incorrect usage; see --help\n";
        exit(1);
    }
    bool use_sage = 0==cmdline.unparsedArgs().front().compare("sage");
    
    if (use_sage) {
        print_sage_graph_info();
        test_sage_graph(nverts, skipEdges);
    } else {
        print_sawyer_graph_info();
        test_sawyer_graph(nverts, skipEdges);
    }

    return 0;
}