//this file looks like plain C, but it's actually -*- c++ -*-
#ifndef __TQValue__
#define __TQValue__

#include "TObject.h"
#include "TString.h"

class TQValue : public TObject {

protected:

  TString fName;
  //TQValue * nextElement; // TODO: include

  TQValue(const TString& name);
  TQValue(TQValue * value, const TString& newName = "");

public:

  virtual TString getName();
  virtual const TString& getNameConst() const;

  static const TString& getValidNameCharacters();
  static bool isValidName(const TString& name);

  static TQValue * newInstance(const TString& name, double value);
  static TQValue * newInstance(const TString& name, int value);
  static TQValue * newInstance(const TString& name, bool value);
  static TQValue * newInstance(const TString& name, const TString& value);
  static TQValue * newInstance(const TString& name, const char* value); //additional overload taking const char* explicitly. Otherwise passing a bare string (=const char*) will be matched against bool oberload!

  static TQValue * newDouble (const TString& name, double value);
  static TQValue * newInteger (const TString& name, int value);
  static TQValue * newBool (const TString& name, bool value);
  static TQValue * newString (const TString& name, const TString& value);

  TQValue();

  virtual bool setName(const TString &name);

  virtual TQValue * copy(const TString& newName = "") = 0;
  virtual int getSize() const = 0;
  
  virtual ULong_t Hash() const override;
  virtual const char * GetName() const override ;
  virtual int Compare(const TObject * obj) const override;
  virtual bool IsSortable() const override;
  virtual bool isEquivalentTo(TQValue * val) const;

  virtual double getDouble() const = 0;
  virtual int getInteger() const = 0;
  virtual bool getBool() const = 0;
  virtual TString getString() const = 0;

  virtual bool isDouble() const;
  virtual bool isInteger() const;
  virtual bool isBool() const;
  virtual bool isString() const;

  virtual bool isValidDouble() const = 0;
  virtual bool isValidInteger() const = 0;
  virtual bool isValidBool() const = 0;

  virtual TString getAsString(bool forceQuotes = false) const = 0;
  virtual TString getTypeAsString() const = 0;
  virtual TString getValueAsString() const;
  
  //implemented following the override in TObjString to provide more informative printout, e.g., in case of TList::Print
  void Print(Option_t *) const override { Printf("[TQValue (%s)] %s", this->getTypeAsString().Data(), this->getAsString().Data()); }

  //virtual TQValue * addElement(TQValue * element) // TODO: include

  virtual ~TQValue();
 
  ClassDefOverride(TQValue, 1); // base class for information storage

};


class TQValueDouble : public TQValue {

protected:

  double fValue;

//protected:
public:

  TQValueDouble(const TString& name, double value);
  TQValueDouble(TQValueDouble * value, const TString& newName = "");

public:

  static TQValueDouble * newInstance(const TString& name, double value);

  TQValueDouble();

  virtual TQValue * copy(const TString& newName = "") override;
  virtual int getSize() const override;
  
  virtual double getDouble() const override;
  virtual int getInteger() const override;
  virtual bool getBool() const override;
  virtual TString getString() const override;

  virtual bool isDouble() const override;

  virtual bool isValidDouble() const override;
  virtual bool isValidInteger() const override;
  virtual bool isValidBool() const override;

  virtual TString getAsString(bool forceQuotes = false) const override;
  virtual TString getTypeAsString() const override;

  virtual ~TQValueDouble();
 
  ClassDefOverride(TQValueDouble, 1); // class for storage of a double-precision floating point number

};


class TQValueInteger : public TQValue {

protected:

  int fValue;

//protected:
public:
  
  TQValueInteger(const TString& name, int value);
  TQValueInteger(TQValueInteger * value, const TString& newName = "");

public:

  static TQValueInteger * newInstance(const TString& name, int value);

  TQValueInteger();

  virtual TQValue * copy(const TString& newName = "") override;
  virtual int getSize() const override;

  virtual double getDouble() const override;
  virtual int getInteger() const override;
  virtual bool getBool() const override;
  virtual TString getString() const override;

  virtual bool isInteger() const override;

  virtual bool isValidDouble() const override;
  virtual bool isValidInteger() const override;
  virtual bool isValidBool() const override;

  virtual TString getAsString(bool forceQuotes = false) const override;
  virtual TString getTypeAsString() const override;

  virtual ~TQValueInteger();
 
  ClassDefOverride(TQValueInteger, 1); // class for storage of an integer number

};


class TQValueBool : public TQValue {

protected:

  bool fValue;

//protected:
public:
  
  TQValueBool(const TString& name, bool value);
  TQValueBool(TQValueBool * value, const TString& newName = "");

public:

  static TQValueBool * newInstance(const TString& name, bool value);

  TQValueBool();

  virtual TQValue * copy(const TString& newName = "") override;
  virtual int getSize() const override;

  virtual double getDouble() const override;
  virtual int getInteger() const override;
  virtual bool getBool() const override;
  virtual TString getString() const override;

  virtual bool isBool() const override;

  virtual bool isValidDouble() const override;
  virtual bool isValidInteger() const override;
  virtual bool isValidBool() const override;

  virtual TString getAsString(bool forceQuotes = false) const override;
  virtual TString getTypeAsString() const override;

  virtual ~TQValueBool();
 
  ClassDefOverride(TQValueBool, 1); // class for storage of a boolean value

};


class TQValueString : public TQValue {

protected:

  TString fValue;

//protected:
public:

  TQValueString(const TString& name, const TString& value);
  TQValueString(TQValueString * value, const TString& newName = "");

public:

  static TQValueString * newInstance(const TString& name, const TString& value);

  TQValueString();

  virtual TQValue * copy(const TString& newName = "") override;
  virtual int getSize() const override;

  virtual double getDouble() const override;
  virtual int getInteger() const override;
  virtual bool getBool() const override;
  virtual TString getString() const override;

  virtual bool isString() const override;

  virtual bool isValidDouble() const override;
  virtual bool isValidInteger() const override;
  virtual bool isValidBool() const override;

  virtual TString getAsString(bool forceQuotes = false) const override;
  virtual TString getTypeAsString() const override;
  virtual TString getValueAsString() const override;

  virtual ~TQValueString();
 
  ClassDefOverride(TQValueString, 1); // class for storage of a string value

};

#endif
 TQValue.h:1
 TQValue.h:2
 TQValue.h:3
 TQValue.h:4
 TQValue.h:5
 TQValue.h:6
 TQValue.h:7
 TQValue.h:8
 TQValue.h:9
 TQValue.h:10
 TQValue.h:11
 TQValue.h:12
 TQValue.h:13
 TQValue.h:14
 TQValue.h:15
 TQValue.h:16
 TQValue.h:17
 TQValue.h:18
 TQValue.h:19
 TQValue.h:20
 TQValue.h:21
 TQValue.h:22
 TQValue.h:23
 TQValue.h:24
 TQValue.h:25
 TQValue.h:26
 TQValue.h:27
 TQValue.h:28
 TQValue.h:29
 TQValue.h:30
 TQValue.h:31
 TQValue.h:32
 TQValue.h:33
 TQValue.h:34
 TQValue.h:35
 TQValue.h:36
 TQValue.h:37
 TQValue.h:38
 TQValue.h:39
 TQValue.h:40
 TQValue.h:41
 TQValue.h:42
 TQValue.h:43
 TQValue.h:44
 TQValue.h:45
 TQValue.h:46
 TQValue.h:47
 TQValue.h:48
 TQValue.h:49
 TQValue.h:50
 TQValue.h:51
 TQValue.h:52
 TQValue.h:53
 TQValue.h:54
 TQValue.h:55
 TQValue.h:56
 TQValue.h:57
 TQValue.h:58
 TQValue.h:59
 TQValue.h:60
 TQValue.h:61
 TQValue.h:62
 TQValue.h:63
 TQValue.h:64
 TQValue.h:65
 TQValue.h:66
 TQValue.h:67
 TQValue.h:68
 TQValue.h:69
 TQValue.h:70
 TQValue.h:71
 TQValue.h:72
 TQValue.h:73
 TQValue.h:74
 TQValue.h:75
 TQValue.h:76
 TQValue.h:77
 TQValue.h:78
 TQValue.h:79
 TQValue.h:80
 TQValue.h:81
 TQValue.h:82
 TQValue.h:83
 TQValue.h:84
 TQValue.h:85
 TQValue.h:86
 TQValue.h:87
 TQValue.h:88
 TQValue.h:89
 TQValue.h:90
 TQValue.h:91
 TQValue.h:92
 TQValue.h:93
 TQValue.h:94
 TQValue.h:95
 TQValue.h:96
 TQValue.h:97
 TQValue.h:98
 TQValue.h:99
 TQValue.h:100
 TQValue.h:101
 TQValue.h:102
 TQValue.h:103
 TQValue.h:104
 TQValue.h:105
 TQValue.h:106
 TQValue.h:107
 TQValue.h:108
 TQValue.h:109
 TQValue.h:110
 TQValue.h:111
 TQValue.h:112
 TQValue.h:113
 TQValue.h:114
 TQValue.h:115
 TQValue.h:116
 TQValue.h:117
 TQValue.h:118
 TQValue.h:119
 TQValue.h:120
 TQValue.h:121
 TQValue.h:122
 TQValue.h:123
 TQValue.h:124
 TQValue.h:125
 TQValue.h:126
 TQValue.h:127
 TQValue.h:128
 TQValue.h:129
 TQValue.h:130
 TQValue.h:131
 TQValue.h:132
 TQValue.h:133
 TQValue.h:134
 TQValue.h:135
 TQValue.h:136
 TQValue.h:137
 TQValue.h:138
 TQValue.h:139
 TQValue.h:140
 TQValue.h:141
 TQValue.h:142
 TQValue.h:143
 TQValue.h:144
 TQValue.h:145
 TQValue.h:146
 TQValue.h:147
 TQValue.h:148
 TQValue.h:149
 TQValue.h:150
 TQValue.h:151
 TQValue.h:152
 TQValue.h:153
 TQValue.h:154
 TQValue.h:155
 TQValue.h:156
 TQValue.h:157
 TQValue.h:158
 TQValue.h:159
 TQValue.h:160
 TQValue.h:161
 TQValue.h:162
 TQValue.h:163
 TQValue.h:164
 TQValue.h:165
 TQValue.h:166
 TQValue.h:167
 TQValue.h:168
 TQValue.h:169
 TQValue.h:170
 TQValue.h:171
 TQValue.h:172
 TQValue.h:173
 TQValue.h:174
 TQValue.h:175
 TQValue.h:176
 TQValue.h:177
 TQValue.h:178
 TQValue.h:179
 TQValue.h:180
 TQValue.h:181
 TQValue.h:182
 TQValue.h:183
 TQValue.h:184
 TQValue.h:185
 TQValue.h:186
 TQValue.h:187
 TQValue.h:188
 TQValue.h:189
 TQValue.h:190
 TQValue.h:191
 TQValue.h:192
 TQValue.h:193
 TQValue.h:194
 TQValue.h:195
 TQValue.h:196
 TQValue.h:197
 TQValue.h:198
 TQValue.h:199
 TQValue.h:200
 TQValue.h:201
 TQValue.h:202
 TQValue.h:203
 TQValue.h:204
 TQValue.h:205
 TQValue.h:206
 TQValue.h:207
 TQValue.h:208
 TQValue.h:209
 TQValue.h:210
 TQValue.h:211
 TQValue.h:212
 TQValue.h:213
 TQValue.h:214
 TQValue.h:215
 TQValue.h:216
 TQValue.h:217
 TQValue.h:218
 TQValue.h:219
 TQValue.h:220
 TQValue.h:221
 TQValue.h:222
 TQValue.h:223
 TQValue.h:224
 TQValue.h:225
 TQValue.h:226
 TQValue.h:227
 TQValue.h:228
 TQValue.h:229
 TQValue.h:230
 TQValue.h:231
 TQValue.h:232
 TQValue.h:233
 TQValue.h:234
 TQValue.h:235
 TQValue.h:236
 TQValue.h:237
 TQValue.h:238
 TQValue.h:239
 TQValue.h:240
 TQValue.h:241
 TQValue.h:242
 TQValue.h:243
 TQValue.h:244
 TQValue.h:245
 TQValue.h:246
 TQValue.h:247
 TQValue.h:248