[A] Added more documentation
This commit is contained in:
parent
04426825df
commit
41dbab83af
@ -79,7 +79,7 @@ void fill_table_with_data_example(void)
|
|||||||
|
|
||||||
/* Fill row with data from the container */
|
/* Fill row with data from the container */
|
||||||
std::vector<std::string> arr = {"3", "Earth", "29.78", "288"};
|
std::vector<std::string> arr = {"3", "Earth", "29.78", "288"};
|
||||||
table.row_write_ln(std::begin(arr), std::end(arr));
|
table.range_write_ln(std::begin(arr), std::end(arr));
|
||||||
|
|
||||||
std::cout << table.to_string() << std::endl;
|
std::cout << table.to_string() << std::endl;
|
||||||
}
|
}
|
||||||
|
204
lib/fort.hpp
204
lib/fort.hpp
@ -43,22 +43,26 @@ SOFTWARE.
|
|||||||
namespace fort
|
namespace fort
|
||||||
{
|
{
|
||||||
|
|
||||||
enum class cell_property {
|
/**
|
||||||
pr1,
|
* Alignment of cell content.
|
||||||
pr2
|
*/
|
||||||
};
|
|
||||||
|
|
||||||
enum class text_align {
|
enum class text_align {
|
||||||
left = FT_ALIGNED_LEFT,
|
left = FT_ALIGNED_LEFT,
|
||||||
center = FT_ALIGNED_CENTER,
|
center = FT_ALIGNED_CENTER,
|
||||||
right = FT_ALIGNED_RIGHT
|
right = FT_ALIGNED_RIGHT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type of table row. Determines appearance of row.
|
||||||
|
*/
|
||||||
enum class row_type {
|
enum class row_type {
|
||||||
common = FT_ROW_COMMON,
|
common = FT_ROW_COMMON,
|
||||||
header = FT_ROW_HEADER
|
header = FT_ROW_HEADER
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Colors.
|
||||||
|
*/
|
||||||
enum class color {
|
enum class color {
|
||||||
default_color = FT_COLOR_DEFAULT,
|
default_color = FT_COLOR_DEFAULT,
|
||||||
black = FT_COLOR_BLACK,
|
black = FT_COLOR_BLACK,
|
||||||
@ -79,6 +83,9 @@ enum class color {
|
|||||||
light_whyte = FT_COLOR_LIGHT_WHYTE
|
light_whyte = FT_COLOR_LIGHT_WHYTE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Text styles.
|
||||||
|
*/
|
||||||
enum class text_style {
|
enum class text_style {
|
||||||
default_style = FT_TSTYLE_DEFAULT,
|
default_style = FT_TSTYLE_DEFAULT,
|
||||||
bold = FT_TSTYLE_BOLD,
|
bold = FT_TSTYLE_BOLD,
|
||||||
@ -90,6 +97,12 @@ enum class text_style {
|
|||||||
hidden = FT_TSTYLE_HIDDEN
|
hidden = FT_TSTYLE_HIDDEN
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Table manipulator.
|
||||||
|
*
|
||||||
|
* Table manipulators can be used to change current cell and change appearance
|
||||||
|
* of cells.
|
||||||
|
*/
|
||||||
class table_manipulator {
|
class table_manipulator {
|
||||||
public:
|
public:
|
||||||
explicit table_manipulator(int i)
|
explicit table_manipulator(int i)
|
||||||
@ -101,16 +114,32 @@ private:
|
|||||||
int value;
|
int value;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Table manipulator to set current row as a header.
|
||||||
|
*/
|
||||||
const table_manipulator header(0);
|
const table_manipulator header(0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Table manipulator to move current cell to the first cell of the next row.
|
||||||
|
*/
|
||||||
const table_manipulator endr(1);
|
const table_manipulator endr(1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Table manipulator to add separator to the table.
|
||||||
|
*/
|
||||||
const table_manipulator separator(2);
|
const table_manipulator separator(2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Property owner.
|
||||||
|
*
|
||||||
|
* property_owner is a base class for all objects (table, row, column, cell) for
|
||||||
|
* which user can specify properties.
|
||||||
|
*/
|
||||||
template <typename table>
|
template <typename table>
|
||||||
class property_setter {
|
class property_owner {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
property_setter(std::size_t row_idx, std::size_t coll_idx, table *tbl, bool def = false)
|
property_owner(std::size_t row_idx, std::size_t coll_idx, table *tbl, bool def = false)
|
||||||
:ps_row_idx_(row_idx), ps_coll_idx_(coll_idx),
|
:ps_row_idx_(row_idx), ps_coll_idx_(coll_idx),
|
||||||
ps_table_(tbl), set_default_properties_(def) {}
|
ps_table_(tbl), set_default_properties_(def) {}
|
||||||
|
|
||||||
@ -331,20 +360,27 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Table - formatted table.
|
* Formatted table.
|
||||||
*
|
*
|
||||||
* Table class is a C++ wrapper around struct ft_table.
|
* Table class is a C++ wrapper around struct ft_table.
|
||||||
*/
|
*/
|
||||||
class table: public property_setter<table> {
|
class table: public property_owner<table> {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor.
|
||||||
|
*/
|
||||||
table()
|
table()
|
||||||
:property_setter(FT_ANY_ROW, FT_ANY_COLUMN, this), table_(ft_create_table())
|
:property_owner(FT_ANY_ROW, FT_ANY_COLUMN, this), table_(ft_create_table())
|
||||||
{
|
{
|
||||||
|
|
||||||
if (table_ == NULL)
|
if (table_ == NULL)
|
||||||
throw std::runtime_error("Runtime error");
|
throw std::runtime_error("Libfort runtime error");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destructor.
|
||||||
|
*/
|
||||||
~table()
|
~table()
|
||||||
{
|
{
|
||||||
ft_destroy_table(table_);
|
ft_destroy_table(table_);
|
||||||
@ -354,12 +390,12 @@ public:
|
|||||||
* Copy contstructor.
|
* Copy contstructor.
|
||||||
*/
|
*/
|
||||||
table(const table& tbl)
|
table(const table& tbl)
|
||||||
:property_setter(FT_ANY_ROW, FT_ANY_COLUMN, this), table_(NULL)
|
:property_owner(FT_ANY_ROW, FT_ANY_COLUMN, this), table_(NULL)
|
||||||
{
|
{
|
||||||
if (tbl.table_) {
|
if (tbl.table_) {
|
||||||
ft_table_t *table_copy = ft_copy_table(tbl.table_);
|
ft_table_t *table_copy = ft_copy_table(tbl.table_);
|
||||||
if (table_copy == NULL)
|
if (table_copy == NULL)
|
||||||
throw std::runtime_error("Runtime error");
|
throw std::runtime_error("Libfort runtime error");
|
||||||
|
|
||||||
stream_.str(std::string());
|
stream_.str(std::string());
|
||||||
if (tbl.stream_.tellp() >= 0) {
|
if (tbl.stream_.tellp() >= 0) {
|
||||||
@ -373,7 +409,7 @@ public:
|
|||||||
* Move contstructor.
|
* Move contstructor.
|
||||||
*/
|
*/
|
||||||
table(table&& tbl)
|
table(table&& tbl)
|
||||||
:property_setter(FT_ANY_ROW, FT_ANY_COLUMN, this), table_(tbl.table_)
|
:property_owner(FT_ANY_ROW, FT_ANY_COLUMN, this), table_(tbl.table_)
|
||||||
{
|
{
|
||||||
if (tbl.stream_.tellp() >= 0) {
|
if (tbl.stream_.tellp() >= 0) {
|
||||||
stream_ << tbl.stream_.str();
|
stream_ << tbl.stream_.str();
|
||||||
@ -393,7 +429,7 @@ public:
|
|||||||
if (tbl.table_) {
|
if (tbl.table_) {
|
||||||
ft_table_t *table_copy = ft_copy_table(tbl.table_);
|
ft_table_t *table_copy = ft_copy_table(tbl.table_);
|
||||||
if (table_copy == NULL)
|
if (table_copy == NULL)
|
||||||
throw std::runtime_error("Runtime error");
|
throw std::runtime_error("Libfort runtime error");
|
||||||
|
|
||||||
stream_.str(std::string());
|
stream_.str(std::string());
|
||||||
if (tbl.stream_.tellp() >= 0) {
|
if (tbl.stream_.tellp() >= 0) {
|
||||||
@ -437,7 +473,7 @@ public:
|
|||||||
{
|
{
|
||||||
const char *str = ft_to_string(table_);
|
const char *str = ft_to_string(table_);
|
||||||
if (str == NULL)
|
if (str == NULL)
|
||||||
throw std::runtime_error("Runtime error");
|
throw std::runtime_error("Libfort runtime error");
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -494,37 +530,112 @@ public:
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write string to the the table.
|
||||||
|
*
|
||||||
|
* Write specified string to the current cell.
|
||||||
|
*
|
||||||
|
* @param str
|
||||||
|
* String to write.
|
||||||
|
* @return
|
||||||
|
* - 0: Success; data were written
|
||||||
|
* - (<0): In case of error
|
||||||
|
*/
|
||||||
bool write(const char *str)
|
bool write(const char *str)
|
||||||
{
|
{
|
||||||
return FT_IS_SUCCESS(ft_write(table_, str));
|
return FT_IS_SUCCESS(ft_write(table_, str));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write string to the the table and go to the next line.
|
||||||
|
*
|
||||||
|
* Write specified string to the current cell and move current position to
|
||||||
|
* the first cell of the next line(row).
|
||||||
|
*
|
||||||
|
* @param str
|
||||||
|
* String to write.
|
||||||
|
* @return
|
||||||
|
* - 0: Success; data were written
|
||||||
|
* - (<0): In case of error
|
||||||
|
*/
|
||||||
bool write_ln(const char *str)
|
bool write_ln(const char *str)
|
||||||
{
|
{
|
||||||
return FT_IS_SUCCESS(ft_write_ln(table_, str));
|
return FT_IS_SUCCESS(ft_write_ln(table_, str));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write string to the the table.
|
||||||
|
*
|
||||||
|
* Write specified string to the current cell.
|
||||||
|
*
|
||||||
|
* @param str
|
||||||
|
* String to write.
|
||||||
|
* @return
|
||||||
|
* - 0: Success; data were written
|
||||||
|
* - (<0): In case of error
|
||||||
|
*/
|
||||||
bool write(const std::string &str)
|
bool write(const std::string &str)
|
||||||
{
|
{
|
||||||
return write(str.c_str());
|
return write(str.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write string to the the table and go to the next line.
|
||||||
|
*
|
||||||
|
* Write specified string to the current cell and move current position to
|
||||||
|
* the first cell of the next line(row).
|
||||||
|
*
|
||||||
|
* @param str
|
||||||
|
* String to write.
|
||||||
|
* @return
|
||||||
|
* - 0: Success; data were written
|
||||||
|
* - (<0): In case of error
|
||||||
|
*/
|
||||||
bool write_ln(const std::string &str)
|
bool write_ln(const std::string &str)
|
||||||
{
|
{
|
||||||
return write_ln(str.c_str());
|
return write_ln(str.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __cpp_variadic_templates
|
#ifdef __cpp_variadic_templates
|
||||||
|
/**
|
||||||
|
* Write strings to the table.
|
||||||
|
*
|
||||||
|
* Write specified strings to the same number of consecutive cells in the
|
||||||
|
* current row.
|
||||||
|
*
|
||||||
|
* @param str
|
||||||
|
* String to write.
|
||||||
|
* @param strings
|
||||||
|
* Strings to write.
|
||||||
|
* @return
|
||||||
|
* - 0: Success; data were written
|
||||||
|
* - (<0): In case of error
|
||||||
|
*/
|
||||||
template <typename T, typename ...Ts>
|
template <typename T, typename ...Ts>
|
||||||
bool write(const T &arg, const Ts &...args)
|
bool write(const T &str, const Ts &...strings)
|
||||||
{
|
{
|
||||||
return write(arg) && write(args...);
|
return write(str) && write(strings...);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write strings to the table and go to the next line.
|
||||||
|
*
|
||||||
|
* Write specified strings to the same number of consecutive cells in the
|
||||||
|
* current row and move current position to the first cell of the next
|
||||||
|
* line(row).
|
||||||
|
*
|
||||||
|
* @param str
|
||||||
|
* String to write.
|
||||||
|
* @param strings
|
||||||
|
* Strings to write.
|
||||||
|
* @return
|
||||||
|
* - 0: Success; data were written
|
||||||
|
* - (<0): In case of error
|
||||||
|
*/
|
||||||
template <typename T, typename ...Ts>
|
template <typename T, typename ...Ts>
|
||||||
bool write_ln(const T &arg, const Ts &...args)
|
bool write_ln(const T &str, const Ts &...strings)
|
||||||
{
|
{
|
||||||
return write(arg) && write_ln(args...);
|
return write(str) && write_ln(strings...);
|
||||||
}
|
}
|
||||||
#else /* __cpp_variadic_templates */
|
#else /* __cpp_variadic_templates */
|
||||||
|
|
||||||
@ -615,9 +726,19 @@ public:
|
|||||||
|
|
||||||
#endif /* __cpp_variadic_templates */
|
#endif /* __cpp_variadic_templates */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write elements from range to the table.
|
||||||
|
*
|
||||||
|
* Write objects from range to consecutive cells in the current row.
|
||||||
|
*
|
||||||
|
* @param first, last
|
||||||
|
* Range of elements.
|
||||||
|
* @return
|
||||||
|
* - 0: Success; data were written
|
||||||
|
* - (<0): In case of error
|
||||||
|
*/
|
||||||
template <typename InputIt>
|
template <typename InputIt>
|
||||||
bool row_write(InputIt first, InputIt last)
|
bool range_write(InputIt first, InputIt last)
|
||||||
{
|
{
|
||||||
while (first != last) {
|
while (first != last) {
|
||||||
*this << *first;
|
*this << *first;
|
||||||
@ -626,8 +747,20 @@ public:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write elements from range to the table and go to the next line.
|
||||||
|
*
|
||||||
|
* Write objects from range to consecutive cells in the current row and
|
||||||
|
* move current position to the first cell of the next line(row).
|
||||||
|
*
|
||||||
|
* @param first, last
|
||||||
|
* Range of elements.
|
||||||
|
* @return
|
||||||
|
* - 0: Success; data were written
|
||||||
|
* - (<0): In case of error
|
||||||
|
*/
|
||||||
template <typename InputIt>
|
template <typename InputIt>
|
||||||
bool row_write_ln(InputIt first, InputIt last)
|
bool range_write_ln(InputIt first, InputIt last)
|
||||||
{
|
{
|
||||||
while (first != last) {
|
while (first != last) {
|
||||||
*this << *first;
|
*this << *first;
|
||||||
@ -725,7 +858,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
ft_table_t *table_;
|
ft_table_t *table_;
|
||||||
mutable std::stringstream stream_;
|
mutable std::stringstream stream_;
|
||||||
friend class property_setter<table>;
|
friend class property_owner<table>;
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -733,11 +866,11 @@ public:
|
|||||||
/* Iterators */
|
/* Iterators */
|
||||||
/* todo: implement chains like table[0][0] = table [0][1] = "somethings" */
|
/* todo: implement chains like table[0][0] = table [0][1] = "somethings" */
|
||||||
|
|
||||||
class table_cell_iterator: public property_setter<table>
|
class table_cell_iterator: public property_owner<table>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
table_cell_iterator(std::size_t row_idx, std::size_t coll_idx, table &tbl)
|
table_cell_iterator(std::size_t row_idx, std::size_t coll_idx, table &tbl)
|
||||||
:property_setter(row_idx, coll_idx, &tbl) {}
|
:property_owner(row_idx, coll_idx, &tbl) {}
|
||||||
|
|
||||||
table_cell_iterator& operator=(const char *str)
|
table_cell_iterator& operator=(const char *str)
|
||||||
{
|
{
|
||||||
@ -745,13 +878,18 @@ public:
|
|||||||
ps_table_->write(str);
|
ps_table_->write(str);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table_cell_iterator& operator=(const std::string &str)
|
||||||
|
{
|
||||||
|
return operator=(str.c_str());
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class table_row_iterator: public property_setter<table>
|
class table_row_iterator: public property_owner<table>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
table_row_iterator(std::size_t row_idx, table &tbl)
|
table_row_iterator(std::size_t row_idx, table &tbl)
|
||||||
:property_setter(row_idx, FT_ANY_COLUMN, &tbl) {}
|
:property_owner(row_idx, FT_ANY_COLUMN, &tbl) {}
|
||||||
|
|
||||||
class table_cell_iterator
|
class table_cell_iterator
|
||||||
operator[](std::size_t coll_idx)
|
operator[](std::size_t coll_idx)
|
||||||
@ -760,18 +898,18 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class table_column_iterator: public property_setter<table>
|
class table_column_iterator: public property_owner<table>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
table_column_iterator(std::size_t col_idx, table &tbl)
|
table_column_iterator(std::size_t col_idx, table &tbl)
|
||||||
:property_setter(FT_ANY_ROW, col_idx, &tbl) {}
|
:property_owner(FT_ANY_ROW, col_idx, &tbl) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class default_properties: public property_setter<table>
|
class default_properties: public property_owner<table>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
default_properties(table *tbl)
|
default_properties(table *tbl)
|
||||||
:property_setter(FT_ANY_ROW, FT_ANY_COLUMN, tbl, true) {}
|
:property_owner(FT_ANY_ROW, FT_ANY_COLUMN, tbl, true) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class table_row_iterator
|
class table_row_iterator
|
||||||
|
@ -172,7 +172,7 @@ void test_cpp_table_write(void)
|
|||||||
|
|
||||||
/* Replace old values */
|
/* Replace old values */
|
||||||
table[1][1] = "234";
|
table[1][1] = "234";
|
||||||
assert_true(table.write("3.140000"));
|
table[1][2] = std::string("3.140000");
|
||||||
assert_true(table.write_ln("3"));
|
assert_true(table.write_ln("3"));
|
||||||
|
|
||||||
std::string table_str = table.to_string();
|
std::string table_str = table.to_string();
|
||||||
@ -225,7 +225,7 @@ void test_cpp_table_write(void)
|
|||||||
assert_string_equal(table_str, table_str_etalon);
|
assert_string_equal(table_str, table_str_etalon);
|
||||||
}
|
}
|
||||||
|
|
||||||
SCENARIO("Test row_write functions") {
|
SCENARIO("Test range_write functions") {
|
||||||
fort::table table;
|
fort::table table;
|
||||||
assert_true(set_cpp_test_props_for_table(&table));
|
assert_true(set_cpp_test_props_for_table(&table));
|
||||||
|
|
||||||
@ -233,15 +233,15 @@ void test_cpp_table_write(void)
|
|||||||
const char *row_0[4] = {"3", "c", "234", "3.140000"};
|
const char *row_0[4] = {"3", "c", "234", "3.140000"};
|
||||||
const char *row_1[4] = {"c", "235", "3.150000", "5"};
|
const char *row_1[4] = {"c", "235", "3.150000", "5"};
|
||||||
const char *row_2[4] = {"234", "3.140000", "3", "c"};
|
const char *row_2[4] = {"234", "3.140000", "3", "c"};
|
||||||
assert_true(table.row_write_ln(std::begin(row_0), std::end(row_0)));
|
assert_true(table.range_write_ln(std::begin(row_0), std::end(row_0)));
|
||||||
assert_true(table.row_write(std::begin(row_1), std::end(row_1)));
|
assert_true(table.range_write(std::begin(row_1), std::end(row_1)));
|
||||||
table << fort::endr;
|
table << fort::endr;
|
||||||
assert_true(table.row_write_ln(std::begin(row_2), std::end(row_2)));
|
assert_true(table.range_write_ln(std::begin(row_2), std::end(row_2)));
|
||||||
|
|
||||||
/* Replace old values */
|
/* Replace old values */
|
||||||
table[1][1] = "234";
|
table[1][1] = "234";
|
||||||
const char *row_11[3] = {"3.140000", "3"};
|
const char *row_11[3] = {"3.140000", "3"};
|
||||||
assert_true(table.row_write_ln(std::begin(row_11), std::end(row_11)));
|
assert_true(table.range_write_ln(std::begin(row_11), std::end(row_11)));
|
||||||
|
|
||||||
|
|
||||||
std::string table_str = table.to_string();
|
std::string table_str = table.to_string();
|
||||||
|
Loading…
Reference in New Issue
Block a user