[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[lmi-commits] [lmi] master 8c3993c 2/3: Replace page_count(args) with pa
From: |
Greg Chicares |
Subject: |
[lmi-commits] [lmi] master 8c3993c 2/3: Replace page_count(args) with paginator(args).page_count() |
Date: |
Mon, 3 Sep 2018 17:39:19 -0400 (EDT) |
branch: master
commit 8c3993c1197bc6a808dd7f68808bb0e453f9729c
Author: Gregory W. Chicares <address@hidden>
Commit: Gregory W. Chicares <address@hidden>
Replace page_count(args) with paginator(args).page_count()
Deferred replacing locals in ctor with members, to simplify review.
---
ledger_pdf_generator_wx.cpp | 11 ++----
report_table.cpp | 52 +++++++-------------------
report_table.hpp | 50 ++++++++++++++++++++++---
report_table_test.cpp | 90 ++++++++++++++++++++++-----------------------
4 files changed, 106 insertions(+), 97 deletions(-)
diff --git a/ledger_pdf_generator_wx.cpp b/ledger_pdf_generator_wx.cpp
index 659054a..b04c6c9 100644
--- a/ledger_pdf_generator_wx.cpp
+++ b/ledger_pdf_generator_wx.cpp
@@ -39,7 +39,7 @@
#include "miscellany.hpp" // lmi_tolower()
#include "oecumenic_enumerations.hpp"
#include "pdf_writer_wx.hpp"
-#include "report_table.hpp" // page_count()
+#include "report_table.hpp" // paginator
#include "ssize_lmi.hpp"
#include "wx_table_generator.hpp"
@@ -1788,12 +1788,9 @@ class page_with_tabular_report
throw std::runtime_error("no space left for tabular report");
}
- // We return the number of extra pages only, hence -1.
- return page_count
- (ledger.GetMaxLength()
- ,rows_per_group
- ,lines_per_page
- ) - 1;
+ paginator z(ledger.GetMaxLength(), rows_per_group, lines_per_page);
+ // "- 1": return the number of *extra* pages.
+ return z.page_count() - 1;
}
};
diff --git a/report_table.cpp b/report_table.cpp
index 8869ba7..6cfc220 100644
--- a/report_table.cpp
+++ b/report_table.cpp
@@ -175,45 +175,13 @@ std::vector<int> set_column_widths
return w;
}
-/// Number of pages needed to display the given number of data
-/// rows in groups of the given size separated by blank lines.
-///
-/// Nomenclature:
-/// - a 'line' is a printable zone of unit height;
-/// - a 'row' is a series of data to be shown side by side.
-/// With quinquennial spacing, the Morse alphabet is printed thus:
-///
-/// A .- line 0 row 0
-/// B -... line 1 row 1
-/// C -.-. line 2 row 2
-/// D -.. line 3 row 3
-/// E . line 4 row 4
-/// [blank] line 5
-/// F ..-. line 6 row 5
-/// G --. line 7 row 6
-/// ...
-/// Z --.. line 30 row 25
-///
-/// with a page length of 50 lines. With a page length of 25 lines,
-/// the first page would end with
-/// T - line 22 row 19
-/// and the second page would be printed thus:
-///
-/// U ..- line 0 row 20
-/// V ...- line 1 row 21
-/// W .-- line 2 row 22
-/// X -..- line 3 row 23
-/// Y -.-- line 4 row 24
-/// [blank] line 5
-/// Z --.. line 6 row 25
-///
/// Preconditions: 0 <= total_rows && 0 < rows_per_group <= lines_per_page
-int page_count
- (int total_rows
- ,int rows_per_group
- ,int lines_per_page
- )
+paginator::paginator(int total_rows, int rows_per_group, int lines_per_page)
+ :total_rows_ {total_rows}
+ ,rows_per_group_ {rows_per_group}
+ ,lines_per_page_ {lines_per_page}
+ ,page_count_ {1}
{
LMI_ASSERT(0 <= total_rows);
LMI_ASSERT(0 < rows_per_group );
@@ -221,7 +189,7 @@ int page_count
// If there are zero rows of data, then one empty page is wanted.
if(0 == total_rows)
- return 1;
+ return;
// "+ 1": blank-line separator after each group.
int const lines_per_group = rows_per_group + 1;
@@ -245,6 +213,12 @@ int page_count
--number_of_pages;
}
}
+ page_count_ = number_of_pages;
+}
- return number_of_pages;
+/// Number of pages required.
+
+int paginator::page_count() const
+{
+ return page_count_;
}
diff --git a/report_table.hpp b/report_table.hpp
index 1ff00c8..fb1ad77 100644
--- a/report_table.hpp
+++ b/report_table.hpp
@@ -103,12 +103,50 @@ std::vector<int> LMI_SO set_column_widths
,int minimum_margin
);
-class paginator; // Coming soon.
+/// Display table rows in groups separated by blank lines.
+///
+/// Nomenclature:
+/// - a 'line' is a printable zone of unit height;
+/// - a 'row' is a series of data to be shown side by side.
+/// With quinquennial spacing, the Morse alphabet is printed thus:
+///
+/// A .- line 0 row 0
+/// B -... line 1 row 1
+/// C -.-. line 2 row 2
+/// D -.. line 3 row 3
+/// E . line 4 row 4
+/// [blank] line 5
+/// F ..-. line 6 row 5
+/// G --. line 7 row 6
+/// ...
+/// Z --.. line 30 row 25
+///
+/// with a page length of 50 lines. With a page length of 25 lines,
+/// the first page would end with
+/// T - line 22 row 19
+/// and the second page would be printed thus:
+///
+/// U ..- line 0 row 20
+/// V ...- line 1 row 21
+/// W .-- line 2 row 22
+/// X -..- line 3 row 23
+/// Y -.-- line 4 row 24
+/// [blank] line 5
+/// Z --.. line 6 row 25
-int LMI_SO page_count
- (int total_rows
- ,int rows_per_group
- ,int lines_per_page
- );
+class LMI_SO paginator
+{
+ public:
+ paginator(int total_rows, int rows_per_group, int lines_per_page);
+
+ int page_count() const;
+
+ private:
+ int const total_rows_;
+ int const rows_per_group_;
+ int const lines_per_page_;
+
+ int page_count_;
+};
#endif // report_table_hpp
diff --git a/report_table_test.cpp b/report_table_test.cpp
index 149d7e3..2c4f5e0 100644
--- a/report_table_test.cpp
+++ b/report_table_test.cpp
@@ -410,92 +410,92 @@ void report_table_test::test_paginator()
// Original tests: vary only the number of data rows.
// Edge cases.
- BOOST_TEST_EQUAL(1, page_count( 0, 5, 28));
- BOOST_TEST_EQUAL(1, page_count( 1, 5, 28));
+ BOOST_TEST_EQUAL(1, paginator( 0, 5, 28).page_count());
+ BOOST_TEST_EQUAL(1, paginator( 1, 5, 28).page_count());
// Just a trivial sanity test.
- BOOST_TEST_EQUAL(1, page_count(17, 5, 28));
+ BOOST_TEST_EQUAL(1, paginator(17, 5, 28).page_count());
// 4 full groups + incomplete last group.
- BOOST_TEST_EQUAL(1, page_count(24, 5, 28));
+ BOOST_TEST_EQUAL(1, paginator(24, 5, 28).page_count());
// 5 full groups don't fit on one page.
- BOOST_TEST_EQUAL(2, page_count(25, 5, 28));
+ BOOST_TEST_EQUAL(2, paginator(25, 5, 28).page_count());
// 4 + 4 groups + incomplete last one.
- BOOST_TEST_EQUAL(2, page_count(44, 5, 28));
+ BOOST_TEST_EQUAL(2, paginator(44, 5, 28).page_count());
// 9 full groups don't fit on two pages.
- BOOST_TEST_EQUAL(3, page_count(45, 5, 28));
+ BOOST_TEST_EQUAL(3, paginator(45, 5, 28).page_count());
// Test preconditions.
// Negative number of data rows.
BOOST_TEST_THROW
- (page_count(-1, 1, 1)
+ (paginator(-1, 1, 1)
,std::runtime_error
,lmi_test::what_regex("^Assertion.*failed")
);
// Zero rows per group.
BOOST_TEST_THROW
- (page_count(1, 0, 1)
+ (paginator(1, 0, 1)
,std::runtime_error
,lmi_test::what_regex("^Assertion.*failed")
);
// Insufficient room to print even one group.
BOOST_TEST_THROW
- (page_count(1, 7, 3)
+ (paginator(1, 7, 3)
,std::runtime_error
,lmi_test::what_regex("^Assertion.*failed")
);
// A single row of data.
- BOOST_TEST_EQUAL(1, page_count(1, 1, 1));
- BOOST_TEST_EQUAL(1, page_count(1, 1, 3));
- BOOST_TEST_EQUAL(1, page_count(1, 3, 3));
- BOOST_TEST_EQUAL(1, page_count(1, 3, 7));
+ BOOST_TEST_EQUAL(1, paginator(1, 1, 1).page_count());
+ BOOST_TEST_EQUAL(1, paginator(1, 1, 3).page_count());
+ BOOST_TEST_EQUAL(1, paginator(1, 3, 3).page_count());
+ BOOST_TEST_EQUAL(1, paginator(1, 3, 7).page_count());
// One-row groups:
// Page length an odd number.
- BOOST_TEST_EQUAL(1, page_count(1, 1, 5));
- BOOST_TEST_EQUAL(1, page_count(3, 1, 5));
- BOOST_TEST_EQUAL(2, page_count(4, 1, 5));
- BOOST_TEST_EQUAL(2, page_count(6, 1, 5));
- BOOST_TEST_EQUAL(3, page_count(7, 1, 5));
+ BOOST_TEST_EQUAL(1, paginator(1, 1, 5).page_count());
+ BOOST_TEST_EQUAL(1, paginator(3, 1, 5).page_count());
+ BOOST_TEST_EQUAL(2, paginator(4, 1, 5).page_count());
+ BOOST_TEST_EQUAL(2, paginator(6, 1, 5).page_count());
+ BOOST_TEST_EQUAL(3, paginator(7, 1, 5).page_count());
// Same, but next even length: same outcome.
- BOOST_TEST_EQUAL(1, page_count(1, 1, 6));
- BOOST_TEST_EQUAL(1, page_count(3, 1, 6));
- BOOST_TEST_EQUAL(2, page_count(4, 1, 6));
- BOOST_TEST_EQUAL(2, page_count(6, 1, 6));
- BOOST_TEST_EQUAL(3, page_count(7, 1, 6));
+ BOOST_TEST_EQUAL(1, paginator(1, 1, 6).page_count());
+ BOOST_TEST_EQUAL(1, paginator(3, 1, 6).page_count());
+ BOOST_TEST_EQUAL(2, paginator(4, 1, 6).page_count());
+ BOOST_TEST_EQUAL(2, paginator(6, 1, 6).page_count());
+ BOOST_TEST_EQUAL(3, paginator(7, 1, 6).page_count());
// Two-row groups.
// Page length four.
- BOOST_TEST_EQUAL(1, page_count(1, 2, 4));
- BOOST_TEST_EQUAL(1, page_count(3, 2, 4));
- BOOST_TEST_EQUAL(2, page_count(4, 2, 4));
- BOOST_TEST_EQUAL(2, page_count(5, 2, 4));
- BOOST_TEST_EQUAL(3, page_count(6, 2, 4));
+ BOOST_TEST_EQUAL(1, paginator(1, 2, 4).page_count());
+ BOOST_TEST_EQUAL(1, paginator(3, 2, 4).page_count());
+ BOOST_TEST_EQUAL(2, paginator(4, 2, 4).page_count());
+ BOOST_TEST_EQUAL(2, paginator(5, 2, 4).page_count());
+ BOOST_TEST_EQUAL(3, paginator(6, 2, 4).page_count());
// Page length five: no room for widow and orphan control.
- BOOST_TEST_EQUAL(1, page_count(1, 2, 5));
- BOOST_TEST_EQUAL(1, page_count(4, 2, 5));
- BOOST_TEST_EQUAL(2, page_count(5, 2, 5));
- BOOST_TEST_EQUAL(2, page_count(8, 2, 5));
- BOOST_TEST_EQUAL(3, page_count(9, 2, 5));
+ BOOST_TEST_EQUAL(1, paginator(1, 2, 5).page_count());
+ BOOST_TEST_EQUAL(1, paginator(4, 2, 5).page_count());
+ BOOST_TEST_EQUAL(2, paginator(5, 2, 5).page_count());
+ BOOST_TEST_EQUAL(2, paginator(8, 2, 5).page_count());
+ BOOST_TEST_EQUAL(3, paginator(9, 2, 5).page_count());
// Same, but next even length: same outcome.
- BOOST_TEST_EQUAL(1, page_count(1, 2, 6));
- BOOST_TEST_EQUAL(1, page_count(4, 2, 6));
- BOOST_TEST_EQUAL(2, page_count(5, 2, 6));
- BOOST_TEST_EQUAL(2, page_count(8, 2, 6));
- BOOST_TEST_EQUAL(3, page_count(9, 2, 6));
+ BOOST_TEST_EQUAL(1, paginator(1, 2, 6).page_count());
+ BOOST_TEST_EQUAL(1, paginator(4, 2, 6).page_count());
+ BOOST_TEST_EQUAL(2, paginator(5, 2, 6).page_count());
+ BOOST_TEST_EQUAL(2, paginator(8, 2, 6).page_count());
+ BOOST_TEST_EQUAL(3, paginator(9, 2, 6).page_count());
// Page length seven: one extra data row possible on last page.
- BOOST_TEST_EQUAL(1, page_count(1, 2, 7));
- BOOST_TEST_EQUAL(1, page_count(4, 2, 7));
- BOOST_TEST_EQUAL(1, page_count(5, 2, 7));
- BOOST_TEST_EQUAL(2, page_count(6, 2, 7));
- BOOST_TEST_EQUAL(2, page_count(8, 2, 7));
- BOOST_TEST_EQUAL(2, page_count(9, 2, 7));
+ BOOST_TEST_EQUAL(1, paginator(1, 2, 7).page_count());
+ BOOST_TEST_EQUAL(1, paginator(4, 2, 7).page_count());
+ BOOST_TEST_EQUAL(1, paginator(5, 2, 7).page_count());
+ BOOST_TEST_EQUAL(2, paginator(6, 2, 7).page_count());
+ BOOST_TEST_EQUAL(2, paginator(8, 2, 7).page_count());
+ BOOST_TEST_EQUAL(2, paginator(9, 2, 7).page_count());
}