1 #ifndef __JEEP__JPARSER__ 
    2 #define __JEEP__JPARSER__ 
   14 #include <type_traits> 
   98   inline bool fail(std::istream& in)
 
  100     return in.bad() || (in.fail() && !in.eof());
 
  107   template<class T, bool is_fundamental = std::is_fundamental<T>::value>
 
  124     JProxy(
const std::string& option, 
const T& value) :
 
  181     operator const T&() 
const 
  197       __value  = 
object.__value;
 
  232         if (buffer == 
object.__option) {
 
  234           object.__value = 
object.__custom;
 
  238           istringstream is(buffer);
 
  240           is >> 
object.__value;
 
  242           in.setstate(is.rdstate());
 
  259       return out << 
object.__value;
 
  283     JProxy(
const std::string& option, 
const T& value) :
 
  309       return static_cast<const T&
>(*this);
 
  345       static_cast<T&
>(*this)  = 
static_cast<const T&
>(object);
 
  359       static_cast<T&
>(*this)  = value;
 
  380         if (buffer == 
object.__option) {
 
  382           static_cast<T&
>(object) = 
object.__custom;
 
  386           istringstream is(buffer);
 
  388           is >> 
static_cast<T&
>(object);
 
  390           in.setstate(is.rdstate());
 
  407       return out << static_cast<const T&>(
object);
 
  440       return (this->counter != 0);
 
  452       return this->counter < value.
counter;
 
  462     inline bool less(
const int value)
 const 
  464       return this->counter < value;
 
  474     inline bool more(
const int value)
 const 
  476       return this->counter > value;
 
  533       out << 
object.counter;
 
  558                             const std::string& help = 
"") :
 
  616     virtual void print(std::ostream& out)
 const  
  620       out << 
"<" << 
getName() << 
">"; 
 
  627           out << setw(width) << 
" ";
 
  636         out << 
" \"" << getHelp() << 
"\""; 
 
  662   template<class JType_t, bool has_eq = JComparisonAvailable<JType_t>::has_eq>
 
  669   template<
class JType_t>
 
  701       __element.possibleValues.push_back(value);
 
  713     template<
template<
class, 
class> 
class JContainer_t, 
class JAllocator_t>
 
  716       for (
typename JContainer_t<JType_t, JAllocator_t>::const_iterator i = values.begin(); i != values.end(); ++i) {
 
  717         __element.possibleValues.push_back(*i);
 
  730     template<
template<
class, 
class, 
class> 
class JContainer_t, 
class JCompare_t, 
class JAllocator_t>
 
  731     JCSV& 
operator,(
const JContainer_t<JType_t, JCompare_t, JAllocator_t>& values)
 
  733       for (
typename JContainer_t<JType_t, JCompare_t, JAllocator_t>::const_iterator i = values.begin(); i != values.end(); ++i) {
 
  734         __element.possibleValues.push_back(*i);
 
  748   template<
class JType_t>
 
  761                            const std::string& name   = 
"arg",
 
  762                            const std::string& help   = 
"") :
 
  765       is_initialised(false)
 
  777       setInitialiationStatus(
true);
 
  791       setInitialiationStatus(
false);
 
  807       setInitialiationStatus(
true);
 
  820       return getInitialisationStatus(); 
 
  831       return is_initialised;
 
  842       is_initialised = value;
 
  852     virtual std::istream& 
read(std::istream& in)
 override  
  854       if (in.peek() == EOF) {
 
  864       while (isspace(in.peek())) {
 
  868       if (in.peek() != EOF) {
 
  872       setInitialiationStatus(
true);
 
  884     virtual std::ostream& 
write(std::ostream& out)
 const override  
  910     if (in.peek() != EOF) {
 
  914     setInitialiationStatus(
true);
 
  937   template<bool option = JLANG::JResolve<TString>::value>
 
  955     static inline std::istream& 
read(std::istream& in, T& 
object)
 
  989     static inline std::istream& 
read(std::istream& in, T& 
object)
 
  991       return object.ReadLine(in);
 
 1004       for (std::string buffer; in >> buffer; ) {
 
 1005         object.push_back(buffer.c_str());
 
 1024     setInitialiationStatus(
true);
 
 1041     setInitialiationStatus(
true);
 
 1050   template<
class JType_t>
 
 1056     friend class JCSV<JType_t>;
 
 1066                            const std::string& name   = 
"arg",
 
 1067                            const std::string& help   = 
"") :
 
 1082                            const std::string& name,
 
 1087       setPossibleValues(__begin, __end);
 
 1102                            const std::string& name,
 
 1103                            const std::string& help,
 
 1108       setPossibleValues(__begin, __end);
 
 1120       this->setInitialiationStatus(
true);
 
 1134       this->setInitialiationStatus(
false);
 
 1148       this->
object = value;
 
 1150       this->setInitialiationStatus(
true);
 
 1152       possibleValues.push_back(value);
 
 1164     template<
template<
class, 
class> 
class JContainer_t, 
class JAllocator_t>
 
 1167       setPossibleValues(values.begin(), values.end());
 
 1179     template<
template<
class, 
class, 
class> 
class JContainer_t, 
class JCompare_t, 
class JAllocator_t>
 
 1182       setPossibleValues(values.begin(), values.end());
 
 1199       if (possibleValues.size() > 1) {
 
 1202           if (this->
object == *i) {
 
 1211         return this->getInitialisationStatus(); 
 
 1221     virtual void print(std::ostream& out)
 const override  
 1226         writeArray(out, 
" [", 
"]", 
", ", possibleValues.begin(), possibleValues.end());
 
 1240       if (__begin != __end) {
 
 1242         this->
object = *__begin;
 
 1244         this->setInitialiationStatus(
true);
 
 1246         for (T i = __begin; i != __end; ++i) {
 
 1247           possibleValues.push_back(*i);
 
 1280       this->
object = 
false;
 
 1291     virtual std::istream& 
read(std::istream& in)
 override  
 1293       this->
object = 
true;
 
 1305     virtual std::ostream& 
write(std::ostream& out)
 const override  
 1307       return out << object;
 
 1394     virtual std::istream& 
read(std::istream& in)
 override  
 1396       return in >> object;
 
 1406     virtual std::ostream& 
write(std::ostream& out)
 const override  
 1408       return out << object;
 
 1509     template<
class JType_t>
 
 1526     template<
class JType_t>
 
 1543     template<
class JType_t>
 
 1565         (*this)->setInitialiationStatus(
true);
 
 1579       (*this)->setInitialiationStatus(
false);
 
 1595         return value->read(in);
 
 1611         return value->write(out);
 
 1625         return get()->print(out);
 
 1694   template<
class JKey_t = 
char>
 
 1696     public std::map<JKey_t, JParserElement>,
 
 1730             const int debug = 0) :
 
 1745       this->insert(parser.begin(), parser.end());
 
 1758       using namespace std;
 
 1759       using namespace JPP;
 
 1762         out << help << endl;
 
 1777         i->second.print(out);
 
 1808       return (*
this)(
JArgs(argc, argv));
 
 1820       using namespace std;
 
 1821       using namespace JLANG;
 
 1822       using namespace JEEP;
 
 1830       for (JArgs::const_iterator i = 
args.begin(); i != 
args.end(); ++i) {
 
 1832         DEBUG(
"Processing option <" << *i << 
">" << endl);
 
 1837         for (
int c; (c = is.get()) != EOF; ) {
 
 1841             if        (is.peek() == EOF) {                      
 
 1845             } 
else if (isspace(is.peek())) {                    
 
 1850             while (is.peek() != EOF) {                          
 
 1858                 if (is.peek() != EOF) {
 
 1878                 cout << 
"source:    " << 
getSource()     << endl;
 
 1892                 if (is.peek() != EOF) {
 
 1904                     if (is.peek() == EOF && i + 1 != 
args.end()) {
 
 1913                     ofstream out(file_name.c_str());
 
 1915                     out << getpid() << endl;
 
 1941                 DEBUG(
"Processing option <" << option << 
"> " << (p != this->end()) << endl);
 
 1943                 if (p != this->end()) {
 
 1945                   if (p->second->gcount()) {
 
 1947                     if (is.peek() == EOF && i + 1 != 
args.end()) {
 
 1956                   catch(
const exception& error) {
 
 1992     int read(
const int argc, 
const char* 
const argv[])
 
 1994       (*this)(argc, argv);
 
 2021     std::ostream& 
write(std::ostream& out)
 const 
 2024         out << i->second->getName() << 
'=' << i->second << std::endl;
 
 2040       return parser.
write(out); 
 
 2053         if (!p->second->getInitialisationStatus()) {
 
 2057         if (!p->second->getStatus()) {
 
 2076   template<
class JType_t>
 
 2093   template<
class JType_t, 
class T>
 
 2095                                                    const std::string& name,
 
 2096                                                    const std::string& help,
 
 2113   template<
class JType_t, 
class T>
 
 2115                                                    const std::string& name,
 
 2119     return getOption(
object, name, 
"", __begin, __end);
 
 2136 #define VARGS_STRING(A, B, ...) (static_cast<std::ostringstream&>(JEEP::getOstream() << B << std::flush)).str() 
 2142 #define make_field(A, ...)   JPARSER::getOption(A, #A, VARGS_STRING("", ##__VA_ARGS__, ""))
 
 2148 #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.
 
virtual const char * what() const override
Get error message.
 
Template definition of test availability of comparison operators.
 
Exception when parsing a value.
 
The template JSharedPointer class can be used to share a pointer to an object.
 
Interface for ASCII output using standard streams.
 
Auxiliary class to assign the remainder of a sequence of Comma Separated Values.
 
JCSV & operator,(JType_t value)
Parsing of additional possible values.
 
JCSV(JParserTemplateElement< JType_t > &element)
Constructor.
 
JCSV & operator,(const JContainer_t< JType_t, JCompare_t, JAllocator_t > &values)
Parsing of additional possible values.
 
JParserTemplateElement< JType_t > & __element
 
JCSV & operator,(const JContainer_t< JType_t, JAllocator_t > &values)
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.
 
JCounter()
Default constructor.
 
const JCounter & operator=(const bool value)
Set value.
 
bool less(const int value) const
Compare value.
 
bool less(const JCounter &value) const
Compare value.
 
int getCounter() const
Get counter.
 
friend std::ostream & operator<<(std::ostream &out, const JCounter &object)
Write options to output.
 
friend std::istream & operator>>(std::istream &in, JCounter &object)
Read option from input.
 
Interface for I/O of parser element.
 
virtual bool gcount() const
Read counter.
 
const std::string & getHelp() const
Get help of parameter.
 
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.
 
virtual bool getInitialisationStatus() const =0
Get initialisation status of parameter.
 
Auxiliary class to handle pointer to JPARSER::JParserElementInterface.
 
JParserTemplateElement< JType_t > & operator=(const JParserTemplateElement< JType_t > &value)
Assignment operator.
 
JCSV< JType_t > operator=(const JCSV< JType_t > &value)
Assignment operator.
 
friend std::istream & operator>>(std::istream &in, JParserElement &value)
Stream input.
 
JParserElement(const JParserElement &value)
Copy constructor.
 
const JParserElement & operator=(const initialised &value)
Set initialised status to true.
 
void print(std::ostream &out) const
Print.
 
friend std::ostream & operator<<(std::ostream &out, const JParserElement &value)
Stream output.
 
const JParserElement & operator=(const not_initialised &value)
Set initialised status to false.
 
JParserElement & operator=(JParserElement &value)
Assignment operator.
 
JParserTemplateElement< JType_t > & operator=(JType_t &value)
Assignment operator.
 
JSharedPointer< JParserElementInterface > JSharedPointer_t
 
JParserElement()
Default constructor.
 
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 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 std::istream & read(std::istream &in) override
Stream input.
 
Template specialisation of JPARSER::JParserTemplateElement for data type without equal operator ==.
 
const JParserTemplateElement< JType_t, false > & operator=(const JType_t &value)
Assignment to a default value.
 
virtual bool getInitialisationStatus() const override
Get initialisation status of parameter.
 
JParserTemplateElement(JType_t &object, const std::string &name="arg", const std::string &help="")
Constructor.
 
const JParserTemplateElement< JType_t, false > & operator=(const not_initialised &value)
Set initialised status to false.
 
virtual std::ostream & write(std::ostream &out) const override
Stream output.
 
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.
 
virtual std::istream & read(std::istream &in) override
Stream input.
 
Template specialisation of JPARSER::JParserTemplateElement for data type with equal operator ==.
 
const JParserTemplateElement< JType_t, true > & operator=(const not_initialised &value)
Set initialised status to false.
 
const JParserTemplateElement< JType_t, true > & operator=(const initialised &value)
Set initialised status to true.
 
JParserTemplateElement(JType_t &object, const std::string &name, const std::string &help, 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.
 
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 JType_t &value)
Assignment to a default value and possible other values.
 
JParserTemplateElement(bool &object, const std::string &name="arg", const std::string &help="")
Constructor.
 
virtual std::ostream & write(std::ostream &out) const override
Stream output.
 
virtual bool getStatus() const override
Status of object.
 
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.
 
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.
 
map_type::iterator iterator
 
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
 
friend std::ostream & operator<<(std::ostream &out, const JParser< key_type > &parser)
Stream output.
 
map_type::const_iterator const_iterator
 
std::ostream & write(std::ostream &out) const
Print the current parameter values.
 
std::map< key_type, JParserElement > map_type
 
virtual void terminate(const int status)
Terminate.
 
JParser(const std::string &message, const int debug=0)
Constructor.
 
void print(std::ostream &out) const
Print the possible command line options.
 
JParser & join(const JParser &parser)
Join parser.
 
void check_status() const
Check if all required options have been set.
 
JParser(const int debug=0)
Default constructor.
 
std::string help
help message
 
int read(const JArgs &args)
Parse the program's command line options.
 
JLANG::JParserException JParserException
 
JArgs operator()(const JArgs &args)
Parse the program's command line options.
 
JProxy & operator=(const T &value)
Assignment to a value.
 
JProxy & operator=(const JProxy &object)
Assignment operator.
 
const T & getCustom() const
Get custom value.
 
friend std::ostream & operator<<(std::ostream &out, const JProxy &object)
Write options to output.
 
JProxy(const std::string &option, const T &value)
Constructor.
 
const std::string & getOption() const
Get option.
 
friend std::istream & operator>>(std::istream &in, JProxy &object)
Read option from input.
 
const T & getValue() const
Get actual value.
 
JProxy(const T &value)
Constructor.
 
JProxy(const T &value)
Constructor.
 
const T & getValue() const
Get actual value.
 
friend std::ostream & operator<<(std::ostream &out, const JProxy &object)
Write options to output.
 
JProxy & operator=(const T &value)
Assignment to a value.
 
friend std::istream & operator>>(std::istream &in, JProxy &object)
Read option from input.
 
const std::string & getOption() const
Get option.
 
JProxy(const std::string &option, const T &value)
Constructor.
 
JProxy & operator=(const JProxy &object)
Assignment operator.
 
const T & getCustom() const
Get custom value.
 
Auxiliary class to assign a custom value following the reading of a specific textual value.
 
bool write(const Vec &v, std::ostream &os)
Write a Vec(tor) to a stream.
 
std::ostream & print(std::ostream &out, const JTestSummary &summary, const char delimiter=' ', const bool useColors=true)
Print test summary.
 
std::istream & read(std::istream &in, JTestSummary &summary, const char delimiter=' ')
Read test summary.
 
General puprpose classes and methods.
 
std::string getFilename(const std::string &file_name)
Get file name part, i.e. part after last JEEP::PATHNAME_SEPARATOR if any.
 
std::ostream & writeObject(std::ostream &out, const T &object)
Stream output of object.
 
std::string getGITVersion(const std::string &tag)
Get GIT version for given GIT tag.
 
std::string getNamespace(const std::string &type_name)
Get name space, i.e. part before JEEP::TYPENAME_SEPARATOR.
 
std::string getURL()
Get URL of document pages.
 
std::ostream & writeArray(std::ostream &out, const char *left, const char *right, const char *sep, T __begin, T __end)
Write array of objects.
 
std::istream & readObject(std::istream &in, T &object)
Stream input of object.
 
Auxiliary classes and methods for language specific functionality.
 
const char * getGITDate()
Get GIT date.
 
std::istream & getline(std::istream &in, JString &object)
Read string from input stream until end of line.
 
std::string double_quote(const std::string &value)
Quote string.
 
const char * getSource()
Get source.
 
@ MEDIUM_PRINT
medium print
 
const char * getGITCommit()
Get GIT commit.
 
Local namespace for command line parser.
 
static char END_OF_OPTIONS
end of all options
 
bool fail(std::istream &in)
Check for stream state.
 
static char REVISION_OPTION
revision option
 
static int NORMAL_EXIT_CODE
exit code of normal end
 
static char PID_OPTION
print PID to file
 
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 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).
 
const char * getName()
Get ROOT name of given data type.
 
bool is_valid(const json &js)
Check validity of JSon data.
 
Auxiliary class for handling debug parameter within a class.
 
Interface for status of object.
 
Auxiliary template class for type bool.
 
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.