|
Contents: Search: | TableOverviewThe table is the kind of output returned from all MQL statements which return something, except for "SELECT (ALL|FOCUS) OBJECTS", which returns a sheaf. A table is a list of TableRows. A TableRow, in turn, is a list of strings. The columns are numbered beginning with 1, not 0. Java-style iterators are provided for accessing the rows and their contents. C++ interface
#include <table.h>
typedef enum {
kTCString,
kTCInteger,
kTCID_D,
kTCMonad_m,
kTCBool,
kTCEnum
} TableColumnType;
class TableRowIterator {
public:
TableRowIterator(TableRow *pMotherTableRow);
TableRowIterator();
~TableRowIterator();
bool hasNext() const; // Is the iterator == end iterator? Doesn't alter iterator
std::string next(); // Gets current and advances iterator afterwards
std::string previous(); // Regresses iterator and then gets current
std::string current(); // Gets current without altering iterator
std::string getColumn(int column); // Gets column in current without touching iterator. First column is 1.
};
class TableRow : public std::list<std::string> {
public:
TableRow();
~TableRow();
TableRowIterator iterator(); // Gets iterator pointing to beginning
std::string getColumn(int column); // Gets column. First column is 1.
unsigned int size() const; // Gets number of columns
};
class TableIterator {
public:
TableIterator();
TableIterator(Table *pMotherTable);
TableIterator(const TableIterator& other);
~TableIterator();
bool hasNext() const; // Is the iterator == end iterator? Doesn't alter iterator
TableRow& next(); // Gets current and advances iterator afterwards
TableRow& previous(); // Regresses iterator and then gets current
TableRow& current(); // Gets current without altering iterator
std::string next(int column); // Gets column in current and then advances iterator
std::string getColumn(int column); // Gets column in current without altering iterator. First column is 1.
};
class Table {
public:
Table();
~Table();
// Reading from a table
TableIterator iterator();
// Find row with string str at column column_index. First column is 1.
TableIterator find(const std::string& str, int column_index,
bool bCompareCaseInsensitively = true);
// Find row with str1 and str2 at their respective columns. First column is 1.
TableIterator find(const std::string& str1, int column_index1,
const std::string& str2, int column_index2,
bool bCompareCaseInsensitively = true);
void erase(TableIterator& d);
void clear();
// First column is 1.
std::string getColumn(TableIterator& i, int column_index);
long size() const; // Get number of rows
// Adding to a table
void append(const std::string& str);
void newline();
void appendHeader(std::string header_name,
TableColumnType tc_type,
std::string enum_type = "");
// First column is 1.
void updateRow(TableIterator& i, const std::string new_value, int column_index);
// Should be called before append.
void startNewRow();
// Printing a table
void printConsole(EMdFOutput *pOut) const;
void printXML(EMdFOutput *pOut) const;
static void printDTD(EMdFOutput *pOut);
};
ExamplesIterators (reading from a table)Here is an example of how to use the iterators.
Table *pTable; // Assumed to be initialized from somewhere
// Get first string of first row
TableIterator ti = pTable->iterator();
std::string firstRowCol = pTable->getColumn(ti, 1); // Note how column 1 is the first.
// out table
ti = pTable->iterator();
while (ti.hasNext()) {
// Get iterator for current row
TableRowIterator tri = ti.current().iterator();
// out row
while (tri.hasNext()) {
// out string plus horizontal tab, and advance iterator
printf("%s\t", tri.next());
}
// out newline
printf("\n");
// Advance iterator
ti.next();
}
// Find something in table
int column_to_search = 2;
TableIterator ti2 = pTable->find("StringToFind", column_to_search);
if (ti2.hasNext()) {
printf("String found!\n");
TableRow& tr = ti.current();
printf("Column 1 = '%s'\n", tr.getColumn(1));
} else {
printf("String not found.\n");
}
Adding to a tableHere's an example of how to add to a table:
// Create header (not really necessary if you know what you've
// placed into the table; mostly for aesthetics when printing
// and for communicating with other parts of the program)
pTable->appendHeader("first_monad", kTCMonad_m);
pTable->appendHeader("last_monad", kTCMonad_m);
// Start a new row (call this method before starting a new row)
pTable->startNewRow();
// Add row 1
pTable->append(1); // Monad 1 in first_monad
pTable->append(4); // Monad 4 in last_monad
// Add row 2
pTable->startNewRow();
pTable->append(10); // Monad 10 in first_monad
pTable->append(13); // Monad 13 in last_monad
|