//
// 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