//
// libsemigroups - C++ library for semigroups and monoids
// Copyright (C) 2019 James D. Mitchell
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/ >.
//
#include <algorithm> // for all_of, count, fill
#include <cstddef> // for size_t
#include <cstdint> // for int64_t
#include <initializer_list> // for initializer_list
#include <numeric> // for iota
#include <stdexcept> // for out_of_range
#include <utility> // for swap
#include <vector> // for vector
#include "catch.hpp" // for REQUIRE
#include "test-main.hpp" // for LIBSEMIGROUPS_TEST_CASE
#include "libsemigroups/containers.hpp" // for DynamicArray2, DynamicArray...
namespace libsemigroups {
namespace detail {
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"001" ,
"default constructor with 3 default args" ,
"[containers][quick]" ) {
DynamicArray2<bool > rv = DynamicArray2<bool >();
REQUIRE(rv.size() == 0);
REQUIRE(rv.number_of_rows() == 0);
REQUIRE(rv.number_of_cols() == 0);
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"002" ,
"default constructor with 2 default args" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv = DynamicArray2<size_t>(5);
REQUIRE(rv.size() == 0);
REQUIRE(rv.number_of_cols() == 5);
REQUIRE(rv.number_of_rows() == 0);
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"003" ,
"default constructor with 1 default args" ,
"[containers][quick]" ) {
DynamicArray2<bool > rv = DynamicArray2<bool >(5, 5);
REQUIRE(rv.size() == 25);
REQUIRE(rv.number_of_cols() == 5);
REQUIRE(rv.number_of_rows() == 5);
REQUIRE(std::all_of(
rv.begin(), rv.end(), [](bool val) { return val == false ; }));
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"004" ,
"default constructor with 0 default args" ,
"[containers][quick]" ) {
DynamicArray2<bool > rv = DynamicArray2<bool >(2, 7, true );
REQUIRE(rv.size() == 14);
REQUIRE(rv.number_of_cols() == 2);
REQUIRE(rv.number_of_rows() == 7);
REQUIRE(std::all_of(
rv.begin(), rv.end(), [](bool val) { return val == true ; }));
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"005" ,
"copy constructor with 1 default args" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv = DynamicArray2<size_t>(3, 7, 666);
DynamicArray2<size_t> copy = DynamicArray2<size_t>(rv);
REQUIRE(copy.size() == 21);
REQUIRE(copy.number_of_cols() == 3);
REQUIRE(copy.number_of_rows() == 7);
REQUIRE(std::all_of(
copy.begin(), copy.end(), [](size_t val) { return val == 666; }));
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"006" ,
"copy constructor with 0 default args" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv = DynamicArray2<size_t>(3, 7, 666);
DynamicArray2<size_t> copy = DynamicArray2<size_t>(rv, 2);
REQUIRE(copy.size() == 35);
REQUIRE(copy.number_of_cols() == 5);
REQUIRE(copy.number_of_rows() == 7);
REQUIRE(std::all_of(
copy.begin(), copy.end(), [](size_t val) { return val == 666; }));
// Check when there are available extra columns already in rv.
rv.add_cols(10);
DynamicArray2<size_t> copy2(rv, 0);
REQUIRE(copy2.size() == 91);
REQUIRE(copy2.number_of_cols() == 13);
REQUIRE(copy2.number_of_rows() == 7);
REQUIRE(std::all_of(
copy2.begin(), copy2.end(), [](size_t val) { return val == 666; }));
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"007" ,
"add_rows" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv = DynamicArray2<size_t>(3, 7, 666);
rv.add_rows(1);
REQUIRE(rv.size() == 24);
REQUIRE(rv.number_of_cols() == 3);
REQUIRE(rv.number_of_rows() == 8);
REQUIRE(std::all_of(
rv.begin(), rv.end(), [](size_t val) { return val == 666; }));
rv.add_rows(2);
REQUIRE(rv.size() == 30);
REQUIRE(rv.number_of_cols() == 3);
REQUIRE(rv.number_of_rows() == 10);
REQUIRE(std::all_of(
rv.begin(), rv.end(), [](size_t val) { return val == 666; }));
rv.add_rows(1);
REQUIRE(rv.size() == 33);
REQUIRE(rv.number_of_cols() == 3);
REQUIRE(rv.number_of_rows() == 11);
REQUIRE(std::all_of(
rv.begin(), rv.end(), [](size_t val) { return val == 666; }));
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"008" ,
"add_rows" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv = DynamicArray2<size_t>(3, 7, 666);
rv.add_rows(10);
REQUIRE(rv.size() == 51);
REQUIRE(rv.number_of_cols() == 3);
REQUIRE(rv.number_of_rows() == 17);
REQUIRE(std::all_of(
rv.begin(), rv.end(), [](size_t val) { return val == 666; }));
rv.add_rows(7);
REQUIRE(rv.size() == 72);
REQUIRE(rv.number_of_cols() == 3);
REQUIRE(rv.number_of_rows() == 24);
REQUIRE(std::all_of(
rv.begin(), rv.end(), [](size_t val) { return val == 666; }));
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"009" ,
"add_cols" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv = DynamicArray2<size_t>(100, 2, 666);
rv.add_cols(10);
REQUIRE(rv.size() == 220);
REQUIRE(rv.number_of_cols() == 110);
REQUIRE(rv.number_of_rows() == 2);
REQUIRE(std::all_of(
rv.begin(), rv.end(), [](size_t val) { return val == 666; }));
rv.add_cols(5);
REQUIRE(rv.size() == 230);
REQUIRE(rv.number_of_cols() == 115);
REQUIRE(rv.number_of_rows() == 2);
REQUIRE(std::all_of(
rv.begin(), rv.end(), [](size_t val) { return val == 666; }));
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"010" ,
"set/get" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv = DynamicArray2<size_t>(100, 50, 666);
rv.set(0, 98, 0);
REQUIRE(rv.get(0, 98) == 0);
rv.set(1, 45, 1);
REQUIRE(rv.get(1, 45) == 1);
rv.set(49, 99, 1);
REQUIRE(rv.get(1, 45) == 1);
size_t val = 0;
for (size_t col = 0; col < 100; col++) {
for (size_t row = 0; row < 50; row++) {
rv.set(row, col, val++);
}
}
val = 0;
auto check_it = [&val, &rv]() {
for (size_t col = 0; col < 100; col++) {
for (size_t row = 0; row < 50; row++) {
if (rv.get(row, col) != val++) {
return false ;
}
}
}
return true ;
};
REQUIRE(check_it());
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"011" ,
"append 1/2" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv1 = DynamicArray2<size_t>(100, 50, 555);
DynamicArray2<size_t> rv2 = DynamicArray2<size_t>(100, 50, 666);
REQUIRE(rv1.size() == 5000);
REQUIRE(rv1.number_of_cols() == 100);
REQUIRE(rv1.number_of_rows() == 50);
REQUIRE(rv2.size() == 5000);
REQUIRE(rv2.number_of_cols() == 100);
REQUIRE(rv2.number_of_rows() == 50);
rv1.append(rv2);
REQUIRE(rv1.size() == 10000);
REQUIRE(rv1.number_of_cols() == 100);
REQUIRE(rv1.number_of_rows() == 100);
REQUIRE(rv2.size() == 5000);
REQUIRE(rv2.number_of_cols() == 100);
REQUIRE(rv2.number_of_rows() == 50);
REQUIRE(std::all_of(
rv2.begin(), rv2.end(), [](size_t val) { return val == 666; }));
auto check_it = [&rv1](size_t begin, size_t end, size_t val) {
for (size_t col = 0; col < 100; col++) {
for (size_t row = begin; row < end; row++) {
if (rv1.get(row, col) != val) {
return false ;
}
}
}
return true ;
};
REQUIRE(check_it(0, 50, 555));
REQUIRE(check_it(50, 100, 666));
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"012" ,
"append 2/2" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv1 = DynamicArray2<size_t>(10, 10, 555);
REQUIRE(rv1.size() == 100);
REQUIRE(rv1.number_of_cols() == 10);
REQUIRE(rv1.number_of_rows() == 10);
rv1.add_rows(40);
for (size_t i = 0; i < 9; i++) {
rv1.add_cols(10);
}
REQUIRE(rv1.size() == 5000);
REQUIRE(rv1.number_of_cols() == 100);
REQUIRE(rv1.number_of_rows() == 50);
DynamicArray2<size_t> rv2 = DynamicArray2<size_t>(3, 4, 666);
rv2.add_rows(46);
rv2.add_cols(97);
REQUIRE(rv1.size() == 5000);
REQUIRE(rv1.number_of_cols() == 100);
REQUIRE(rv1.number_of_rows() == 50);
rv1.append(rv2);
REQUIRE(rv1.size() == 10000);
REQUIRE(rv1.number_of_cols() == 100);
REQUIRE(rv1.number_of_rows() == 100);
REQUIRE(rv2.size() == 5000);
REQUIRE(rv2.number_of_cols() == 100);
REQUIRE(rv2.number_of_rows() == 50);
REQUIRE(std::all_of(
rv2.begin(), rv2.end(), [](size_t val) { return val == 666; }));
auto check_it = [&rv1](size_t begin, size_t end, size_t val) {
for (size_t col = 0; col < 100; col++) {
for (size_t row = begin; row < end; row++) {
if (rv1.get(row, col) != val) {
return false ;
}
}
}
return true ;
};
REQUIRE(check_it(0, 50, 555));
REQUIRE(check_it(50, 100, 666));
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"013" ,
"count" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv = DynamicArray2<size_t>(10, 10);
for (size_t i = 0; i < 9; i++) {
rv.set(i, i, 1);
}
REQUIRE(std::count(rv.begin_row(7), rv.end_row(7), 0) == 9);
REQUIRE(std::count(rv.begin_row(7), rv.end_row(7), 1) == 1);
rv.set(7, 0, 1);
REQUIRE(std::count(rv.begin_row(7), rv.end_row(7), 0) == 8);
REQUIRE(std::count(rv.begin_row(7), rv.end_row(7), 1) == 2);
REQUIRE(std::count(rv.begin_row(7), rv.end_row(7), 2) == 0);
rv.add_cols(100);
REQUIRE(std::count(rv.begin_row(7), rv.end_row(7), 0) == 108);
REQUIRE(std::count(rv.begin_row(7), rv.end_row(7), 1) == 2);
REQUIRE(std::count(rv.begin_row(7), rv.end_row(7), 2) == 0);
for (size_t i = 10; i < 19; i++) {
rv.set(7, i, 2);
}
REQUIRE(std::count(rv.begin_row(7), rv.end_row(7), 0) == 99);
REQUIRE(std::count(rv.begin_row(7), rv.end_row(7), 1) == 2);
REQUIRE(std::count(rv.begin_row(7), rv.end_row(7), 2) == 9);
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"014" ,
"clear" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv = DynamicArray2<size_t>(10, 10);
REQUIRE(rv.size() == 100);
REQUIRE(rv.number_of_cols() == 10);
REQUIRE(rv.number_of_rows() == 10);
rv.clear();
REQUIRE(rv.size() == 0);
REQUIRE(rv.number_of_cols() == 0);
REQUIRE(rv.number_of_rows() == 0);
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"015" ,
"begin_row and end_row" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv = DynamicArray2<size_t>(100, 2);
for (size_t i = 0; i < rv.number_of_rows(); i++) {
for (auto it = rv.begin_row(i); it < rv.end_row(i); it++) {
REQUIRE(*it == 0);
if (i == 0) {
*it = 666;
REQUIRE(*it == 666);
}
}
}
REQUIRE(std::count(rv.begin_row(0), rv.end_row(0), 666) == 100);
REQUIRE(std::count(rv.begin_row(1), rv.end_row(1), 666) == 0);
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"016" ,
"cbegin_row and cend_row" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv = DynamicArray2<size_t>(10, 10, 66);
for (size_t i = 0; i < rv.number_of_rows(); i++) {
for (auto it = rv.cbegin_row(i); it < rv.cend_row(i); it++) {
REQUIRE(*it == 66);
}
}
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"017" ,
"iterator operator++ (postfix)" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv1 = DynamicArray2<size_t>(100, 2); // cols, rows
rv1.add_cols(10); // rv1 has 129 = 5 * 100 / 4 + 4 cols in total
size_t val = 0;
for (auto it = rv1.begin(); it < rv1.end(); it++) {
REQUIRE(*it == 0);
*it = val++;
}
REQUIRE(val == rv1.number_of_cols() * rv1.number_of_rows());
REQUIRE(val == (100 + 10) * 2);
val = 0;
for (auto it = rv1.begin(); it < rv1.end(); it++) {
REQUIRE(*it == val++);
}
REQUIRE(val == rv1.number_of_cols() * rv1.number_of_rows());
REQUIRE(val == (100 + 10) * 2);
for (auto it = rv1.rbegin(); it < rv1.rend(); it++) {
REQUIRE(*it == --val);
}
REQUIRE(val == 0);
DynamicArray2<bool > rv2 = DynamicArray2<bool >(100, 2); // cols, rows
rv2.add_cols(10); // rv2 has 129 = 5 * 100 / 4 + 4 cols in total
val = 0;
for (auto it = rv2.begin(); it < rv2.end(); it++) {
REQUIRE(*it == false );
if (((it - rv2.begin()) % 2) == 0) {
*it = true ;
}
val++;
}
REQUIRE(val == rv2.number_of_cols() * rv2.number_of_rows());
REQUIRE(val == (100 + 10) * 2);
for (auto it = rv2.rbegin(); it < rv2.rend(); it++) {
if (((it - rv2.rend() + 1) % 2) == 0) {
REQUIRE(*it == true );
} else {
REQUIRE(*it == false );
*it = true ;
}
--val;
}
REQUIRE(val == 0);
val = 0;
for (auto it = rv2.begin(); it < rv2.end(); it++) {
REQUIRE(*it == true );
val++;
}
REQUIRE(val == rv2.number_of_cols() * rv2.number_of_rows());
REQUIRE(val == (100 + 10) * 2);
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"018" ,
"iterator operator++ (prefix)" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv1 = DynamicArray2<size_t>(100, 2); // cols, rows
for (auto it = rv1.begin(); it < rv1.end(); ++it) {
auto tmp(it);
REQUIRE((++tmp - it) == 1);
REQUIRE((it - tmp) == -1);
REQUIRE((--tmp - it) == 0);
REQUIRE(tmp == it);
REQUIRE(++tmp == it + 1);
REQUIRE((--tmp) == it);
REQUIRE(tmp == it);
REQUIRE((--tmp - it) == -1);
REQUIRE((++tmp - it) == 0);
REQUIRE(tmp == it);
REQUIRE((--tmp) == it - 1);
REQUIRE((++tmp) == it);
REQUIRE(tmp == it);
}
rv1.add_cols(10); // rv1 has 129 = 5 * 100 / 4 + 4 cols in total
size_t val = 0;
for (auto it = rv1.begin(); it < rv1.end(); ++it) {
REQUIRE(*it == 0);
*it = val++;
}
val = 0;
for (auto it = rv1.begin(); it < rv1.end(); it++) {
REQUIRE(*it == val++);
}
REQUIRE(val == rv1.number_of_cols() * rv1.number_of_rows());
REQUIRE(val == (100 + 10) * 2);
val = 0;
for (auto it = rv1.begin(); it < rv1.end(); ++it) {
REQUIRE(*it == val++);
}
REQUIRE(val == rv1.number_of_cols() * rv1.number_of_rows());
REQUIRE(val == (100 + 10) * 2);
for (auto it = rv1.begin(); it < rv1.end(); ++it) {
auto tmp(it);
REQUIRE((++tmp - it) == 1);
REQUIRE((it - tmp) == -1);
REQUIRE((--tmp - it) == 0);
REQUIRE(tmp == it);
REQUIRE(++tmp == it + 1);
REQUIRE((--tmp) == it);
REQUIRE(tmp == it);
REQUIRE((--tmp - it) == -1);
REQUIRE((++tmp - it) == 0);
REQUIRE(tmp == it);
REQUIRE((--tmp) == it - 1);
REQUIRE((++tmp) == it);
REQUIRE(tmp == it);
}
DynamicArray2<bool > rv2 = DynamicArray2<bool >(100, 2); // cols, rows
rv2.add_cols(10); // rv2 has 129 = 5 * 100 / 4 + 4 cols in total
val = 0;
for (auto it = rv2.begin(); it < rv2.end(); ++it) {
REQUIRE(*it == false );
if ((it - rv2.begin()) % 6 == 4) {
*it = true ;
REQUIRE(*it == true );
}
val++;
}
REQUIRE(val == rv2.number_of_cols() * rv2.number_of_rows());
REQUIRE(val == (100 + 10) * 2);
for (auto it = rv2.begin(); it < rv2.end(); ++it) {
if ((it - rv2.begin()) % 6 == 4) {
REQUIRE(*it == true );
} else {
REQUIRE(*it == false );
}
val--;
}
REQUIRE(val == 0);
val = 0;
for (auto it = rv2.begin(); it < rv2.end(); ++it) {
auto tmp(it);
REQUIRE((++tmp - it) == 1);
REQUIRE((it - tmp) == -1);
REQUIRE((--tmp - it) == 0);
REQUIRE((++tmp) == it + 1);
REQUIRE((--tmp) == it);
REQUIRE(tmp == it);
REQUIRE((--tmp - it) == -1);
REQUIRE((++tmp - it) == 0);
REQUIRE(tmp == it);
REQUIRE((--tmp) == it - 1);
REQUIRE((++tmp) == it);
REQUIRE(tmp == it);
}
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"019" ,
"iterator operator-- (postfix)" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv = DynamicArray2<size_t>(100, 2); // cols, rows
rv.add_cols(10); // rv has 129 = 5 * 100 / 4 + 4 cols in total
size_t val = 0;
for (auto it = rv.end() - 1; it >= rv.begin(); it--) {
REQUIRE(*it == 0);
*it = val++;
}
val = 0;
for (auto it = rv.end() - 1; it >= rv.begin(); it--) {
REQUIRE(*it == val++);
}
REQUIRE(val == rv.number_of_cols() * rv.number_of_rows());
REQUIRE(val == (100 + 10) * 2);
for (auto it = rv.end() - 1; it >= rv.begin(); --it) {
auto tmp(it);
REQUIRE(--(++tmp) == it);
REQUIRE(++(--tmp) == it);
}
for (auto it = rv.rbegin(); it < rv.rend(); it++) {
auto tmp(it);
REQUIRE(--(++tmp) == it);
REQUIRE(++(--tmp) == it);
}
for (auto it = rv.rbegin(); it < rv.rend(); ++it) {
auto tmp(it);
REQUIRE(--(++tmp) == it);
REQUIRE(++(--tmp) == it);
}
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"020" ,
"iterator operator-- (prefix)" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv = DynamicArray2<size_t>(100, 2); // cols, rows
rv.add_cols(10); // rv has 129 = 5 * 100 / 4 + 4 cols in total
size_t val = 0;
for (auto it = rv.end() - 1; it >= rv.begin(); --it) {
REQUIRE(*it == 0);
*it = val++;
}
val = 0;
for (auto it = rv.end() - 1; it >= rv.begin(); --it) {
REQUIRE(*it == val++);
}
REQUIRE(val == rv.number_of_cols() * rv.number_of_rows());
REQUIRE(val == (100 + 10) * 2);
for (auto it = rv.end() - 1; it >= rv.begin(); --it) {
auto tmp(it);
REQUIRE(--(++tmp) == it);
REQUIRE(++(--tmp) == it);
}
for (auto it = rv.rbegin(); it < rv.rend(); it++) {
auto tmp(it);
REQUIRE(--(++tmp) == it);
REQUIRE(++(--tmp) == it);
}
for (auto it = rv.rbegin(); it < rv.rend(); ++it) {
auto tmp(it);
REQUIRE(--(++tmp) == it);
REQUIRE(++(--tmp) == it);
}
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"021" ,
"operator=" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv1 = DynamicArray2<size_t>(10, 10, 3);
DynamicArray2<size_t> rv2 = DynamicArray2<size_t>(9, 9, 2);
rv1. operator =(rv2);
REQUIRE(rv1.number_of_cols() == 9);
REQUIRE(rv1.number_of_rows() == 9);
REQUIRE(std::all_of(
rv1.begin(), rv1.end(), [](size_t val) { return val == 2; }));
REQUIRE(rv2.number_of_cols() == 9);
REQUIRE(rv2.number_of_rows() == 9);
REQUIRE(std::all_of(
rv2.begin(), rv2.end(), [](size_t val) { return val == 2; }));
DynamicArray2<bool > rv3 = DynamicArray2<bool >(10, 10, false );
DynamicArray2<bool > rv4 = DynamicArray2<bool >(9, 9, true );
rv3. operator =(rv4);
REQUIRE(rv3.number_of_cols() == 9);
REQUIRE(rv3.number_of_rows() == 9);
REQUIRE(std::all_of(
rv3.begin(), rv3.end(), [](bool val) { return val == true ; }));
REQUIRE(rv4.number_of_cols() == 9);
REQUIRE(rv4.number_of_rows() == 9);
REQUIRE(std::all_of(
rv4.begin(), rv4.end(), [](bool val) { return val == true ; }));
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"022" ,
"operator== and operator!=" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv1 = DynamicArray2<size_t>(10, 10, 3);
DynamicArray2<size_t> rv2 = DynamicArray2<size_t>(10, 10, 2);
REQUIRE(rv1 != rv2); // wrong values
rv1.add_cols(2); // rv has 16 = 5 * 10 / 4 + 4 cols in total
REQUIRE(rv1 != rv2); // wrong dimensions
rv2.add_cols(2); // rv has 16 = 5 * 10 / 4 + 4 cols in total
REQUIRE(rv1 != rv2); // wrong values
rv1.add_rows(1);
REQUIRE(rv1 != rv2); // wrong dimensions
rv2.add_rows(1);
REQUIRE(rv1 != rv2); // wrong values
REQUIRE(rv1.size() == 12 * 11);
REQUIRE(rv2.size() == 12 * 11);
std::fill(rv1.begin(), rv1.end(), 2);
for (auto it1 = rv1.begin(), it2 = rv2.begin(); it1 < rv1.end();
it1++, it2++) {
REQUIRE(*it1 == *it2);
}
for (auto it1 = rv1.cbegin(), it2 = rv2.cbegin(); it1 < rv1.cend();
it1++, it2++) {
REQUIRE(*it1 == *it2);
}
for (auto it1 = rv1.rbegin(), it2 = rv2.rbegin(); it1 < rv1.rend();
it1++, it2++) {
REQUIRE(*it1 == *it2);
}
for (auto it1 = rv1.crbegin(), it2 = rv2.crbegin(); it1 < rv1.crend();
it1++, it2++) {
REQUIRE(*it1 == *it2);
}
REQUIRE(rv1 == rv2);
DynamicArray2<bool > rv3(10, 10, true );
DynamicArray2<bool > rv4(10, 10, false );
REQUIRE(rv3 != rv4); // wrong values
rv3.add_cols(2); // rv has 16 = 5 * 10 / 4 + 4 cols in total
REQUIRE(rv3 != rv4); // wrong dimensions
rv4.add_cols(2); // rv has 16 = 5 * 10 / 4 + 4 cols in total
REQUIRE(rv3 != rv4); // wrong values
rv3.add_rows(1);
REQUIRE(rv3 != rv4); // wrong dimensions
rv4.add_rows(1);
REQUIRE(rv3 != rv4); // wrong values
REQUIRE(rv3.size() == 12 * 11);
REQUIRE(rv4.size() == 12 * 11);
std::fill(rv3.begin(), rv3.end(), false );
for (auto it1 = rv3.begin(), it2 = rv4.begin(); it1 < rv3.end();
it1++, it2++) {
REQUIRE(*it1 == *it2);
}
for (auto it1 = rv3.cbegin(), it2 = rv4.cbegin(); it1 < rv3.cend();
it1++, it2++) {
REQUIRE(*it1 == *it2);
}
for (auto it1 = rv3.rbegin(), it2 = rv4.rbegin(); it1 < rv3.rend();
it1++, it2++) {
REQUIRE(*it1 == *it2);
}
for (auto it1 = rv3.crbegin(), it2 = rv4.crbegin(); it1 < rv3.crend();
it1++, it2++) {
REQUIRE(*it1 == *it2);
}
REQUIRE(rv3 == rv4);
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"023" ,
"empty and clear" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv1 = DynamicArray2<size_t>(10, 10);
REQUIRE(!rv1.empty());
rv1.clear();
REQUIRE(rv1.empty());
REQUIRE(rv1.size() == 0);
REQUIRE(rv1.number_of_rows() == 0);
REQUIRE(rv1.number_of_cols() == 0);
DynamicArray2<size_t> rv2 = DynamicArray2<size_t>(10);
REQUIRE(rv2.empty());
REQUIRE(rv2.size() == 0);
REQUIRE(rv2.number_of_rows() == 0);
REQUIRE(rv2.number_of_cols() != 0);
DynamicArray2<bool > rv3 = DynamicArray2<bool >(10, 10);
REQUIRE(!rv3.empty());
rv3.clear();
REQUIRE(rv3.empty());
REQUIRE(rv3.size() == 0);
REQUIRE(rv3.number_of_rows() == 0);
REQUIRE(rv3.number_of_cols() == 0);
DynamicArray2<bool > rv4 = DynamicArray2<bool >(10);
REQUIRE(rv4.empty());
REQUIRE(rv4.size() == 0);
REQUIRE(rv4.number_of_rows() == 0);
REQUIRE(rv4.number_of_cols() != 0);
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"024" ,
"max_size" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv1 = DynamicArray2<size_t>(10, 10);
REQUIRE(rv1.max_size() != 0);
DynamicArray2<bool > rv2 = DynamicArray2<bool >(10);
REQUIRE(rv2.max_size() != 0);
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"025" ,
"swap" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv1 = DynamicArray2<size_t>(10, 10, 3);
DynamicArray2<size_t> rv2 = DynamicArray2<size_t>(9, 9, 2);
rv1.add_cols(2); // rv1 has 16 = 5 * 10 / 4 + 4 cols in total
rv2.add_cols(1); // rv2 has 15 = 5 * 9 / 4 + 4 cols in total
REQUIRE(rv1.number_of_cols() == 12);
REQUIRE(rv1.number_of_rows() == 10);
REQUIRE(std::all_of(
rv1.begin(), rv1.end(), [](size_t val) { return val == 3; }));
REQUIRE(rv2.number_of_cols() == 10);
REQUIRE(rv2.number_of_rows() == 9);
REQUIRE(std::all_of(
rv2.begin(), rv2.end(), [](size_t val) { return val == 2; }));
rv1.swap(rv2);
REQUIRE(rv1.number_of_cols() == 10);
REQUIRE(rv1.number_of_rows() == 9);
REQUIRE(std::all_of(
rv1.begin(), rv1.end(), [](size_t val) { return val == 2; }));
REQUIRE(rv2.number_of_cols() == 12);
REQUIRE(rv2.number_of_rows() == 10);
REQUIRE(std::all_of(
rv2.begin(), rv2.end(), [](size_t val) { return val == 3; }));
std::swap(rv1, rv2);
REQUIRE(rv1.number_of_cols() == 12);
REQUIRE(rv1.number_of_rows() == 10);
REQUIRE(std::all_of(
rv1.begin(), rv1.end(), [](size_t val) { return val == 3; }));
REQUIRE(rv2.number_of_cols() == 10);
REQUIRE(rv2.number_of_rows() == 9);
REQUIRE(std::all_of(
rv2.begin(), rv2.end(), [](size_t val) { return val == 2; }));
DynamicArray2<bool > rv3 = DynamicArray2<bool >(10, 10, false );
DynamicArray2<bool > rv4 = DynamicArray2<bool >(9, 9, true );
rv3.add_cols(2); // rv3 has 16 = 5 * 10 / 4 + 4 cols in total
REQUIRE(rv3.number_of_cols() == 12);
REQUIRE(rv3.number_of_rows() == 10);
REQUIRE(std::all_of(
rv3.begin(), rv3.end(), [](bool val) { return val == false ; }));
REQUIRE(rv4.number_of_cols() == 9);
REQUIRE(rv4.number_of_rows() == 9);
REQUIRE(std::all_of(
rv4.begin(), rv4.end(), [](bool val) { return val == true ; }));
rv3.swap(rv4);
REQUIRE(rv3.number_of_cols() == 9);
REQUIRE(rv3.number_of_rows() == 9);
REQUIRE(std::all_of(
rv3.begin(), rv3.end(), [](bool val) { return val == true ; }));
REQUIRE(rv4.number_of_cols() == 12);
REQUIRE(rv4.number_of_rows() == 10);
REQUIRE(std::all_of(
rv4.begin(), rv4.end(), [](bool val) { return val == false ; }));
std::swap(rv3, rv4);
REQUIRE(rv3.number_of_cols() == 12);
REQUIRE(rv3.number_of_rows() == 10);
REQUIRE(std::all_of(
rv3.begin(), rv3.end(), [](bool val) { return val == false ; }));
REQUIRE(rv4.number_of_cols() == 9);
REQUIRE(rv4.number_of_rows() == 9);
REQUIRE(std::all_of(
rv4.begin(), rv4.end(), [](bool val) { return val == true ; }));
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"026" ,
"iterator arithmetic" ,
"[containers][quick]" ) {
{
DynamicArray2<size_t> rv = DynamicArray2<size_t>(10, 10, 1000);
size_t val = 0;
for (auto it = rv.begin(); it < rv.end(); it++) {
*it = val++;
}
auto it = rv.begin();
REQUIRE(*it == 0);
for (int64_t i = 0; i < 100; i++) {
REQUIRE(*(it + i) == size_t(i));
it += i;
REQUIRE(*it == size_t(i));
it -= i;
REQUIRE(*it == 0);
REQUIRE(it == rv.begin());
auto tmp(it);
REQUIRE((tmp + i) - i == tmp);
REQUIRE((i + tmp) - i == tmp);
tmp += i;
REQUIRE(tmp - it == i);
REQUIRE(it - tmp == -i);
tmp -= i;
REQUIRE(tmp - it == 0);
tmp -= i;
REQUIRE(tmp - it == -i);
REQUIRE(it - tmp == i);
}
for (int64_t i = 100; i < 200; i++) {
it += i;
it -= i;
REQUIRE(*it == 0);
REQUIRE(it == rv.begin());
auto tmp(it);
REQUIRE((tmp + i) - i == tmp);
REQUIRE((i + tmp) - i == tmp);
tmp += i;
REQUIRE(tmp - it == i);
REQUIRE(it - tmp == -i);
tmp -= i;
REQUIRE(tmp - it == 0);
tmp -= i;
REQUIRE(tmp - it == -i);
REQUIRE(it - tmp == i);
}
}
{
DynamicArray2<bool > rv = DynamicArray2<bool >(10, 10, false );
auto it = rv.begin();
REQUIRE(*it == false );
for (int64_t i = 1; i < 100; i++) {
*(rv.begin() + i) = true ;
REQUIRE(*(it + i) == true );
it += i;
REQUIRE(*it == true );
it -= i;
REQUIRE(*it == false );
REQUIRE(it == rv.begin());
auto tmp(it);
REQUIRE((tmp + i) - i == tmp);
REQUIRE((i + tmp) - i == tmp);
tmp += i;
REQUIRE(tmp - it == i);
REQUIRE(it - tmp == -i);
tmp -= i;
REQUIRE(tmp - it == 0);
tmp -= i;
REQUIRE(tmp - it == -i);
REQUIRE(it - tmp == i);
}
for (int64_t i = 100; i < 200; i++) {
it += i;
it -= i;
REQUIRE(*it == 0);
REQUIRE(it == rv.begin());
auto tmp(it);
REQUIRE((tmp + i) - i == tmp);
REQUIRE((i + tmp) - i == tmp);
tmp += i;
REQUIRE(tmp - it == i);
REQUIRE(it - tmp == -i);
tmp -= i;
REQUIRE(tmp - it == 0);
tmp -= i;
REQUIRE(tmp - it == -i);
REQUIRE(it - tmp == i);
}
}
{
DynamicArray2<size_t> rv = DynamicArray2<size_t>(10, 10, 1000);
rv.add_cols(2);
size_t val = 0;
for (auto it = rv.begin(); it < rv.end(); it++) {
*it = val++;
}
auto it = rv.cbegin();
REQUIRE(*it == 0);
for (int64_t i = 0; i < 100; i++) {
REQUIRE(*(it + i) == size_t(i));
it += i;
REQUIRE(*it == size_t(i));
it -= i;
REQUIRE(*it == 0);
REQUIRE(it == rv.cbegin());
auto tmp(it);
REQUIRE((tmp + i) - i == tmp);
REQUIRE((i + tmp) - i == tmp);
tmp += i;
REQUIRE(tmp - it == i);
REQUIRE(tmp - it == i);
REQUIRE(it - tmp == -i);
tmp -= i;
REQUIRE(tmp - it == 0);
tmp -= i;
REQUIRE(tmp - it == -i);
REQUIRE(it - tmp == i);
}
for (int64_t i = 100; i < 200; i++) {
it += i;
it -= i;
REQUIRE(*it == 0);
REQUIRE(it == rv.cbegin());
auto tmp(it);
REQUIRE((tmp + i) - i == tmp);
REQUIRE((i + tmp) - i == tmp);
tmp += i;
REQUIRE(tmp - it == i);
REQUIRE(it - tmp == -i);
tmp -= i;
REQUIRE(tmp - it == 0);
tmp -= i;
REQUIRE(tmp - it == -i);
REQUIRE(it - tmp == i);
}
}
{
DynamicArray2<bool > rv = DynamicArray2<bool >(10, 10, false );
auto it = rv.cbegin();
REQUIRE(*it == false );
for (int64_t i = 1; i < 100; i++) {
*(rv.begin() + i) = true ;
REQUIRE(*(it + i) == true );
it += i;
REQUIRE(*it == true );
it -= i;
REQUIRE(*it == false );
REQUIRE(it == rv.cbegin());
auto tmp(it);
REQUIRE((tmp + i) - i == tmp);
REQUIRE((i + tmp) - i == tmp);
tmp += i;
REQUIRE(tmp - it == i);
REQUIRE(it - tmp == -i);
tmp -= i;
REQUIRE(tmp - it == 0);
tmp -= i;
REQUIRE(tmp - it == -i);
REQUIRE(it - tmp == i);
}
for (int64_t i = 100; i < 200; i++) {
it += i;
it -= i;
REQUIRE(*it == 0);
REQUIRE(it == rv.cbegin());
auto tmp(it);
REQUIRE((tmp + i) - i == tmp);
REQUIRE((i + tmp) - i == tmp);
tmp += i;
REQUIRE(tmp - it == i);
REQUIRE(it - tmp == -i);
tmp -= i;
REQUIRE(tmp - it == 0);
tmp -= i;
REQUIRE(tmp - it == -i);
REQUIRE(it - tmp == i);
}
}
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"027" ,
"iterator comparison" ,
"[containers][quick]" ) {
{
DynamicArray2<size_t> rv = DynamicArray2<size_t>(10, 10, 1000);
REQUIRE(rv.begin() < rv.end());
REQUIRE(!(rv.begin() > rv.end()));
REQUIRE(rv.begin() <= rv.end());
REQUIRE(!(rv.begin() >= rv.end()));
REQUIRE(rv.begin() >= rv.begin());
REQUIRE(rv.begin() <= rv.begin());
REQUIRE(rv.end() >= rv.end());
REQUIRE(rv.end() <= rv.end());
}
{
DynamicArray2<size_t> rv = DynamicArray2<size_t>(10, 10, 1000);
REQUIRE(rv.cbegin() < rv.cend());
REQUIRE(!(rv.cbegin() > rv.cend()));
REQUIRE(rv.cbegin() <= rv.cend());
REQUIRE(!(rv.cbegin() >= rv.cend()));
REQUIRE(rv.cbegin() >= rv.cbegin());
REQUIRE(rv.cbegin() <= rv.cbegin());
REQUIRE(rv.cend() >= rv.cend());
REQUIRE(rv.cend() <= rv.cend());
}
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"028" ,
"iterator operator=" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv = DynamicArray2<size_t>(10, 10, 1000);
{
auto it = rv.begin();
auto it2 = it;
REQUIRE(it2 == it);
REQUIRE(*it2 == 1000);
it2 += 34;
REQUIRE(it2 - it == 34);
}
{
auto it = rv.cbegin();
auto it2 = it;
REQUIRE(it2 == it);
REQUIRE(*it2 == 1000);
it2 += 34;
REQUIRE(it2 - it == 34);
}
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"029" ,
"iterator operator[]" ,
"[containers][quick]" ) {
{
DynamicArray2<size_t> rv = DynamicArray2<size_t>(10, 10, 1000);
{
size_t val = 0;
for (auto it = rv.begin(); it < rv.end(); it++) {
*it = val++;
}
auto it = rv.begin();
while (val > 0) {
--val;
REQUIRE(it[val] == val);
}
}
{
size_t val = 0;
for (auto it = rv.begin(); it < rv.end(); it++) {
*it = val++;
}
auto it = rv.cbegin();
while (val > 0) {
--val;
REQUIRE(it[val] == val);
}
}
}
{
DynamicArray2<bool > rv = DynamicArray2<bool >(10, 10, false );
{
size_t val = rv.size();
auto it = rv.begin();
auto it2 = rv.rbegin();
while (val > 0) {
--val;
*it2 = true ;
REQUIRE(it[val] == true );
it2++;
}
}
{
size_t val = rv.size();
auto it = rv.cbegin();
auto it2 = rv.rbegin();
while (val > 0) {
--val;
*it2 = true ;
REQUIRE(it[val] == true );
it2++;
}
}
}
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"030" ,
"iterator operator->" ,
"[containers][quick][30" ) {
DynamicArray2<DynamicArray2<bool >> rv
= DynamicArray2<DynamicArray2<bool >>(13, 13, DynamicArray2<bool >());
{
auto it = rv.begin();
REQUIRE(it->empty());
}
{
auto it = rv.cbegin();
REQUIRE(it->empty());
}
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"031" ,
"const_iterator operator++/--" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv1 = DynamicArray2<size_t>(100, 2); // cols, rows
rv1.add_cols(10); // rv1 has 129 = 5 * 100 / 4 + 4 cols in total
size_t val = 0;
for (auto it = rv1.begin(); it < rv1.end(); it++) {
REQUIRE(*it == 0);
*it = val++;
}
REQUIRE(val == rv1.number_of_cols() * rv1.number_of_rows());
REQUIRE(val == (100 + 10) * 2);
val = 0;
for (auto it = rv1.cbegin(); it < rv1.cend(); it++) {
REQUIRE(*it == val++);
}
REQUIRE(val == rv1.number_of_cols() * rv1.number_of_rows());
REQUIRE(val == (100 + 10) * 2);
for (auto it = rv1.crbegin(); it < rv1.crend(); it++) {
REQUIRE(*it == --val);
}
REQUIRE(val == 0);
DynamicArray2<bool > rv2 = DynamicArray2<bool >(100, 2); // cols, rows
rv2.add_cols(10); // rv2 has 129 = 5 * 100 / 4 + 4 cols in total
val = 0;
for (auto it = rv2.begin(); it < rv2.end(); it++) {
if (((it - rv2.begin()) % 2) == 0) {
*it = true ;
}
val++;
}
REQUIRE(val == rv2.number_of_cols() * rv2.number_of_rows());
REQUIRE(val == (100 + 10) * 2);
for (auto it = rv2.crbegin(); it < rv2.crend(); it++) {
if (((it - rv2.crend() + 1) % 2) == 0) {
REQUIRE(*it == true );
} else {
REQUIRE(*it == false );
}
--val;
}
REQUIRE(val == 0);
val = 0;
for (auto it = rv2.cbegin(); it < rv2.cend(); it++) {
if (((it - rv2.cend() + 1) % 2) == 0) {
REQUIRE(*it == false );
} else {
REQUIRE(*it == true );
}
val++;
}
REQUIRE(val == rv2.number_of_cols() * rv2.number_of_rows());
REQUIRE(val == (100 + 10) * 2);
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"032" ,
"const_iterator operator++/--" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv = DynamicArray2<size_t>(1, 1, 6); // cols, rows
auto const it_b = rv.begin();
REQUIRE(*it_b == 6);
auto const it_e = rv.end();
REQUIRE(*(it_e - 1) == 6);
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"033" ,
"column iterators" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv = DynamicArray2<size_t>(3, 3);
for (size_t i = 0; i < rv.number_of_cols(); i++) {
std::fill(rv.begin_column(i), rv.end_column(i), i);
}
for (size_t i = 0; i < rv.number_of_rows(); i++) {
size_t j = 0;
for (auto it = rv.begin_row(i); it < rv.end_row(i); it++, j++) {
REQUIRE(*it == j);
}
}
for (size_t i = 0; i < rv.number_of_cols(); i++) {
for (auto it = rv.cbegin_column(i); it < rv.cend_column(i); it++) {
REQUIRE(*it == i);
}
}
for (size_t i = 0; i < rv.number_of_cols(); i++) {
for (auto it = rv.cend_column(i) - 1; it >= rv.cbegin_column(i); it--) {
REQUIRE(*it == i);
}
}
for (size_t i = 0; i < rv.number_of_cols(); i++) {
for (auto it = rv.cbegin_column(i); it < rv.cend_column(i); ++it) {
REQUIRE(*it == i);
}
}
for (size_t i = 0; i < rv.number_of_cols(); i++) {
for (auto it = rv.cend_column(i) - 1; it >= rv.cbegin_column(i); --it) {
REQUIRE(*it == i);
}
}
for (size_t i = 0; i < rv.number_of_cols(); i++) {
for (auto it = rv.begin_column(i); it < rv.end_column(i); it++) {
REQUIRE(*it == i);
}
}
for (size_t i = 0; i < rv.number_of_cols(); i++) {
for (auto it = rv.end_column(i) - 1; it >= rv.begin_column(i); it--) {
REQUIRE(*it == i);
}
}
for (size_t i = 0; i < rv.number_of_cols(); i++) {
for (auto it = rv.begin_column(i); it < rv.end_column(i); ++it) {
REQUIRE(*it == i);
}
}
for (size_t i = 0; i < rv.number_of_cols(); i++) {
for (auto it = rv.end_column(i) - 1; it >= rv.begin_column(i); --it) {
REQUIRE(*it == i);
}
}
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"034" ,
"column iterator arithmetic" ,
"[containers][quick][no-valgrind]" ) {
{
DynamicArray2<size_t> rv = DynamicArray2<size_t>(10, 10, 1000);
for (size_t i = 0; i < rv.number_of_cols(); i++) {
std::fill(rv.begin_column(i), rv.end_column(i), i);
}
for (size_t j = 0; j < 10; j++) {
auto it = rv.begin_column(j);
REQUIRE(*it == j);
for (int64_t i = 0; i < 10; i++) {
REQUIRE(*(it + i) == j);
it += i;
REQUIRE(*it == j);
it -= i;
REQUIRE(*it == j);
REQUIRE(it == rv.begin_column(j));
auto tmp(it);
REQUIRE((tmp + i) - i == tmp);
REQUIRE((i + tmp) - i == tmp);
tmp += i;
REQUIRE(tmp - it == i);
REQUIRE(it - tmp == -i);
tmp -= i;
REQUIRE(tmp - it == 0);
tmp -= i;
REQUIRE(tmp - it == -i);
REQUIRE(it - tmp == i);
}
for (int64_t i = 10; i < 200; i++) {
it += i;
it -= i;
REQUIRE(*it == j);
REQUIRE(it == rv.begin_column(j));
auto tmp(it);
REQUIRE((tmp + i) - i == tmp);
REQUIRE((i + tmp) - i == tmp);
tmp += i;
REQUIRE(tmp - it == i);
REQUIRE(it - tmp == -i);
tmp -= i;
REQUIRE(tmp - it == 0);
tmp -= i;
REQUIRE(tmp - it == -i);
REQUIRE(it - tmp == i);
}
}
}
{
DynamicArray2<bool > rv = DynamicArray2<bool >(10, 10, false );
for (size_t i = 0; i < rv.number_of_cols(); i++) {
std::fill(rv.begin_column(i), rv.end_column(i), i % 2);
}
for (size_t j = 0; j < 10; j++) {
auto it = rv.begin_column(j);
REQUIRE(*it == j % 2);
for (int64_t i = 0; i < 10; i++) {
*(rv.begin_column(j) + i) = *rv.begin_column(j);
it += i;
it -= i;
REQUIRE(it == rv.begin_column(j));
auto tmp(it);
REQUIRE((tmp + i) - i == tmp);
REQUIRE((i + tmp) - i == tmp);
tmp += i;
REQUIRE(tmp - it == i);
REQUIRE(it - tmp == -i);
tmp -= i;
REQUIRE(tmp - it == 0);
tmp -= i;
REQUIRE(tmp - it == -i);
REQUIRE(it - tmp == i);
}
for (int64_t i = 10; i < 200; i++) {
it += i;
it -= i;
REQUIRE(it == rv.begin_column(j));
auto tmp(it);
REQUIRE((tmp + i) - i == tmp);
REQUIRE((i + tmp) - i == tmp);
tmp += i;
REQUIRE(tmp - it == i);
REQUIRE(it - tmp == -i);
tmp -= i;
REQUIRE(tmp - it == 0);
tmp -= i;
REQUIRE(tmp - it == -i);
REQUIRE(it - tmp == i);
}
}
}
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"035" ,
"iterator assignment constructor" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv = DynamicArray2<size_t>(100, 100);
for (size_t i = 0; i < 100; i++) {
for (size_t j = 0; j < 100; j++) {
rv.set(i, j, (i + j) % 31);
}
}
for (size_t i = 0; i < 99; i++) {
auto it = rv.begin_row(i);
auto it2 = rv.begin_row(i + 1);
it++;
// the thing we really want to test
it2 = it;
for (; it2 != rv.end_row(i); ++it2) {
REQUIRE(*it2 == *it);
++it;
}
}
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"036" ,
"reserve method" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv = DynamicArray2<size_t>(100, 100);
rv.reserve(1000);
REQUIRE(rv.number_of_cols() == 100);
REQUIRE(rv.number_of_rows() == 100);
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"037" ,
"erase column" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv = DynamicArray2<size_t>(10, 10);
for (size_t i = 0; i < 10; i++) {
std::iota(rv.begin_row(i), rv.end_row(i), 0);
}
rv.erase_column(2);
REQUIRE(rv.number_of_cols() == 9);
REQUIRE(rv.number_of_rows() == 10);
for (size_t i = 0; i < 10; ++i) {
REQUIRE(rv.get(i, 1) == 1);
REQUIRE(rv.get(i, 2) == 3);
REQUIRE(rv.get(i, 3) == 4);
}
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"038" ,
"swap_rows" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv = DynamicArray2<size_t>(3, 10);
for (size_t i = 0; i < 10; i++) {
std::fill(rv.begin_row(i), rv.end_row(i), i);
}
rv.swap_rows(4, 8);
REQUIRE(std::all_of(
rv.begin_row(4), rv.end_row(4), [](size_t x) { return x == 8; }));
REQUIRE(std::all_of(
rv.begin_row(8), rv.end_row(8), [](size_t x) { return x == 4; }));
for (size_t i = 0; i < 10; i++) {
if (i != 4 && i != 8) {
REQUIRE(std::all_of(rv.begin_row(i), rv.end_row(i), [i](size_t x) {
return x == i;
}));
}
}
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"039" ,
"apply_row_permutation" ,
"[containers][quick]" ) {
DynamicArray2<size_t> rv = DynamicArray2<size_t>(3, 10);
for (size_t i = 0; i < 10; i++) {
std::fill(rv.begin_row(i), rv.end_row(i), i);
}
std::vector<size_t> p = {1, 2, 3, 4, 5, 6, 7, 0, 9, 8};
// copy p, since the apply_row_permutation method modifies p.
std::vector<size_t> q = p;
rv.apply_row_permutation(p);
for (size_t i = 0; i < 10; i++) {
REQUIRE(std::all_of(rv.begin_row(i), rv.end_row(i), [&q, &i](size_t x) {
return x == q[i];
}));
}
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"040" ,
"swap" ,
"[containers][quick]" ) {
DynamicArray2<size_t> da = DynamicArray2<size_t>({{0, 1}, {2, 3}});
REQUIRE(da.get(0, 0) == 0);
REQUIRE(da.get(0, 1) == 1);
REQUIRE(da.get(1, 0) == 2);
REQUIRE(da.get(1, 1) == 3);
da.swap(0, 0, 1, 1);
REQUIRE(da.get(0, 0) == 3);
REQUIRE(da.get(0, 1) == 1);
REQUIRE(da.get(1, 0) == 2);
REQUIRE(da.get(1, 1) == 0);
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"041" ,
"shrink_rows_to" ,
"[containers][quick]" ) {
DynamicArray2<size_t> da = DynamicArray2<size_t>({{0, 1}, {2, 3}});
REQUIRE(da.number_of_rows() == 2);
REQUIRE(da.number_of_cols() == 2);
da.shrink_rows_to(3);
REQUIRE(da.number_of_rows() == 2);
REQUIRE(da.number_of_cols() == 2);
REQUIRE(da == DynamicArray2<size_t>({{0, 1}, {2, 3}}));
da.shrink_rows_to(1);
REQUIRE(da.number_of_rows() == 1);
REQUIRE(da.number_of_cols() == 2);
REQUIRE(da == DynamicArray2<size_t>({{0, 1}}));
da.add_rows(3);
da.add_cols(2);
da.set_default_value(0);
REQUIRE(da.number_of_rows() == 4);
REQUIRE(da.number_of_cols() == 4);
REQUIRE(da
== DynamicArray2<size_t>(
{{0, 1, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}));
da.shrink_rows_to(5);
REQUIRE(da
== DynamicArray2<size_t>(
{{0, 1, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}));
da.shrink_rows_to(2);
REQUIRE(da == DynamicArray2<size_t>({{0, 1, 0, 0}, {0, 0, 0, 0}}));
}
LIBSEMIGROUPS_TEST_CASE("DynamicArray2" ,
"042" ,
"shrink_rows_to - for range" ,
"[containers][quick]" ) {
DynamicArray2<size_t> da = DynamicArray2<size_t>({{0, 1}, {2, 3}});
REQUIRE(da.number_of_rows() == 2);
REQUIRE(da.number_of_cols() == 2);
da.shrink_rows_to(3);
REQUIRE(da.number_of_rows() == 2);
REQUIRE(da.number_of_cols() == 2);
REQUIRE(da == DynamicArray2<size_t>({{0, 1}, {2, 3}}));
da.shrink_rows_to(1, 2);
REQUIRE(da.number_of_rows() == 1);
REQUIRE(da.number_of_cols() == 2);
REQUIRE(da == DynamicArray2<size_t>({{2, 3}}));
da.add_rows(3);
da.add_cols(2);
da.set_default_value(0);
REQUIRE(da.number_of_rows() == 4);
REQUIRE(da.number_of_cols() == 4);
REQUIRE(da
== DynamicArray2<size_t>(
{{2, 3, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}));
da.shrink_rows_to(1, 4);
REQUIRE(
da
== DynamicArray2<size_t>({{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}));
da.set(2, 1, 3);
REQUIRE(
da
== DynamicArray2<size_t>({{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 3, 0, 0}}));
da.shrink_rows_to(1, 3);
REQUIRE(da == DynamicArray2<size_t>({{0, 0, 0, 0}, {0, 3, 0, 0}}));
}
LIBSEMIGROUPS_TEST_CASE("StaticVector2" ,
"043" ,
"all" ,
"[containers][quick]" ) {
StaticVector2<size_t, 3> sv;
REQUIRE(sv.size(0) == 0);
REQUIRE(sv.size(1) == 0);
REQUIRE(sv.size(2) == 0);
sv.push_back(0, 0);
sv.push_back(0, 1);
sv.push_back(0, 2);
sv.push_back(1, 3);
sv.push_back(1, 4);
sv.push_back(2, 5);
REQUIRE(sv.size(0) == 3);
REQUIRE(sv.size(1) == 2);
REQUIRE(sv.size(2) == 1);
sv.clear();
REQUIRE(sv.size(0) == 0);
REQUIRE(sv.size(1) == 0);
REQUIRE(sv.size(2) == 0);
sv.push_back(0, 0);
sv.push_back(0, 1);
sv.push_back(0, 2);
sv.push_back(1, 3);
sv.push_back(1, 4);
sv.push_back(2, 5);
REQUIRE(sv.back(0) == 2);
REQUIRE(sv.back(1) == 4);
REQUIRE(sv.back(2) == 5);
REQUIRE(sv.at(2, 0) == 5);
REQUIRE(sv.at(1, 0) == 3);
REQUIRE(sv.at(0, 0) == 0);
REQUIRE(std::vector<size_t>(sv.cbegin(0), sv.cend(0))
== std::vector<size_t>({0, 1, 2}));
REQUIRE(std::vector<size_t>(sv.cbegin(1), sv.cend(1))
== std::vector<size_t>({3, 4}));
REQUIRE(std::vector<size_t>(sv.cbegin(2), sv.cend(2))
== std::vector<size_t>({5}));
REQUIRE(std::vector<size_t>(sv.begin(0), sv.end(0))
== std::vector<size_t>({0, 1, 2}));
REQUIRE(std::vector<size_t>(sv.begin(1), sv.end(1))
== std::vector<size_t>({3, 4}));
REQUIRE(std::vector<size_t>(sv.begin(2), sv.end(2))
== std::vector<size_t>({5}));
}
LIBSEMIGROUPS_TEST_CASE("Array2" , "044" , "all" , "[containers][quick]" ) {
Array2<size_t, 3> rry;
rry.fill(10);
REQUIRE(std::vector<size_t>(rry.cbegin(0), rry.cend(0))
== std::vector<size_t>({10, 10, 10}));
REQUIRE(std::vector<size_t>(rry.cbegin(1), rry.cend(1))
== std::vector<size_t>({10, 10, 10}));
REQUIRE(std::vector<size_t>(rry.cbegin(2), rry.cend(2))
== std::vector<size_t>({10, 10, 10}));
rry[0] = {0, 1, 2};
REQUIRE(std::vector<size_t>(rry.cbegin(0), rry.cend(0))
== std::vector<size_t>({0, 1, 2}));
REQUIRE(std::vector<size_t>(rry.cbegin(1), rry.cend(1))
== std::vector<size_t>({10, 10, 10}));
REQUIRE(std::vector<size_t>(rry.cbegin(2), rry.cend(2))
== std::vector<size_t>({10, 10, 10}));
REQUIRE(rry[0][0] == 0);
REQUIRE(rry[1][1] == 10);
REQUIRE(rry[2][2] == 10);
REQUIRE(rry.at(0, 0) == 0);
REQUIRE(rry.at(1, 1) == 10);
REQUIRE(rry.at(2, 2) == 10);
REQUIRE_THROWS_AS(rry.at(10, 0), std::out_of_range);
REQUIRE_THROWS_AS(rry.at(0, 10), std::out_of_range);
rry.fill(11);
rry[1] = {3, 4, 5};
REQUIRE(std::vector<size_t>(rry.begin(0), rry.end(0))
== std::vector<size_t>({11, 11, 11}));
REQUIRE(std::vector<size_t>(rry.begin(1), rry.end(1))
== std::vector<size_t>({3, 4, 5}));
REQUIRE(std::vector<size_t>(rry.begin(2), rry.end(2))
== std::vector<size_t>({11, 11, 11}));
}
LIBSEMIGROUPS_TEST_CASE("StaticTriVector2" ,
"045" ,
"all" ,
"[containers][quick]" ) {
StaticTriVector2<size_t, 3> stv;
REQUIRE(stv.size(0) == 0);
REQUIRE(stv.size(1) == 0);
REQUIRE(stv.size(2) == 0);
stv.push_back(0, 0);
stv.push_back(0, 1);
stv.push_back(0, 2);
stv.push_back(1, 3);
stv.push_back(1, 4);
stv.push_back(2, 5);
REQUIRE(stv.size(0) == 3);
REQUIRE(stv.size(1) == 2);
REQUIRE(stv.size(2) == 1);
stv.clear();
REQUIRE(stv.size(0) == 0);
REQUIRE(stv.size(1) == 0);
REQUIRE(stv.size(2) == 0);
stv.push_back(0, 0);
stv.push_back(0, 1);
stv.push_back(0, 2);
stv.push_back(1, 3);
stv.push_back(1, 4);
stv.push_back(2, 5);
REQUIRE(stv.back(0) == 2);
REQUIRE(stv.back(1) == 4);
REQUIRE(stv.back(2) == 5);
REQUIRE(stv.at(2, 0) == 5);
REQUIRE(stv.at(1, 0) == 3);
REQUIRE(stv.at(0, 0) == 0);
REQUIRE(std::vector<size_t>(stv.cbegin(0), stv.cend(0))
== std::vector<size_t>({0, 1, 2}));
REQUIRE(std::vector<size_t>(stv.cbegin(1), stv.cend(1))
== std::vector<size_t>({3, 4}));
REQUIRE(std::vector<size_t>(stv.cbegin(2), stv.cend(2))
== std::vector<size_t>({5}));
REQUIRE(std::vector<size_t>(stv.begin(0), stv.end(0))
== std::vector<size_t>({0, 1, 2}));
REQUIRE(std::vector<size_t>(stv.begin(1), stv.end(1))
== std::vector<size_t>({3, 4}));
REQUIRE(std::vector<size_t>(stv.begin(2), stv.end(2))
== std::vector<size_t>({5}));
}
} // namespace detail
} // namespace libsemigroups
quality 83%
¤ Dauer der Verarbeitung: 0.22 Sekunden
(vorverarbeitet)
¤
*© Formatika GbR, Deutschland