lmi-commits
[Top][All Lists]
Advanced

[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());
 }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]