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

#include <fstream>
#include <string>
#include <stdlib.h>
#include <iostream>
#include <map>

#include "QFramework/TQStringUtils.h"
#include "QFramework/TQNamedTaggable.h"
#include "TObjString.h"

class TQTable : public TQNamedTaggable {
protected:
  unsigned int nfields;
  unsigned int ncols;
  unsigned int nrows;
  TQTaggable** data; //[nfields]

  std::vector<int> hlines;
  std::vector<int> vlines;
  std::vector<TString> colAlign;
  bool autoExpand;
  bool manualAllocation; //!

  TQTaggable* getEntryInternal(unsigned int i, unsigned int j) const;
  TQTaggable* getEntryInternal(unsigned int i, unsigned int j, bool ensure);
  bool setContent(TQTaggable* entry,const TString& content, TString prior = "");
  TString formatEntryContents(TQTaggable* entry, const TString& format = "plain");
  void setup();
  TString makeExpSuffix(int exponent, const TString& format, bool useSIsuffix);

public: 
 
  int findColumn(TString colname, bool caseSensitive);
  int findColumn(TString colname, int row = 0, bool caseSensitive = true);
  int findRow(TString content, int column = 0, bool caseSensitive = true);
 
  TQTable();
  TQTable(const TString& name);
  TQTable(const TQTable* other);
  TQTable(const TQTable& other);
  TQTable(TList* l); 
  virtual ~TQTable();
 
  int appendLines(const TQTable& other, int startAt = 0, bool ignoreHlines = false);
  int appendLines(const TQTable* other, int startAt = 0, bool ignoreHlines = false);
  void merge(TQTable* other);
  

  TString getDetails();

  int setAllEntriesWhere(const TString& searchCol, const TString& searchVal, const TString& setCol, const TString& setVal, const TString& searchFormat = "ascii", const TString& setFormat = "ascii");

  std::map<TString,TString> getMap(const TString& key, const TString& value, const TString& keyformat = "ascii", const TString& valformat = "ascii");
  std::map<TString,TString> getMap(unsigned int keyidx, unsigned int validx, const TString& keyformat = "ascii", const TString& valformat = "ascii", bool skipfirstline = false);

  int getNcols();
  int getNrows();
  TString getColAlign(unsigned int col);
  TString getColAlignHTML(unsigned int col);

  void setAutoExpand(bool val);
  bool getAutoExpand();

  bool readCSVfile(const TString& fname, const TString& sep = ",", const TString& leftquote="\"", const TString& rightquote = "\"");
  bool readHTMLfile(const TString& fname);
  bool readLaTeXfile(const TString& fname);
  bool readTSVfile(const TString& fname, const TString& seps = " \t", int ignoreHeadLines=0, int nsepmin = 1);
  void readCSV(std::istream* input, const TString& sep = ",", const TString& leftquote="\"", const TString& rightquote = "\"");
  void readHTML(std::istream* input);
  void readLaTeX(std::istream* input);
  void readTSV(std::istream* input, const TString& seps = " \t", int nsepmin = 1);

  int readColumn(TQTable* other, const TString& colname, const TString& matchcolname);
  int readColumn(TQTable* other, const TString& colname, int thismatchcol, int othermatchcol);
  int readColumn(TQTable* other, int col, int thismatchcol,int othermatchcol);
  
  void dump();

  bool print (std::ostream* out, TQTaggable tags);
  bool printCSV (std::ostream* out, TQTaggable tags);
  bool printHTML (std::ostream* out, TQTaggable tags);
  bool printLaTeX(std::ostream* out, TQTaggable tags);
  bool printPlain(std::ostream* out, TQTaggable tags);
  bool print (std::ostream* out, TQTaggable* tags = NULL);
  bool printCSV (std::ostream* out, TQTaggable* tags = NULL);
  bool printHTML (std::ostream* out, TQTaggable* tags = NULL);
  bool printLaTeX(std::ostream* out, TQTaggable* tags = NULL);
  bool printPlain(std::ostream* out, TQTaggable* tags = NULL);
  bool print (std::ostream* out, const TString& tags);
  bool printCSV (std::ostream* out, const TString& tags);
  bool printHTML (std::ostream* out, const TString& tags);
  bool printLaTeX(std::ostream* out, const TString& tags);
  bool printPlain(std::ostream* out, const TString& tags);
  bool print (std::ostream* out, const char* tags);
  bool printCSV (std::ostream* out, const char* tags);
  bool printHTML (std::ostream* out, const char* tags);
  bool printLaTeX(std::ostream* out, const char* tags);
  bool printPlain(std::ostream* out, const char* tags);
  bool print (TQTaggable& tags);
  bool printCSV (TQTaggable& tags);
  bool printHTML (TQTaggable& tags);
  bool printLaTeX(TQTaggable& tags);
  bool printPlain(TQTaggable& tags);
  bool print (TQTaggable* tags = NULL);
  bool printCSV (TQTaggable* tags = NULL);
  bool printHTML (TQTaggable* tags = NULL);
  bool printLaTeX(TQTaggable* tags = NULL);
  bool printPlain(TQTaggable* tags = NULL);
  bool print (const TString& tags);
  bool printCSV (const TString& tags);
  bool printHTML (const TString& tags);
  bool printLaTeX(const TString& tags);
  bool printPlain(const TString& tags);
  bool print (const char* tags);
  bool printCSV (const char* tags);
  bool printHTML (const char* tags);
  bool printLaTeX(const char* tags);
  bool printPlain(const char* tags);

  bool write (const TString& fname, TQTaggable& tags);
  bool writeCSV (const TString& fname, TQTaggable& tags);
  bool writeHTML (const TString& fname, TQTaggable& tags);
  bool writeLaTeX(const TString& fname, TQTaggable& tags);
  bool writePlain(const TString& fname, TQTaggable& tags);
  bool write (const TString& fname, TQTaggable* tags = NULL);
  bool writeCSV (const TString& fname, TQTaggable* tags = NULL);
  bool writeHTML (const TString& fname, TQTaggable* tags = NULL);
  bool writeLaTeX(const TString& fname, TQTaggable* tags = NULL);
  bool writePlain(const TString& fname, TQTaggable* tags = NULL);
  bool write (const TString& fname, const TString& tags);
  bool writeCSV (const TString& fname, const TString& tags);
  bool writeHTML (const TString& fname, const TString& tags);
  bool writeLaTeX(const TString& fname, const TString& tags);
  bool writePlain(const TString& fname, const TString& tags);
  bool write (const TString& fname, const char* tags);
  bool writeCSV (const TString& fname, const char* tags);
  bool writeHTML (const TString& fname, const char* tags);
  bool writeLaTeX(const TString& fname, const char* tags);
  bool writePlain(const TString& fname, const char* tags);

  bool print(std::ostream* output, const TString& format, TQTaggable tags);
  bool write(const TString& fname, const TString& format, TQTaggable& tags);
  void clearColAlign();
 
  int getEntryInteger(unsigned int i, unsigned int j, bool sanitizeString = true);
  double getEntryDouble(unsigned int i, unsigned int j, bool sanitizeString = true);
  TQTaggable* getEntryTags(unsigned int i, unsigned int j);
  TString getEntry(unsigned int i, unsigned int j, TString format = "plain");
  TString getEntryPlain(unsigned int i, unsigned int j, bool allowUnicode = true);
  TString getEntryASCII(unsigned int i, unsigned int j);
  TString getEntryVerbatim(unsigned int i, unsigned int j);
  TString getEntryUnicode(unsigned int i, unsigned int j);
  TString getEntryLaTeX(unsigned int i, unsigned int j);
  TString getEntryHTML(unsigned int i, unsigned int j);
  bool setEntry(unsigned int i, unsigned int j, const TString& content, const TString& format = "");
  bool setEntry(unsigned int i, unsigned int j, const char* content, const TString& format = "");
  bool setEntryValue(unsigned int i, unsigned int j, int content);
  bool setEntryValue(unsigned int i, unsigned int j, double content);
  bool setEntryValueAndUncertainty(unsigned int i, unsigned int j, double value, double uncertainty);
  bool setEntryValueAndSplitUncertainties(unsigned int i, unsigned int j, double value, double statUncert, double sysUncert);
  double getEntryValue(unsigned int i, unsigned int j, double defaultval);
  bool setProperty(unsigned int i, unsigned int j, const TString& key, const TString& value);
  bool setProperty(unsigned int i, unsigned int j, const TString& key, const char* value);
  bool setProperty(unsigned int i, unsigned int j, const TString& key, double value);
  bool setProperty(unsigned int i, unsigned int j, const TString& key, int value);
  void setColProperty(unsigned int j, const TString& key, const TString& value);
  void setColProperty(unsigned int j, const TString& key, const char* value);
  void setColProperty(unsigned int j, const TString& key, double value);
  void setColProperty(unsigned int j, const TString& key, int value);
  void setRowProperty(unsigned int i, const TString& key, const TString& value);
  void setRowProperty(unsigned int i, const TString& key, const char* value);
  void setRowProperty(unsigned int i, const TString& key, double value);
  void setRowProperty(unsigned int i, const TString& key, int value);
  void removeEntry(unsigned int i, unsigned int j);
  bool copyRow(unsigned int sourceRow, unsigned int targetRow, bool ignoreProperties = false);
  void clearRow(unsigned int row);
  void clearCol(unsigned int col);
 
  bool hasEntry(unsigned int i, unsigned int j);

  bool setVline(int col = 1, int type = 1);
  bool setHline(int row = 1, int type = 1);
  bool clearVlines();
  bool clearHlines();
  void setColAlign(unsigned int i, TString align);

  bool expand(unsigned int i, unsigned int j);
  bool shrink();
  int cleanup();
  int clear();

  TString getRowAsCSV(int row, const TString& sep = ",");

  const TList& makeTList(const TString& sep = ",");
  TList* makeTListPtr(const TString& sep = ",");
  void setFromTList(TList& l);
  void setFromTList(TList* l);
  void setListContents(TList* l, const TString& sep);
  void addToListContents(TList* l, const TString& sep);
  
  int markDifferences(TQTable* other, const TString& color, int colID = -1, int rowID = -1, const TString& format="plain");

  operator const TList& (){
    return this->makeTList(",");
  }
 
  operator TList* (){
    return this->makeTListPtr(",");
  }

  TQTable* operator=(TList* l){
    this->clear();
    this->appendLines(l);
    return this;
  }
 
  TQTable& operator=(TList& l){
    this->clear();
    this->appendLines(&l);
    return *this;
  }
 
  TList* operator=(TQTable* t){
    return t->makeTListPtr();
  }
 
 
#ifdef __TQXSecParser__
  friend class TQXSecParser;
#endif

  ClassDefOverride(TQTable,2) // representation of a table

};




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