Merge remote-tracking branch 'origin/develop' into issues-58

This commit is contained in:
seleznevae 2020-11-30 20:11:06 +03:00
commit 15cd748016
11 changed files with 165 additions and 8 deletions

View File

@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.0)
project(libfort VERSION 0.4.2)
project(libfort VERSION 0.5.0)
string(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)"
"\\1.\\2" libfort_SOVERSION

View File

@ -1,4 +1,8 @@
## v0.4.3
## v0.5.0
### API
- Add function `ft_col_count()` to get number of columns in the table.
### Bug fixes

View File

@ -44,6 +44,7 @@ These pages contain the API documentation of **libfort** - simple library to cre
- @link ft_set_default_printf_field_separator ft_set_default_printf_field_separator @endlink -- Set field separator for ft_printf, ft_printf_ln
- @link ft_is_empty ft_is_empty @endlink -- check if table is empty
- @link ft_row_count ft_row_count @endlink -- get number of rows in the table
- @link ft_col_count ft_col_count @endlink -- get number of columns in the table
- @link ft_strerror ft_strerror @endlink -- get string describing the error code
- Data structures and types
@ -82,6 +83,7 @@ These pages contain the API documentation of **libfort** - simple library to cre
- @link fort::table::column column @endlink -- get column
- @link fort::table::is_empty is_empty @endlink -- check if table is empty
- @link fort::table::row_count row_count @endlink -- get number of rows in the table
- @link fort::table::col_count col_count @endlink -- get number of columns in the table
- @link fort::property_owner fort::property_owner @endlink -- base class for all objects (table, row, column, cell) for which user can specify properties
- Modify appearance

View File

@ -2829,6 +2829,19 @@ size_t ft_row_count(const ft_table_t *table)
return vector_size(table->rows);
}
size_t ft_col_count(const ft_table_t *table)
{
assert(table && table->rows);
size_t cols_n = 0;
size_t rows_n = vector_size(table->rows);
for (size_t i = 0; i < rows_n; ++i) {
f_row_t *row = VECTOR_AT(table->rows, i, f_row_t *);
size_t ncols = columns_in_row(row);
cols_n = MAX(cols_n, ncols);
}
return cols_n;
}
int ft_erase_range(ft_table_t *table,
size_t top_left_row, size_t top_left_col,
size_t bottom_right_row, size_t bottom_right_col)

View File

@ -45,9 +45,9 @@ SOFTWARE.
*****************************************************************************/
#define LIBFORT_MAJOR_VERSION 0
#define LIBFORT_MINOR_VERSION 4
#define LIBFORT_REVISION 2
#define LIBFORT_VERSION_STR "0.4.2"
#define LIBFORT_MINOR_VERSION 5
#define LIBFORT_REVISION 0
#define LIBFORT_VERSION_STR "0.5.0"
/*****************************************************************************
@ -370,6 +370,16 @@ int ft_is_empty(const ft_table_t *table);
*/
size_t ft_row_count(const ft_table_t *table);
/**
* Get number of columns in the table.
*
* @param table
* Pointer to formatted table.
* @return
* Number of columns in the table.
*/
size_t ft_col_count(const ft_table_t *table);
/**
* Erase range of cells.
*

View File

@ -1172,6 +1172,18 @@ public:
return ft_row_count(table_);
}
/**
* Get number of columns in the table.
*
* @return
* Number of columns in the table.
*/
std::size_t
col_count() const noexcept
{
return ft_col_count(table_);
}
/**
* Get current cell.
*

View File

@ -45,9 +45,9 @@ SOFTWARE.
*****************************************************************************/
#define LIBFORT_MAJOR_VERSION 0
#define LIBFORT_MINOR_VERSION 4
#define LIBFORT_REVISION 2
#define LIBFORT_VERSION_STR "0.4.2"
#define LIBFORT_MINOR_VERSION 5
#define LIBFORT_REVISION 0
#define LIBFORT_VERSION_STR "0.5.0"
/*****************************************************************************
@ -370,6 +370,16 @@ int ft_is_empty(const ft_table_t *table);
*/
size_t ft_row_count(const ft_table_t *table);
/**
* Get number of columns in the table.
*
* @param table
* Pointer to formatted table.
* @return
* Number of columns in the table.
*/
size_t ft_col_count(const ft_table_t *table);
/**
* Erase range of cells.
*

View File

@ -1172,6 +1172,18 @@ public:
return ft_row_count(table_);
}
/**
* Get number of columns in the table.
*
* @return
* Number of columns in the table.
*/
std::size_t
col_count() const noexcept
{
return ft_col_count(table_);
}
/**
* Get current cell.
*

View File

@ -233,6 +233,19 @@ size_t ft_row_count(const ft_table_t *table)
return vector_size(table->rows);
}
size_t ft_col_count(const ft_table_t *table)
{
assert(table && table->rows);
size_t cols_n = 0;
size_t rows_n = vector_size(table->rows);
for (size_t i = 0; i < rows_n; ++i) {
f_row_t *row = VECTOR_AT(table->rows, i, f_row_t *);
size_t ncols = columns_in_row(row);
cols_n = MAX(cols_n, ncols);
}
return cols_n;
}
int ft_erase_range(ft_table_t *table,
size_t top_left_row, size_t top_left_col,
size_t bottom_right_row, size_t bottom_right_col)

View File

@ -8,6 +8,7 @@ void test_vector_basic(void);
void test_vector_stress(void);
void test_string_buffer(void);
void test_table_sizes(void);
void test_table_counts(void);
void test_table_geometry(void);
void test_table_basic(void);
void test_table_copy(void);
@ -36,6 +37,7 @@ struct test_case wb_test_suite [] = {
{"test_vector_stress", test_vector_stress},
{"test_string_buffer", test_string_buffer},
{"test_table_sizes", test_table_sizes},
{"test_table_counts", test_table_counts},
{"test_table_geometry", test_table_geometry},
{"test_table_copy", test_table_copy},
};

View File

@ -51,6 +51,85 @@ void test_table_sizes(void)
}
void test_table_counts(void)
{
ft_table_t *table = ft_create_table();
assert_true(table != NULL);
assert_true(set_test_props_for_table(table) == FT_SUCCESS);
size_t rows = 0;
size_t cols = 0;
int empty = 0;
WHEN("Table is empty") {
empty = ft_is_empty(table);
rows = ft_row_count(table);
cols = ft_col_count(table);
assert_true(empty);
assert_true(rows == 0);
assert_true(cols == 0);
}
WHEN("Insert one cell") {
int n = ft_printf(table, "%s", "1");
assert_true(n == 1);
empty = ft_is_empty(table);
rows = ft_row_count(table);
cols = ft_col_count(table);
assert_true(!empty);
assert_true(rows == 1);
assert_true(cols == 1);
}
WHEN("Insert two cells in the same row") {
int n = ft_printf_ln(table, "%s|%s", "2", "3");
assert_true(n == 2);
empty = ft_is_empty(table);
rows = ft_row_count(table);
cols = ft_col_count(table);
assert_true(!empty);
assert_true(rows == 1);
assert_true(cols == 3);
}
WHEN("Insert one cell in the next row") {
int status = ft_write(table, "hello");
assert_true(FT_IS_SUCCESS(status));
empty = ft_is_empty(table);
rows = ft_row_count(table);
cols = ft_col_count(table);
assert_true(!empty);
assert_true(rows == 2);
assert_true(cols == 3);
}
WHEN("Delete first row") {
int status = ft_erase_range(table, 0, 0, 0, DEFAULT_VECTOR_CAPACITY);
assert_true(FT_IS_SUCCESS(status));
empty = ft_is_empty(table);
rows = ft_row_count(table);
cols = ft_col_count(table);
assert_true(!empty);
assert_true(rows == 1);
assert_true(cols == 1);
}
WHEN("Delete second/last row") {
int status = ft_erase_range(table, 0, 0, 0, DEFAULT_VECTOR_CAPACITY);
assert_true(FT_IS_SUCCESS(status));
empty = ft_is_empty(table);
rows = ft_row_count(table);
cols = ft_col_count(table);
assert_true(empty);
assert_true(rows == 0);
assert_true(cols == 0);
}
ft_destroy_table(table);
}
void test_table_geometry(void)
{
ft_table_t *table = ft_create_table();