group_B: Utility declarations in namespace permsbi_lib.
Version of Wednesday 11 September 2024.
Appearing in file group_A/permzbi_A1.h are the following utility declarations. The comments /* B1 */, /* B2 */, etc indicate that the definitions appear in files group_B/permzbi_B1.h, group_B/permzbi_B2.h, etc. The same file-name convention is used throughout the entire program.
using SVI = std::vector<int>;
using SVSVI = std::vector<SVI>;
using SVB = std::vector<bool>;
Remember the usual caution that std::vector<bool> is not actually a std::vector.
This is the only place in the program where std::vector<int> is mentioned by name. This localization is to aid the programmer who chooses to substitute some other container that is felt to be superior. Two well-known alternatives are:
More contents:
/* B1 */ struct prod_fail;
// is thrown for errors in production code.
// When permzbi_lib_safe is false, nearly all the
// tests will be omitted, at the programmer's risk.
/* B1 */ struct test_fail;
// is thrown for errors in test code.
// The related tests will always be performed.
// Either way, some errors will percolate up from the Standard Library.
/* B1 */ std::ostream & operator<<
(std::ostream & o, SVI const & vec);
/* B1 */ std::ostream & operator<<
(std::ostream & o, SVSVI const & vec);
/* B1 */ std::ostream & operator<<
(std::ostream & text_out, SVB const & vec);
/* B1 */ bool all_in_range (SVI const & v);
/* B1 */ bool any_two_equal (SVI const & v);
/* B1 */ bool pre_verify (SVI const & v);
The last three functions assist in determining whether the components of an SVI are fit for use as a permzbi.
/* B1 */ SVSVI transpose (SVSVI const & o);
// similar to the transpose of a matrix
/* B1 */ SVI flatten (SVSVI const & o);
// converts an SVSVI into an SVI by catenating the component SVIs.
/* B2 */ int mod (int const num, int const den);
/* B2 */ int quo (int const num, int const den);
/* B2 */ int gcd (int x, int y);
/* B2 */ int lcm (int const x, int const y);
Functions mod and quo differ from the built-in operator% and operator/, while gcd and lcm differ from their Standard Library counterparts. This is because permzbi requires specific treatment of negative numbers.
/* B2 */ bool is_even (int const i);
/* B2 */ bool is_odd (int const i);
/* B2 */ void view_bits (std::ostream & o, unsigned int const i);
The two safe_ functions manage concerns about signed and unsigned chars.
/* B2 */ bool safe_isspace (char const c);
/* B2 */ bool safe_isdigit (char const c);
/* B3 */ bool ranking_is_same (SVI const & a, SVI const & b);
/* B3 */ SVI deflate (
SVI const & old_upper
);
/* B3 */ SVI inflate (
SVI const & old_upper,
SVI const & old_lower,
SVI const & new_lower
);
/* Z1 */ void web_page_support ();
constexpr int max_int {std::numeric_limits::max()};
constexpr int min_int {std::numeric_limits::min()};