1 /*
2  * SObjectizer-5
3  */
4 
5 #pragma once
6 
7 #include <cstring>
8 #include <sstream>
9 #include <stdexcept>
10 
11 inline bool
is_arg(const char * cmd_line_arg,const char * v1,const char * v2)12 is_arg(
13 	const char * cmd_line_arg,
14 	const char * v1,
15 	const char * v2 )
16 	{
17 		return (0 == std::strcmp( cmd_line_arg, v1 ) ||
18 				0 == std::strcmp( cmd_line_arg, v2 ));
19 	}
20 
21 template< class T >
22 void
arg_to_value(T & receiver,const char * cmd_line_arg_value,const char * name,const char * description)23 arg_to_value( T & receiver,
24 	const char * cmd_line_arg_value,
25 	const char * name,
26 	const char * description )
27 	{
28 		std::stringstream ss;
29 		ss << cmd_line_arg_value;
30 		ss.seekg(0);
31 
32 		T r;
33 		ss >> r;
34 
35 		if( !ss || !ss.eof() )
36 			throw std::runtime_error(
37 					std::string( "unable to parse value for argument '" ) + name +
38 					"' (" + description + "): " +
39 					cmd_line_arg_value );
40 
41 		receiver = r;
42 	}
43 
44 template< class T >
45 void
mandatory_arg_to_value(T & receiver,char ** arg,char ** last_arg,const char * name,const char * description)46 mandatory_arg_to_value(
47 	T & receiver,
48 	char ** arg, char ** last_arg,
49 	const char * name,
50 	const char * description )
51 	{
52 		if( arg == last_arg )
53 			throw std::runtime_error(
54 					std::string( "argument '" ) + name + "' requires value (" +
55 					description + ")" );
56 
57 		return arg_to_value( receiver, *arg, name, description );
58 	}
59 
60