mirror of https://github.com/CGAL/cgal
486 lines
13 KiB
C++
486 lines
13 KiB
C++
// Copyright (c) 1997 Tel-Aviv University (Israel).
|
|
// All rights reserved.
|
|
//
|
|
// This file is part of CGAL (www.cgal.org); you may redistribute it under
|
|
// the terms of the Q Public License version 1.0.
|
|
// See the file LICENSE.QPL distributed with CGAL.
|
|
//
|
|
// Licensees holding a valid commercial license may use this file in
|
|
// accordance with the commercial license agreement provided with the software.
|
|
//
|
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
//
|
|
// $URL$
|
|
// $Id$
|
|
//
|
|
//
|
|
// Author(s) : Efi Fogel <efif@post.tau.ac.il>
|
|
#ifndef BENCH_PARSE_ARGS_H
|
|
#define BENCH_PARSE_ARGS_H
|
|
|
|
#include <stdlib.h>
|
|
#include <string>
|
|
#include <iostream>
|
|
#include "getopt.h"
|
|
#include "CGAL/Dir_search.h"
|
|
|
|
CGAL_BEGIN_NAMESPACE
|
|
|
|
/*!
|
|
*/
|
|
class Bench_parse_args {
|
|
public:
|
|
/*!
|
|
*/
|
|
enum IOId {
|
|
IO_FORMAT = 0,
|
|
IO_F
|
|
};
|
|
|
|
/*!
|
|
*/
|
|
enum FormatId {
|
|
FORMAT_RAT = 0,
|
|
FORMAT_INT,
|
|
FORMAT_FLT,
|
|
FORMAT_R,
|
|
FORMAT_I,
|
|
FORMAT_F
|
|
};
|
|
|
|
/*!
|
|
*/
|
|
enum BenchId {
|
|
BENCH_TYPE_NAME = 0,
|
|
BENCH_TYPE_MASK,
|
|
BENCH_STRATEGY_NAME,
|
|
BENCH_STRATEGY_MASK,
|
|
BENCH_HEADER,
|
|
BENCH_NAME_LENGTH,
|
|
BENCH_TN,
|
|
BENCH_TM,
|
|
BENCH_SN,
|
|
BENCH_SM,
|
|
BENCH_H,
|
|
BENCH_NL
|
|
};
|
|
|
|
/*!
|
|
*/
|
|
enum TypeId {
|
|
TYPE_INCREMENT = 0,
|
|
TYPE_AGGREGATE,
|
|
TYPE_DISPLAY,
|
|
TYPE_POINT_LOCATION,
|
|
TYPE_SUBCURVES,
|
|
TYPE_POINTS,
|
|
TYPE_I,
|
|
TYPE_A,
|
|
TYPE_D,
|
|
TYPE_L,
|
|
TYPE_C,
|
|
TYPE_P
|
|
};
|
|
|
|
/*!
|
|
*/
|
|
enum StrategyId {
|
|
STRATEGY_TRAPEZOIDAL = 0,
|
|
STRATEGY_NAIVE,
|
|
STRATEGY_WALK,
|
|
STRATEGY_SIMPLE,
|
|
STRATEGY_TRIANGLE,
|
|
STRATEGY_LANDMARKS,
|
|
STRATEGY_DUMMY,
|
|
STRATEGY_T,
|
|
STRATEGY_N,
|
|
STRATEGY_W,
|
|
STRATEGY_S,
|
|
STRATEGY_G,
|
|
STRATEGY_L,
|
|
STRATEGY_D
|
|
};
|
|
|
|
/*!
|
|
*/
|
|
enum BoolId {
|
|
BOOL_TRUE = 0,
|
|
BOOL_FALSE,
|
|
BOOL_T,
|
|
BOOL_F
|
|
};
|
|
|
|
enum MaxFilesNumber {
|
|
MAX_FILES_NUMBER = 20
|
|
};
|
|
|
|
public:
|
|
Bench_parse_args(int argc, char * argv[]) :
|
|
m_argc(argc), m_argv(argv),
|
|
m_verbose(false),
|
|
m_postscript(false),
|
|
m_type_mask(0xffffffff), m_strategy_mask(0xffffffff),
|
|
m_input_format(FORMAT_RAT),
|
|
m_print_header(true), m_files_number(0),
|
|
m_name_length(32), m_seconds(1),
|
|
m_samples(0),
|
|
#if (defined _MSC_VER)
|
|
m_iterations(10)
|
|
#else
|
|
m_iterations(0)
|
|
#endif
|
|
{
|
|
m_prog_name = strrchr(argv[0], '\\');
|
|
m_prog_name = (m_prog_name) ? m_prog_name+1 : argv[0];
|
|
|
|
m_dirs.add(".");
|
|
const char * root = getenv("ROOT");
|
|
if (root) m_dirs.add(std::string(root) + "/data/Segments_2");
|
|
if (root) m_dirs.add(std::string(root) + "/data/Conics_2");
|
|
if (root) m_dirs.add(std::string(root) + "/data/Polylines_2");
|
|
|
|
for (int j=0; j<MAX_FILES_NUMBER; j++) {
|
|
m_filename[j] = 0;
|
|
}
|
|
}
|
|
|
|
/*!
|
|
*/
|
|
unsigned int get_type_mask() const { return m_type_mask; }
|
|
unsigned int get_strategy_mask() const { return m_strategy_mask; }
|
|
bool get_verbose() const { return m_verbose; }
|
|
bool get_postscript() const { return m_postscript; }
|
|
FormatId get_input_format() const { return m_input_format; }
|
|
int get_samples() const { return m_samples; }
|
|
int get_iterations() const { return m_iterations; }
|
|
int get_seconds() const { return m_seconds; }
|
|
int get_files_number() const { return m_files_number; }
|
|
bool get_print_header()const { return m_print_header; }
|
|
int get_name_length()const { return m_name_length; }
|
|
const char * get_type_name(TypeId id) const { return s_type_opts[id]; }
|
|
const char * get_strategy_name(StrategyId id) const
|
|
{ return s_strategy_opts[id]; }
|
|
|
|
const char * get_full_name(int file_index = 0) const
|
|
{
|
|
if (file_index >= MAX_FILES_NUMBER) {
|
|
std::cerr << "too large file index" << std::endl;
|
|
return NULL;
|
|
}
|
|
return m_fullname[file_index].c_str();
|
|
}
|
|
/*!
|
|
*/
|
|
const char * get_file_name(int file_index = 0) const
|
|
{
|
|
if ((file_index >= MAX_FILES_NUMBER) ||
|
|
(!m_filename[file_index])) {
|
|
std::cerr << "Data file missing!" << std::endl;
|
|
return NULL;
|
|
}
|
|
return m_filename[file_index];
|
|
}
|
|
|
|
/*!
|
|
*/
|
|
void printHelp(void)
|
|
{
|
|
printf("Usage: %s [options] data-file\n\
|
|
-b <options>\tset bench options\n\
|
|
\t\ttype_name=<type>\n\
|
|
\t\ttn=<type>\tset bench type to <type> (default all)\n\
|
|
\t\t\t\t<type> is one of:\n\
|
|
\t\t\t\t\ti[ncrement]\t(0x1)\n\
|
|
\t\t\t\t\ta[ggregate]\t(0x2)\n\
|
|
\t\t\t\t\td[isplay]\t(0x4)\n\
|
|
\t\t\t\t\t[point_]l[ocation]\t(0x8)\n\
|
|
\t\ttype_mask=<mask>\n\
|
|
\t\ttm=<mask>\tset bench type mask to <mask>\n\
|
|
\t\tstrategy_name=<strategy>\n\
|
|
\t\tsn=<strategy>\tset bench strategy to <strategy> (default all)\n\
|
|
\t\t\t\t<strategy> is one of:\n\
|
|
\t\t\t\t\tt[rapezoidal]\t(0x1)\n\
|
|
\t\t\t\t\tn[aive]\t\t(0x2)\n\
|
|
\t\t\t\t\tw[alk]\t\t(0x4)\n\
|
|
\t\t\t\t\ts[imple]\t(0x8)\n\
|
|
\t\t\t\t\t[trian]g[le]\t(0x10)\n\
|
|
\t\t\t\t\tl[enmarks]\t(0x20)\n\
|
|
\t\t\t\t\td[ummy]\t\t(0x40)\n\
|
|
\t\tstrategy_mask=<mask>\n\
|
|
\t\tsm=<mask>\tset bench strategy mask to <mask>\n\
|
|
\t\th[eader]=<bool>\tprint header (default true)\n\
|
|
\t\tname_length=<length>\n\
|
|
\t\tnl=<length>\tset the length of the name field to <length\n\
|
|
-d <dir>\tadd directory <dir> to list of search directories\n\
|
|
-h\t\tprint this help message\n\
|
|
-i <iters>\tset number of iterations to <iters> (default 0)\n\
|
|
-I <options>\tset input options\n\
|
|
\t\tf[ormat]=<format>\tset format to <format> (default rat)\n\
|
|
\t\t\t\t<format is one of {i[nt], f[lt], r[at]}\n\
|
|
-s <samples>\tset number of samples to <samples> (default 10)\n\
|
|
-t <seconds>\tset number of seconds to <seconds> (default 1)\n\
|
|
-v\t\ttoggle verbosity (default false)\n",
|
|
m_prog_name);
|
|
}
|
|
|
|
int parse()
|
|
{
|
|
int c;
|
|
while ((c = getopt(m_argc, m_argv, s_option_str)) != EOF) {
|
|
switch (c) {
|
|
case 'b': if (get_bench_param(optarg) < 0) return -1; break;
|
|
case 'd': m_dirs.add(optarg); break;
|
|
case 'h': printHelp(); return 1;
|
|
case 'I': if (get_io_param(optarg)) return -1; break;
|
|
case 'i': m_iterations = atoi(optarg); break;
|
|
case 'p': m_postscript = !m_postscript; break;
|
|
case 's': m_samples = atoi(optarg); break;
|
|
case 't': m_seconds = atoi(optarg); break;
|
|
case 'v': m_verbose = !m_verbose; break;
|
|
//case 'f': m_files_number = atoi(optarg); break;
|
|
default:
|
|
std::cerr << m_prog_name << ": invalid option -- "
|
|
<< static_cast<char>(c) << std::endl;
|
|
std::cerr << "Try `" << m_prog_name << " -h' for more information."
|
|
<< std::endl;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
while (optind < m_argc) {
|
|
m_filename[m_files_number] = m_argv[optind];
|
|
if (!m_dirs.find(m_filename[m_files_number], m_fullname[m_files_number])) {
|
|
std::cerr << "Cannot find file " << m_filename[m_files_number] << "!" << std::endl;
|
|
return -1;
|
|
}
|
|
m_files_number++;
|
|
optind++;
|
|
if (m_files_number > MAX_FILES_NUMBER) {
|
|
std::cerr << "Too many input files !" << std::endl;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
private:
|
|
/*!
|
|
*/
|
|
int get_io_param(char * optarg)
|
|
{
|
|
char * options = optarg;
|
|
char * value = 0;
|
|
if (*options == '\0') return 0;
|
|
while (*options != '\0') {
|
|
switch (getsubopt(&options, s_io_opts, &value)) {
|
|
case IO_FORMAT:
|
|
case IO_F: if (get_format_param(value) < 0) return -1; break;
|
|
default:
|
|
std::cerr << "Unrecognized IO option '" << optarg << "'!"
|
|
<< std::endl;
|
|
std::cerr << "Try `" << m_prog_name << " -h' for more information."
|
|
<< std::endl;
|
|
return -1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/*!
|
|
*/
|
|
int get_format_param(char * value)
|
|
{
|
|
if (value) {
|
|
char * subvalue;
|
|
switch (getsubopt(&value, s_format_opts, &subvalue)) {
|
|
case FORMAT_INT:
|
|
case FORMAT_I: m_input_format = FORMAT_INT; return 0;
|
|
case FORMAT_RAT:
|
|
case FORMAT_R: m_input_format = FORMAT_RAT; return 0;
|
|
case FORMAT_FLT:
|
|
case FORMAT_F: m_input_format = FORMAT_FLT; return 0;
|
|
}
|
|
}
|
|
std::cerr << "Unrecognized Format option '" << optarg << "'!" << std::endl;
|
|
std::cerr << "Try `" << m_prog_name << " -h' for more information."
|
|
<< std::endl;
|
|
return -1;
|
|
}
|
|
|
|
/*!
|
|
*/
|
|
int get_bool_param(bool & param, char * value)
|
|
{
|
|
if (value) {
|
|
char * subvalue;
|
|
switch (getsubopt(&value, s_bool_opts, &subvalue)) {
|
|
case BOOL_TRUE:
|
|
case BOOL_T: param = true; return 0;
|
|
case BOOL_FALSE:
|
|
case BOOL_F: param = false; return 0;
|
|
}
|
|
}
|
|
std::cerr << "Unrecognized Bool option '" << optarg << "'!" << std::endl;
|
|
std::cerr << "Try `" << m_prog_name << " -h' for more information."
|
|
<< std::endl;
|
|
return -1;
|
|
}
|
|
|
|
/*!
|
|
*/
|
|
int get_bench_param(char * optarg)
|
|
{
|
|
char * options = optarg;
|
|
char * value = 0;
|
|
if (*options == '\0') return 0;
|
|
while (*options != '\0') {
|
|
switch(getsubopt(&options, s_bench_opts, &value)) {
|
|
case BENCH_TYPE_NAME:
|
|
case BENCH_TN: if (getType_name_param(value) < 0) return -1; break;
|
|
|
|
case BENCH_STRATEGY_NAME:
|
|
case BENCH_SN:
|
|
if (get_strategy_name_param(value) < 0) return -1; break;
|
|
|
|
case BENCH_TYPE_MASK:
|
|
case BENCH_TM:
|
|
if (!value) goto err;
|
|
m_type_mask = strtoul(value, 0, 0);
|
|
break;
|
|
|
|
case BENCH_STRATEGY_MASK:
|
|
case BENCH_SM:
|
|
if (!value) goto err;
|
|
m_strategy_mask = strtoul(value, 0, 0);
|
|
break;
|
|
|
|
case BENCH_HEADER:
|
|
case BENCH_H:
|
|
if (get_bool_param(m_print_header, value) < 0) return -1;
|
|
break;
|
|
|
|
case BENCH_NAME_LENGTH:
|
|
case BENCH_NL:
|
|
if (!value) goto err;
|
|
m_name_length = atoi(value);
|
|
break;
|
|
default:
|
|
err:
|
|
std::cerr << "Unrecognized Bench option '" << optarg << "'!"
|
|
<< std::endl;
|
|
std::cerr << "Try `" << m_prog_name << " -h' for more information."
|
|
<< std::endl;
|
|
return -1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
*/
|
|
int getType_name_param(char * value)
|
|
{
|
|
if (value) {
|
|
char * subvalue;
|
|
switch (getsubopt(&value, s_type_opts, &subvalue)) {
|
|
case TYPE_INCREMENT:
|
|
case TYPE_I:
|
|
m_type_mask = 0x1 << TYPE_INCREMENT; return 0;
|
|
case TYPE_AGGREGATE:
|
|
case TYPE_A:
|
|
m_type_mask = 0x1 << TYPE_AGGREGATE; return 0;
|
|
case TYPE_DISPLAY:
|
|
case TYPE_D:
|
|
m_type_mask = 0x1 << TYPE_DISPLAY; return 0;
|
|
case TYPE_POINT_LOCATION:
|
|
case TYPE_L:
|
|
m_type_mask = 0x1 << TYPE_POINT_LOCATION; return 0;
|
|
case TYPE_SUBCURVES:
|
|
case TYPE_C:
|
|
m_type_mask = 0x1 << TYPE_SUBCURVES; return 0;
|
|
case TYPE_POINTS:
|
|
case TYPE_P:
|
|
m_type_mask = 0x1 << TYPE_POINTS; return 0;
|
|
}
|
|
}
|
|
std::cerr << "Unrecognized Bench name option '" << optarg << "'!"
|
|
<< std::endl;
|
|
std::cerr << "Try `" << m_prog_name << " -h' for more information."
|
|
<< std::endl;
|
|
return -1;
|
|
}
|
|
|
|
/*
|
|
*/
|
|
int get_strategy_name_param(char * value)
|
|
{
|
|
if (value) {
|
|
char * subvalue;
|
|
switch (getsubopt(&value, s_strategy_opts, &subvalue)) {
|
|
case STRATEGY_TRAPEZOIDAL:
|
|
case STRATEGY_T:
|
|
m_strategy_mask = 0x1 << STRATEGY_TRAPEZOIDAL; return 0;
|
|
case STRATEGY_NAIVE:
|
|
case STRATEGY_N:
|
|
m_strategy_mask = 0x1 << STRATEGY_NAIVE; return 0;
|
|
case STRATEGY_WALK:
|
|
case STRATEGY_W:
|
|
m_strategy_mask = 0x1 << STRATEGY_WALK; return 0;
|
|
case STRATEGY_SIMPLE:
|
|
case STRATEGY_S:
|
|
m_strategy_mask = 0x1 << STRATEGY_SIMPLE; return 0;
|
|
case STRATEGY_TRIANGLE:
|
|
case STRATEGY_G:
|
|
m_strategy_mask = 0x1 << STRATEGY_TRIANGLE; return 0;
|
|
case STRATEGY_LANDMARKS:
|
|
case STRATEGY_L:
|
|
m_strategy_mask = 0x1 << STRATEGY_LANDMARKS; return 0;
|
|
case STRATEGY_DUMMY:
|
|
case STRATEGY_D:
|
|
m_strategy_mask = 0x1 << STRATEGY_DUMMY; return 0;
|
|
}
|
|
}
|
|
std::cerr << "Unrecognized Bench Name option '" << optarg << "'!"
|
|
<< std::endl;
|
|
std::cerr << "Try `" << m_prog_name << " -h' for more information."
|
|
<< std::endl;
|
|
return -1;
|
|
}
|
|
|
|
private:
|
|
static char * s_format_opts[];
|
|
static char * s_io_opts[];
|
|
static char * s_bench_opts[];
|
|
static char * s_type_opts[];
|
|
static char * s_strategy_opts[];
|
|
static char * s_bool_opts[];
|
|
|
|
private:
|
|
static char s_option_str[];
|
|
const char * m_prog_name;
|
|
|
|
std::string m_fullname[MAX_FILES_NUMBER];
|
|
Dir_search m_dirs;
|
|
|
|
int m_argc;
|
|
char ** m_argv;
|
|
const char * m_filename[MAX_FILES_NUMBER];
|
|
bool m_verbose;
|
|
bool m_postscript;
|
|
unsigned int m_type_mask;
|
|
unsigned int m_strategy_mask;
|
|
FormatId m_input_format;
|
|
bool m_print_header;
|
|
int m_files_number;
|
|
int m_name_length;
|
|
int m_seconds;
|
|
int m_samples;
|
|
int m_iterations;
|
|
};
|
|
|
|
CGAL_END_NAMESPACE
|
|
|
|
#endif
|