1#ifndef __JEEP__JPARSER__
2#define __JEEP__JPARSER__
97 inline bool fail(std::istream& in)
99 return in.bad() || (in.fail() && !in.eof());
106 template<class T, bool is_fundamental = std::is_fundamental<T>::value>
123 JProxy(
const std::string& option,
const T& value) :
180 operator const T&()
const
196 __value =
object.__value;
229 if (getline(in, buffer)) {
231 if (buffer ==
object.__option) {
233 object.__value =
object.__custom;
237 istringstream is(buffer);
239 is >>
object.__value;
241 in.setstate(is.rdstate());
258 return out <<
object.__value;
282 JProxy(
const std::string& option,
const T& value) :
308 return static_cast<const T&
>(*this);
344 static_cast<T&
>(*this) =
static_cast<const T&
>(object);
358 static_cast<T&
>(*this) = value;
377 if (getline(in, buffer)) {
379 if (buffer ==
object.__option) {
381 static_cast<T&
>(object) =
object.__custom;
385 istringstream is(buffer);
387 is >>
static_cast<T&
>(object);
389 in.setstate(is.rdstate());
406 return out << static_cast<const T&>(
object);
461 inline bool less(
const int value)
const
473 inline bool more(
const int value)
const
532 out <<
object.counter;
557 const std::string& help =
"") :
615 virtual void print(std::ostream& out)
const
619 out <<
"<" <<
getName() <<
">";
626 out << setw(width) <<
" ";
635 out <<
" \"" <<
getHelp() <<
"\"";
661 template<class JType_t, bool has_eq = JComparisonAvailable<JType_t>::has_eq>
668 template<
class JType_t>
700 __element.possibleValues.push_back(value);
712 template<
template<
class,
class>
class JContainer_t,
class JAllocator_t>
715 for (
typename JContainer_t<JType_t, JAllocator_t>::const_iterator i = values.begin(); i != values.end(); ++i) {
729 template<
template<
class,
class,
class>
class JContainer_t,
class JCompare_t,
class JAllocator_t>
730 JCSV&
operator,(
const JContainer_t<JType_t, JCompare_t, JAllocator_t>& values)
732 for (
typename JContainer_t<JType_t, JCompare_t, JAllocator_t>::const_iterator i = values.begin(); i != values.end(); ++i) {
747 template<
class JType_t>
760 const std::string& name =
"arg",
761 const std::string& help =
"") :
764 is_initialised(false)
776 setInitialiationStatus(
true);
790 setInitialiationStatus(
false);
806 setInitialiationStatus(
true);
819 return getInitialisationStatus();
830 return is_initialised;
841 is_initialised = value;
851 virtual std::istream&
read(std::istream& in)
override
853 if (in.peek() == EOF) {
857 readObject(in,
object);
863 while (isspace(in.peek())) {
867 if (in.peek() != EOF) {
871 setInitialiationStatus(
true);
883 virtual std::ostream&
write(std::ostream& out)
const override
885 return writeObject(out,
object);
903 std::getline(in,
object);
909 if (in.peek() != EOF) {
913 setInitialiationStatus(
true);
936 template<bool option = JLANG::JResolve<TString>::value>
954 static inline std::istream&
read(std::istream& in, T&
object)
988 static inline std::istream&
read(std::istream& in, T&
object)
990 return object.ReadLine(in);
1003 for (std::string buffer; in >> buffer; ) {
1004 object.push_back(buffer.c_str());
1023 setInitialiationStatus(
true);
1040 setInitialiationStatus(
true);
1049 template<
class JType_t>
1055 friend class JCSV<JType_t>;
1065 const std::string& name =
"arg",
1066 const std::string& help =
"") :
1081 const std::string& name,
1086 setPossibleValues(__begin, __end);
1101 const std::string& name,
1102 const std::string& help,
1107 setPossibleValues(__begin, __end);
1119 this->setInitialiationStatus(
true);
1133 this->setInitialiationStatus(
false);
1147 this->
object = value;
1149 this->setInitialiationStatus(
true);
1151 possibleValues.push_back(value);
1163 template<
template<
class,
class>
class JContainer_t,
class JAllocator_t>
1166 setPossibleValues(values.begin(), values.end());
1178 template<
template<
class,
class,
class>
class JContainer_t,
class JCompare_t,
class JAllocator_t>
1181 setPossibleValues(values.begin(), values.end());
1198 if (possibleValues.size() > 1) {
1200 for (
typename std::vector<JType_t>::const_iterator i = possibleValues.begin(); i != possibleValues.end(); ++i) {
1201 if (this->
object == *i) {
1210 return this->getInitialisationStatus();
1220 virtual void print(std::ostream& out)
const override
1225 writeArray(out,
" [",
"]",
", ", possibleValues.begin(), possibleValues.end());
1239 if (__begin != __end) {
1241 this->
object = *__begin;
1243 this->setInitialiationStatus(
true);
1245 for (T i = __begin; i != __end; ++i) {
1246 possibleValues.push_back(*i);
1279 this->
object =
false;
1290 virtual std::istream&
read(std::istream& in)
override
1292 this->
object =
true;
1304 virtual std::ostream&
write(std::ostream& out)
const override
1306 return out << object;
1393 virtual std::istream&
read(std::istream& in)
override
1395 return in >> object;
1405 virtual std::ostream&
write(std::ostream& out)
const override
1407 return out << object;
1508 template<
class JType_t>
1525 template<
class JType_t>
1542 template<
class JType_t>
1564 (*this)->setInitialiationStatus(
true);
1578 (*this)->setInitialiationStatus(
false);
1594 return value->read(in);
1610 return value->write(out);
1624 return get()->print(out);
1693 template<
class JKey_t =
char>
1695 public std::map<JKey_t, JParserElement>,
1729 const int debug = 0) :
1744 this->insert(parser.begin(), parser.end());
1757 using namespace std;
1758 using namespace JPP;
1761 out <<
help << endl;
1764 out <<
"usage: " << getFilename(
pid) << endl;
1776 i->second.print(out);
1781 if (getURL() !=
"") {
1782 out << endl <<
"See also: " << getURL() <<
'#' << getFilename(
pid) << endl;
1807 return (*
this)(
JArgs(argc, argv));
1819 using namespace std;
1820 using namespace JLANG;
1821 using namespace JEEP;
1829 for (JArgs::const_iterator i = args.begin(); i != args.end(); ++i) {
1831 DEBUG(
"Processing option <" << *i <<
">" << endl);
1836 for (
int c; (c = is.get()) != EOF; ) {
1840 if (is.peek() == EOF) {
1844 }
else if (isspace(is.peek())) {
1849 while (is.peek() != EOF) {
1857 if (is.peek() != EOF) {
1877 cout <<
"source: " << getSource() << endl;
1878 cout <<
"version: " << getGITVersion() << endl;
1879 cout <<
"commit: " << getGITCommit() << endl;
1880 cout <<
"date: " << getGITDate() << endl;
1881 cout <<
"namespace: " << getNamespace() << endl;
1891 if (is.peek() != EOF) {
1903 if (is.peek() == EOF && i + 1 != args.end()) {
1910 getline(is, file_name);
1912 ofstream out(file_name.c_str());
1914 out << getpid() << endl;
1930 return JArgs(
pid, ++i, args.end());
1940 DEBUG(
"Processing option <" << option <<
"> " << (p != this->end()) << endl);
1942 if (p != this->end()) {
1944 if (p->second->gcount()) {
1946 if (is.peek() == EOF && i + 1 != args.end()) {
1955 catch(
const exception& error) {
1991 int read(
const int argc,
const char*
const argv[])
1993 (*this)(argc, argv);
2020 std::ostream&
write(std::ostream& out)
const
2023 out << i->second->getName() <<
'=' << i->second << std::endl;
2039 return parser.
write(out);
2052 if (!p->second->getInitialisationStatus()) {
2056 if (!p->second->getStatus()) {
2075 template<
class JType_t>
2092 template<
class JType_t,
class T>
2094 const std::string& name,
2095 const std::string& help,
2112 template<
class JType_t,
class T>
2114 const std::string& name,
2118 return getOption(
object, name,
"", __begin, __end);
2135#define VARGS_STRING(A, B, ...) std::invoke( [&]() { std::ostringstream out; out << B; return out.str(); } )
2140#define make_field(A, ...) JPARSER::getOption(A, #A, VARGS_STRING("", ##__VA_ARGS__, ""))
2146#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.
bool is_valid() const
Check validity of pointer.
Template definition of test availability of comparison operators.
Exception when parsing a value.
virtual JClass_t * get() const override
Get pointer.
JClass_t * __p
pointer to object
The template JSharedPointer class can be used to share a pointer to an object.
virtual void reset() override
Reset pointer.
JSharedPointer & operator=(const JSharedPointer &object)
Assignment operator.
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.
Auxiliary class to handle multiple boolean-like I/O.
bool more(const int value) const
Compare value.
virtual bool getStatus() const override
Get status of this counter.
const JCounter & operator=(const bool value)
Set value.
JCounter()
Default constructor.
friend std::istream & operator>>(std::istream &in, JCounter &object)
Read option from input.
bool less(const int value) const
Compare value.
bool less(const JCounter &value) const
Compare value.
friend std::ostream & operator<<(std::ostream &out, const JCounter &object)
Write options to output.
int getCounter() const
Get counter.
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.
JSharedPointer< JParserElementInterface > JSharedPointer_t
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.
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.