1#ifndef __JEEP__JPARSER__
2#define __JEEP__JPARSER__
96 inline bool fail(std::istream& in)
98 return in.bad() || (in.fail() && !in.eof());
105 template<class T, bool is_fundamental = std::is_fundamental<T>::value>
122 JProxy(
const std::string& option,
const T& value) :
179 operator const T&()
const
195 __value =
object.__value;
228 if (getline(in, buffer)) {
230 if (buffer ==
object.__option) {
232 object.__value =
object.__custom;
236 istringstream is(buffer);
238 is >>
object.__value;
240 in.setstate(is.rdstate());
257 return out <<
object.__value;
281 JProxy(
const std::string& option,
const T& value) :
307 return static_cast<const T&
>(*this);
343 static_cast<T&
>(*this) =
static_cast<const T&
>(object);
357 static_cast<T&
>(*this) = value;
376 if (getline(in, buffer)) {
378 if (buffer ==
object.__option) {
380 static_cast<T&
>(object) =
object.__custom;
384 istringstream is(buffer);
386 is >>
static_cast<T&
>(object);
388 in.setstate(is.rdstate());
405 return out << static_cast<const T&>(
object);
488 out <<
object.counter;
513 const std::string& help =
"") :
571 virtual void print(std::ostream& out)
const
575 out <<
"<" <<
getName() <<
">";
582 out << setw(width) <<
" ";
591 out <<
" \"" <<
getHelp() <<
"\"";
617 template<class JType_t, bool has_eq = JComparisonAvailable<JType_t>::has_eq>
624 template<
class JType_t>
656 __element.possibleValues.push_back(value);
668 template<
template<
class,
class>
class JContainer_t,
class JAllocator_t>
671 for (
typename JContainer_t<JType_t, JAllocator_t>::const_iterator i = values.begin(); i != values.end(); ++i) {
685 template<
template<
class,
class,
class>
class JContainer_t,
class JCompare_t,
class JAllocator_t>
686 JCSV&
operator,(
const JContainer_t<JType_t, JCompare_t, JAllocator_t>& values)
688 for (
typename JContainer_t<JType_t, JCompare_t, JAllocator_t>::const_iterator i = values.begin(); i != values.end(); ++i) {
703 template<
class JType_t>
716 const std::string& name =
"arg",
717 const std::string& help =
"") :
720 is_initialised(false)
732 setInitialiationStatus(
true);
746 setInitialiationStatus(
false);
762 setInitialiationStatus(
true);
775 return getInitialisationStatus();
786 return is_initialised;
797 is_initialised = value;
807 virtual std::istream&
read(std::istream& in)
override
809 if (in.peek() == EOF) {
813 readObject(in,
object);
819 while (isspace(in.peek())) {
823 if (in.peek() != EOF) {
827 setInitialiationStatus(
true);
839 virtual std::ostream&
write(std::ostream& out)
const override
841 return writeObject(out,
object);
859 std::getline(in,
object);
865 if (in.peek() != EOF) {
869 setInitialiationStatus(
true);
892 template<bool option = JLANG::JResolve<TString>::value>
910 static inline std::istream&
read(std::istream& in, T&
object)
944 static inline std::istream&
read(std::istream& in, T&
object)
946 return object.ReadLine(in);
959 for (std::string buffer; in >> buffer; ) {
960 object.push_back(buffer.c_str());
979 setInitialiationStatus(
true);
996 setInitialiationStatus(
true);
1005 template<
class JType_t>
1011 friend class JCSV<JType_t>;
1021 const std::string& name =
"arg",
1022 const std::string& help =
"") :
1037 const std::string& name,
1042 setPossibleValues(__begin, __end);
1057 const std::string& name,
1058 const std::string& help,
1063 setPossibleValues(__begin, __end);
1075 this->setInitialiationStatus(
true);
1089 this->setInitialiationStatus(
false);
1103 this->
object = value;
1105 this->setInitialiationStatus(
true);
1107 possibleValues.push_back(value);
1119 template<
template<
class,
class>
class JContainer_t,
class JAllocator_t>
1122 setPossibleValues(values.begin(), values.end());
1134 template<
template<
class,
class,
class>
class JContainer_t,
class JCompare_t,
class JAllocator_t>
1137 setPossibleValues(values.begin(), values.end());
1154 if (possibleValues.size() > 1) {
1156 for (
typename std::vector<JType_t>::const_iterator i = possibleValues.begin(); i != possibleValues.end(); ++i) {
1157 if (this->
object == *i) {
1166 return this->getInitialisationStatus();
1176 virtual void print(std::ostream& out)
const override
1181 writeArray(out,
" [",
"]",
", ", possibleValues.begin(), possibleValues.end());
1195 if (__begin != __end) {
1197 this->
object = *__begin;
1199 this->setInitialiationStatus(
true);
1201 for (T i = __begin; i != __end; ++i) {
1202 possibleValues.push_back(*i);
1235 this->
object =
false;
1246 virtual std::istream&
read(std::istream& in)
override
1248 this->
object =
true;
1260 virtual std::ostream&
write(std::ostream& out)
const override
1262 return out << object;
1349 virtual std::istream&
read(std::istream& in)
override
1351 return in >> object;
1361 virtual std::ostream&
write(std::ostream& out)
const override
1363 return out << object;
1419 public std::shared_ptr<JParserElementInterface>
1452 shared_ptr_t::operator=(
static_cast<shared_ptr_t&
>(value));
1464 template<
class JType_t>
1481 template<
class JType_t>
1498 template<
class JType_t>
1520 (*this)->setInitialiationStatus(
true);
1534 (*this)->setInitialiationStatus(
false);
1561 return value->read(in);
1577 return value->write(out);
1591 return get()->print(out);
1660 template<
class JKey_t =
char>
1662 public std::map<JKey_t, JParserElement>,
1696 const int debug = 0) :
1711 this->insert(parser.begin(), parser.end());
1724 using namespace std;
1725 using namespace JPP;
1728 out <<
help << endl;
1731 out <<
"usage: " << getFilename(
pid) << endl;
1743 i->second.print(out);
1748 if (getURL() !=
"") {
1749 out << endl <<
"See also: " << getURL() <<
'#' << getFilename(
pid) << endl;
1774 return (*
this)(
JArgs(argc, argv));
1786 using namespace std;
1787 using namespace JLANG;
1788 using namespace JEEP;
1796 for (JArgs::const_iterator i = args.begin(); i != args.end(); ++i) {
1798 DEBUG(
"Processing option <" << *i <<
">" << endl);
1803 for (
int c; (c = is.get()) != EOF; ) {
1807 if (is.peek() == EOF) {
1811 }
else if (isspace(is.peek())) {
1816 while (is.peek() != EOF) {
1824 if (is.peek() != EOF) {
1844 cout <<
"source: " << getSource() << endl;
1845 cout <<
"version: " << getGITVersion() << endl;
1846 cout <<
"commit: " << getGITCommit() << endl;
1847 cout <<
"date: " << getGITDate() << endl;
1848 cout <<
"namespace: " << getNamespace() << endl;
1858 if (is.peek() != EOF) {
1870 if (is.peek() == EOF && i + 1 != args.end()) {
1877 getline(is, file_name);
1879 ofstream out(file_name.c_str());
1881 out << getpid() << endl;
1897 return JArgs(
pid, ++i, args.end());
1907 DEBUG(
"Processing option <" << option <<
"> " << (p != this->end()) << endl);
1909 if (p != this->end()) {
1911 if (p->second->gcount()) {
1913 if (is.peek() == EOF && i + 1 != args.end()) {
1922 catch(
const exception& error) {
1958 int read(
const int argc,
const char*
const argv[])
1960 (*this)(argc, argv);
1987 std::ostream&
write(std::ostream& out)
const
1990 out << i->second->getName() <<
'=' << i->second << std::endl;
2006 return parser.
write(out);
2019 if (!p->second->getInitialisationStatus()) {
2023 if (!p->second->getStatus()) {
2042 template<
class JType_t>
2059 template<
class JType_t,
class T>
2061 const std::string& name,
2062 const std::string& help,
2079 template<
class JType_t,
class T>
2081 const std::string& name,
2085 return getOption(
object, name,
"", __begin, __end);
2102#define VARGS_STRING(A, B, ...) std::invoke( [&]() { std::ostringstream out; out << B; return out.str(); } )
2107#define make_field(A, ...) JPARSER::getOption(A, #A, VARGS_STRING("", ##__VA_ARGS__, ""))
2113#define make_option(A, ...) JPARSER::getOption(A, #A, VARGS_STRING("", ##__VA_ARGS__, ""))
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
bool getShortprint(std::ostream &out)
Get short print option.
bool getLongprint(std::ostream &out)
Get long print option.
void setPrintOption(std::ostream &out, const int option)
Set print option.
General purpose messaging.
#define DEBUG(A)
Message macros.
I/O formatting auxiliaries.
Jpp environment information.
Data structure to store command line arguments.
Template definition of test availability of comparison operators.
Exception when parsing a value.
Interface for ASCII output using standard streams.
virtual std::ostream & write(std::ostream &out) const =0
Stream output.
Auxiliary class to assign the remainder of a sequence of Comma Separated Values.
JCSV & operator,(const JContainer_t< JType_t, JCompare_t, JAllocator_t > &values)
Parsing of additional possible values.
JCSV(JParserTemplateElement< JType_t > &element)
Constructor.
JCSV & operator,(const JContainer_t< JType_t, JAllocator_t > &values)
Parsing of additional possible values.
JParserTemplateElement< JType_t > & __element
JCSV & operator,(JType_t value)
Parsing of additional possible values.
Interface for I/O of parser element.
virtual bool gcount() const
Read counter.
virtual void setInitialiationStatus(const bool value)=0
Set initialisation status of parameter.
virtual bool getStatus() const =0
Get status of parameter.
virtual void print(std::ostream &out) const
Print.
JParserElementInterface(const std::string &name="arg", const std::string &help="")
Constructor.
const std::string & getName() const
Get name of parameter.
const std::string & getHelp() const
Get help of parameter.
virtual bool getInitialisationStatus() const =0
Get initialisation status of parameter.
Auxiliary class to handle pointer to JPARSER::JParserElementInterface.
const JParserElement & operator=(const not_initialised &value)
Set initialised status to false.
JParserElement(const JParserElement &value)
Copy constructor.
JParserTemplateElement< JType_t > & operator=(JType_t &value)
Assignment operator.
void print(std::ostream &out) const
Print.
JParserTemplateElement< JType_t > & operator=(const JParserTemplateElement< JType_t > &value)
Assignment operator.
friend std::istream & operator>>(std::istream &in, JParserElement &value)
Stream input.
std::shared_ptr< JParserElementInterface > shared_ptr_t
bool is_valid() const
Check validity.
const JParserElement & operator=(const initialised &value)
Set initialised status to true.
friend std::ostream & operator<<(std::ostream &out, const JParserElement &value)
Stream output.
JParserElement & operator=(JParserElement &value)
Assignment operator.
JParserElement()
Default constructor.
JCSV< JType_t > operator=(const JCSV< JType_t > &value)
Assignment operator.
JParserTemplateElement(JCounter &object, const std::string &name, const std::string &help="")
Constructor.
virtual void setInitialiationStatus(const bool value) override
Set initialisation status of parameter.
virtual bool gcount() const override
Read counter.
virtual std::istream & read(std::istream &in) override
Stream input.
virtual bool getInitialisationStatus() const override
Get initialisation status of parameter.
virtual std::ostream & write(std::ostream &out) const override
Stream output.
virtual bool getStatus() const override
Status of object.
virtual bool getInitialisationStatus() const override
Get initialisation status of parameter.
const JParserTemplateElement< JType_t, false > & operator=(const JType_t &value)
Assignment to a default value.
JParserTemplateElement(JType_t &object, const std::string &name="arg", const std::string &help="")
Constructor.
virtual bool getStatus() const override
Get status of object.
virtual void setInitialiationStatus(const bool value) override
Set initialisation status of parameter.
const JParserTemplateElement< JType_t, false > & operator=(const initialised &value)
Set initialised status to true.
const JParserTemplateElement< JType_t, false > & operator=(const not_initialised &value)
Set initialised status to false.
virtual std::istream & read(std::istream &in) override
Stream input.
virtual std::ostream & write(std::ostream &out) const override
Stream output.
const JParserTemplateElement< JType_t, true > & operator=(const initialised &value)
Set initialised status to true.
JCSV< JType_t > operator=(const JType_t &value)
Assignment to a default value and possible other values.
JParserTemplateElement(JType_t &object, const std::string &name, const std::string &help, T __begin, T __end)
Constructor.
const JParserTemplateElement< JType_t, true > & operator=(const not_initialised &value)
Set initialised status to false.
JCSV< JType_t > operator=(const JContainer_t< JType_t, JCompare_t, JAllocator_t > &values)
Assignment to a default value and possible other values.
virtual bool getStatus() const override
Get status of object.
void setPossibleValues(T __begin, T __end)
Set possible values.
virtual void print(std::ostream &out) const override
Print.
JParserTemplateElement(JType_t &object, const std::string &name="arg", const std::string &help="")
Constructor.
std::vector< JType_t > possibleValues
JParserTemplateElement(JType_t &object, const std::string &name, T __begin, T __end)
Constructor.
JCSV< JType_t > operator=(const JContainer_t< JType_t, JAllocator_t > &values)
Assignment to a default value and possible other values.
JParserTemplateElement(bool &object, const std::string &name="arg", const std::string &help="")
Constructor.
virtual std::istream & read(std::istream &in) override
Stream input.
virtual bool getStatus() const override
Status of object.
virtual void setInitialiationStatus(const bool value) override
Set initialisation status of parameter.
virtual std::ostream & write(std::ostream &out) const override
Stream output.
virtual bool gcount() const override
Read counter.
virtual bool getInitialisationStatus() const override
Get initialisation status of parameter.
Template class holder for I/O of parser element.
std::ostream & write(std::ostream &out) const
Template specialisation of JParserTemplateElement<std::string>::write to surround text with quotes.
std::istream & read(std::istream &in)
Template specialisation of JParserTemplateElement<std::string>::read to read complete line from strea...
Utility class to parse command line options.
JArgs operator()(const int argc, const char *const argv[])
Parse the program's command line options.
int read(const int argc, const char *const argv[])
Parse the program's command line options.
std::string pid
process name
map_type::const_iterator const_iterator
JParser & join(const JParser &parser)
Join parser.
map_type::iterator iterator
virtual void terminate(const int status)
Terminate.
friend std::ostream & operator<<(std::ostream &out, const JParser< key_type > &parser)
Stream output.
JLANG::JParserException JParserException
JParser(const std::string &message, const int debug=0)
Constructor.
void print(std::ostream &out) const
Print the possible command line options.
void check_status() const
Check if all required options have been set.
std::ostream & write(std::ostream &out) const
Print the current parameter values.
JParser(const int debug=0)
Default constructor.
std::string help
help message
int read(const JArgs &args)
Parse the program's command line options.
std::map< key_type, JParserElement > map_type
JArgs operator()(const JArgs &args)
Parse the program's command line options.
friend std::istream & operator>>(std::istream &in, JProxy &object)
Read option from input.
JProxy(const std::string &option, const T &value)
Constructor.
const T & getCustom() const
Get custom value.
JProxy & operator=(const T &value)
Assignment to a value.
const std::string & getOption() const
Get option.
friend std::ostream & operator<<(std::ostream &out, const JProxy &object)
Write options to output.
const T & getValue() const
Get actual value.
JProxy & operator=(const JProxy &object)
Assignment operator.
JProxy(const T &value)
Constructor.
JProxy(const T &value)
Constructor.
friend std::istream & operator>>(std::istream &in, JProxy &object)
Read option from input.
const T & getValue() const
Get actual value.
const T & getCustom() const
Get custom value.
JProxy & operator=(const JProxy &object)
Assignment operator.
JProxy(const std::string &option, const T &value)
Constructor.
const std::string & getOption() const
Get option.
friend std::ostream & operator<<(std::ostream &out, const JProxy &object)
Write options to output.
JProxy & operator=(const T &value)
Assignment to a value.
Auxiliary class to assign a custom value following the reading of a specific textual value.
bool read(Vec &v, std::istream &is)
Read a Vec(tor) from a stream.
General puprpose classes and methods.
std::ostream & writeObject(std::ostream &out, const T &object)
Stream output of object.
std::string getFilename(const std::string &file_name)
Get file name part, i.e. part after last JEEP::PATHNAME_SEPARATOR if any.
std::istream & readObject(std::istream &in, T &object)
Stream input of object.
std::ostream & writeArray(std::ostream &out, const char *left, const char *right, const char *sep, T __begin, T __end)
Write array of objects.
Auxiliary classes and methods for language specific functionality.
std::string double_quote(const std::string &value)
Quote string.
Local namespace for command line parser.
static char END_OF_OPTIONS
end of all options
bool fail(std::istream &in)
Check for stream state.
JParserTemplateElement< JType_t > getOption(JType_t &object, const std::string &name, const std::string &help="")
Auxiliary method for creation of template parser element object.
static char REVISION_OPTION
revision option
static int NORMAL_EXIT_CODE
exit code of normal end
static char PID_OPTION
print PID to file
static char START_OF_OPTION
Parser options.
static char HELP_OPTION
help option
static char PRINT_OPTION
print option
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Auxiliary class for handling debug parameter within a class.
static int debug
debug level (default is off).
Interface for status of object.
Template definition of auxiliary base class for comparison of data structures.
Auxiliary class to handle multiple boolean-like I/O.
const JCounter & operator=(const bool value)
Set value.
JCounter()
Default constructor.
friend std::istream & operator>>(std::istream &in, JCounter &object)
Read option from input.
friend std::ostream & operator<<(std::ostream &out, const JCounter &object)
Write options to output.
int getCounter() const
Get counter.
static std::istream & read(std::istream &in, T &object)
Read object from input stream.
static std::istream & read(std::istream &in, std::vector< T > &object)
Read std::vector of objects from input stream.
static std::istream & read(std::istream &in, T &object)
Read object from input stream.
Auxiliary class for handling I/O of TString depending on its existence.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Empty structure for specification of parser element that is not initialised (i.e. does require input)...
Auxiliary data structure for alignment of data.