1#ifndef __JEEP__JPARSER__ 
    2#define __JEEP__JPARSER__ 
   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;
 
 
  230      if (getline(in, buffer)) {
 
  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;
 
 
  378      if (getline(in, buffer)) {
 
  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);
 
 
 
  462    inline bool less(
const int value)
 const 
 
  474    inline bool more(
const int value)
 const 
 
  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) {
 
 
  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) {
 
 
 
  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) {
 
  858      readObject(in, 
object);
 
  864      while (isspace(in.peek())) {
 
  868      if (in.peek() != EOF) {
 
  872      setInitialiationStatus(
true);
 
 
  884    virtual std::ostream& 
write(std::ostream& out)
 const override  
  886      return writeObject(out, 
object);
 
 
 
  904    std::getline(in, 
object);
 
  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) {
 
 1201        for (
typename std::vector<JType_t>::const_iterator i = possibleValues.begin(); i != possibleValues.end(); ++i) {
 
 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;
 
 1765      out << 
"usage: " << getFilename(
pid) << endl;
 
 1777        i->second.print(out);
 
 1782      if (getURL() != 
"") {
 
 1783        out << endl << 
"See also: " << getURL() << 
'#' << getFilename(
pid) << endl;
 
 
 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;
 
 1879                cout << 
"version:   " << getGITVersion() << endl;
 
 1880                cout << 
"commit:    " << getGITCommit()  << endl;
 
 1881                cout << 
"date:      " << getGITDate()    << endl;
 
 1882                cout << 
"namespace: " << getNamespace()  << endl;
 
 1892                if (is.peek() != EOF) {
 
 1904                    if (is.peek() == EOF && i + 1 != args.end()) {
 
 1911                    getline(is, file_name);
 
 1913                    ofstream out(file_name.c_str());
 
 1915                    out << getpid() << endl;
 
 1931                return JArgs(
pid, ++i, args.end());
 
 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.
 
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.
 
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.