Skip to content

Commit 60b7ad5

Browse files
committed
Bugfixes
1 parent 7a22648 commit 60b7ad5

File tree

5 files changed

+92
-83
lines changed

5 files changed

+92
-83
lines changed

array.h

+6-5
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,9 @@ GenericArray<T> GenericArray<T>::choiceWithRepetition(size_t count) const {
397397

398398
template<typename T>
399399
GenericArray<T>& GenericArray<T>::operator+=(const GenericArray<T>& other) {
400+
if (&other == this) {
401+
return *this *= 2;
402+
}
400403
insert(end(), other.begin(), other.end());
401404
return *this;
402405
}
@@ -414,12 +417,10 @@ GenericArray<T>& GenericArray<T>::operator*=(int k) {
414417
return *this;
415418
}
416419

417-
this->reserve(this->size() * k);
420+
this->reserve(size() * k);
421+
422+
std::copy_n(begin(), size() * (k - 1), std::back_inserter(*this));
418423

419-
size_t size = this->size();
420-
while (k-- > 1) {
421-
insert(end(), begin(), begin() + size);
422-
}
423424
return *this;
424425
}
425426

impl/geometry_inl.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ Pointf GeometryRandom::pointf(long double X, long double Y) {
2222
}
2323

2424
Pointf GeometryRandom::pointf(long double C) {
25-
return point(C, C);
25+
return pointf(C, C);
2626
}
2727

2828
Polygon GeometryRandom::convexPolygon(int n, long long X, long long Y) {

jngen.h

+72-77
Original file line numberDiff line numberDiff line change
@@ -3262,6 +3262,9 @@ GenericArray<T> GenericArray<T>::choiceWithRepetition(size_t count) const {
32623262

32633263
template<typename T>
32643264
GenericArray<T>& GenericArray<T>::operator+=(const GenericArray<T>& other) {
3265+
if (&other == this) {
3266+
return *this *= 2;
3267+
}
32653268
insert(end(), other.begin(), other.end());
32663269
return *this;
32673270
}
@@ -3279,12 +3282,10 @@ GenericArray<T>& GenericArray<T>::operator*=(int k) {
32793282
return *this;
32803283
}
32813284

3282-
this->reserve(this->size() * k);
3285+
this->reserve(size() * k);
3286+
3287+
std::copy_n(begin(), size() * (k - 1), std::back_inserter(*this));
32833288

3284-
size_t size = this->size();
3285-
while (k-- > 1) {
3286-
insert(end(), begin(), begin() + size);
3287-
}
32883289
return *this;
32893290
}
32903291

@@ -4128,7 +4129,7 @@ Pointf GeometryRandom::pointf(long double X, long double Y) {
41284129
}
41294130

41304131
Pointf GeometryRandom::pointf(long double C) {
4131-
return point(C, C);
4132+
return pointf(C, C);
41324133
}
41334134

41344135
Polygon GeometryRandom::convexPolygon(int n, long long X, long long Y) {
@@ -4380,7 +4381,7 @@ class StringRandom {
43804381
created = true;
43814382
}
43824383

4383-
static std::string random(int len, const std::string& alphabet);
4384+
static std::string random(int len, const std::string& alphabet = "a-z");
43844385

43854386
template<typename ... Args>
43864387
static std::string random(const std::string& pattern, Args... args) {
@@ -4399,9 +4400,21 @@ class StringRandom {
43994400

44004401
JNGEN_EXTERN StringRandom rnds;
44014402

4403+
} // namespace jngen
4404+
4405+
using jngen::rnds;
4406+
4407+
#ifndef JNGEN_DECLARE_ONLY
4408+
#define JNGEN_INCLUDE_RNDS_INL_H
4409+
#ifndef JNGEN_INCLUDE_RNDS_INL_H
4410+
#error File "rnds_inl.h" must not be included directly.
4411+
#endif
4412+
4413+
namespace jngen {
4414+
44024415
namespace detail {
44034416

4404-
inline int popcount(long long x) {
4417+
int popcount(long long x) {
44054418
int res = 0;
44064419
while (x) {
44074420
++res;
@@ -4410,7 +4423,7 @@ inline int popcount(long long x) {
44104423
return res;
44114424
}
44124425

4413-
inline int trailingZeroes(long long x) {
4426+
int trailingZeroes(long long x) {
44144427
int res = 0;
44154428
ENSURE(x != 0);
44164429
while (!(x&1)) {
@@ -4420,7 +4433,7 @@ inline int trailingZeroes(long long x) {
44204433
return res;
44214434
}
44224435

4423-
inline std::string parseAllowedChars(std::string pattern) {
4436+
std::string parseAllowedChars(std::string pattern) {
44244437
std::string result;
44254438
pattern += "\0\0";
44264439
for (size_t i = 0; i < pattern.length(); ++i) {
@@ -4439,7 +4452,7 @@ inline std::string parseAllowedChars(std::string pattern) {
44394452
return result;
44404453
}
44414454

4442-
inline std::vector<std::string> extendAntiHash(
4455+
std::vector<std::string> extendAntiHash(
44434456
const std::vector<std::string>& chars,
44444457
HashBase base,
44454458
int count)
@@ -4524,7 +4537,7 @@ inline std::vector<std::string> extendAntiHash(
45244537
}
45254538
}
45264539

4527-
inline StringPair minimalAntiHashTest(
4540+
StringPair minimalAntiHashTest(
45284541
std::vector<HashBase> bases,
45294542
const std::string allowedChars)
45304543
{
@@ -4563,7 +4576,6 @@ inline StringPair minimalAntiHashTest(
45634576

45644577
} // namespace detail
45654578

4566-
#ifndef JNGEN_DECLARE_ONLY
45674579

45684580
std::string StringRandom::random(int len, const std::string& alphabet) {
45694581
checkLargeParameter(len);
@@ -4626,11 +4638,9 @@ StringPair StringRandom::antiHash(
46264638
};
46274639
}
46284640

4629-
#endif
4630-
46314641
} // namespace jngen
4632-
4633-
using jngen::rnds;
4642+
#undef JNGEN_INCLUDE_RNDS_INL_H
4643+
#endif // JNGEN_DECLARE_ONLY
46344644

46354645

46364646
#include <algorithm>
@@ -4672,16 +4682,15 @@ class BaseTestSuite {
46724682

46734683
T gen(size_t id, Args... args) const {
46744684
ensure(
4675-
0 < id && id <= producers_.size(),
4676-
format("Cannot generate test #%d in suite '%s', valid numbers are "
4677-
" from 1 to %d",
4678-
(int)id, name_.c_str(), (int)producers_.size()));
4685+
id < producers_.size(),
4686+
format("Cannot generate test #%d in suite '%s', there are only "
4687+
"%d", (int)id, name_.c_str(), (int)producers_.size()));
46794688
return producers_[id](args...);
46804689
}
46814690

46824691
T gen(const std::string& name, Args... args) const {
4683-
size_t pos =
4684-
std::find(names_.begin(), names_.end(), name) - names_.begin();
4692+
size_t pos = std::find(names_.begin(), names_.end(), name)
4693+
- names_.begin();
46854694
ensure(
46864695
pos < names_.size(),
46874696
format("There is no test '%s' in suite '%s'",
@@ -4692,19 +4701,17 @@ class BaseTestSuite {
46924701
TArray<T> genMany(size_t count, Args... args) const {
46934702
ensure(
46944703
count <= producers_.size(),
4695-
format("Cannot generate test #%d in suite '%s', valid numbers are "
4696-
" from 1 to %d",
4697-
(int)count, name_.c_str(), (int)producers_.size()));
4704+
format("Cannot generate %d tests in suite '%s', there are only "
4705+
"%d", (int)count, name_.c_str(), (int)producers_.size()));
46984706

46994707
TArray<T> result;
47004708
result.reserve(count);
4701-
for (size_t id = 1; id <= count; ++id) {
4709+
for (size_t id = 0; id < count; ++id) {
47024710
try {
47034711
result.push_back(gen(id, args...));
47044712
} catch (...) {
4705-
std::cerr << "Failed to generate test #" << id << " of suite "
4713+
std::cerr << "Cannot generate test #" << id << " of suite "
47064714
<< name_ << "\n";
4707-
throw;
47084715
}
47094716
}
47104717

@@ -6303,54 +6310,6 @@ class GeneralTreeSuite : public BaseTestSuite<Tree, int> {
63036310
return Tree::random(n);
63046311
};
63056312

6306-
JNGEN_ADD_PRODUCER(kruskal1) {
6307-
return Tree::randomKruskal(n);
6308-
};
6309-
6310-
JNGEN_ADD_PRODUCER(kruskal2) {
6311-
return Tree::randomKruskal(n);
6312-
};
6313-
6314-
JNGEN_ADD_PRODUCER(kruskal3) {
6315-
return Tree::randomKruskal(n);
6316-
};
6317-
6318-
JNGEN_ADD_PRODUCER(random_w-100) {
6319-
return Tree::randomPrim(n, -100);
6320-
};
6321-
6322-
JNGEN_ADD_PRODUCER(random_w-50) {
6323-
return Tree::randomPrim(n, -50);
6324-
};
6325-
6326-
JNGEN_ADD_PRODUCER(random_w-10) {
6327-
return Tree::randomPrim(n, -10);
6328-
};
6329-
6330-
JNGEN_ADD_PRODUCER(random_w-5) {
6331-
return Tree::randomPrim(n, -5);
6332-
};
6333-
6334-
JNGEN_ADD_PRODUCER(random_w0) {
6335-
return Tree::randomPrim(n, 0);
6336-
};
6337-
6338-
JNGEN_ADD_PRODUCER(random_w5) {
6339-
return Tree::randomPrim(n, 5);
6340-
};
6341-
6342-
JNGEN_ADD_PRODUCER(random_w10) {
6343-
return Tree::randomPrim(n, 10);
6344-
};
6345-
6346-
JNGEN_ADD_PRODUCER(random_w50) {
6347-
return Tree::randomPrim(n, 50);
6348-
};
6349-
6350-
JNGEN_ADD_PRODUCER(random_w100) {
6351-
return Tree::randomPrim(n, 100);
6352-
};
6353-
63546313
JNGEN_ADD_PRODUCER(bamboo) {
63556314
return Tree::bamboo(n);
63566315
};
@@ -6436,6 +6395,42 @@ class GeneralTreeSuite : public BaseTestSuite<Tree, int> {
64366395
return t1.link(n/2 - 1, t2, 0);
64376396
};
64386397

6398+
JNGEN_ADD_PRODUCER(random_w-100) {
6399+
return Tree::randomPrim(n, -100);
6400+
};
6401+
6402+
JNGEN_ADD_PRODUCER(random_w-50) {
6403+
return Tree::randomPrim(n, -50);
6404+
};
6405+
6406+
JNGEN_ADD_PRODUCER(random_w-10) {
6407+
return Tree::randomPrim(n, -10);
6408+
};
6409+
6410+
JNGEN_ADD_PRODUCER(random_w-5) {
6411+
return Tree::randomPrim(n, -5);
6412+
};
6413+
6414+
JNGEN_ADD_PRODUCER(random_w0) {
6415+
return Tree::randomPrim(n, 0);
6416+
};
6417+
6418+
JNGEN_ADD_PRODUCER(random_w5) {
6419+
return Tree::randomPrim(n, 5);
6420+
};
6421+
6422+
JNGEN_ADD_PRODUCER(random_w10) {
6423+
return Tree::randomPrim(n, 10);
6424+
};
6425+
6426+
JNGEN_ADD_PRODUCER(random_w50) {
6427+
return Tree::randomPrim(n, 50);
6428+
};
6429+
6430+
JNGEN_ADD_PRODUCER(random_w100) {
6431+
return Tree::randomPrim(n, 100);
6432+
};
6433+
64396434
#undef JNGEN_PRODUCER_ARGS
64406435
}
64416436
};

tests/Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
CXXFLAGS = -O2 -Wall -Wextra -Werror -std=c++11
22
CXXFLAGS += -DJNGEN_DECLARE_ONLY
33
LDFLAGS += -lboost_system -lboost_unit_test_framework
4+
CXXFLAGS += -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC
45

56
CXX = g++-5
67
# CXX = clang++-3.5

tests/geometry.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,21 @@ BOOST_AUTO_TEST_CASE(comparators) {
1414
BOOST_CHECK(eq(1 + 1e-10, 1 - 1e-10));
1515
}
1616

17+
BOOST_AUTO_TEST_CASE(points_generation) {
18+
auto a = rnda.randomfAll([]() { return rndg.point(3); });
19+
BOOST_TEST(a.size() == 16);
20+
21+
auto b = rnda.randomfAll([]() { return rndg.point(2, 3); });
22+
BOOST_TEST(b.size() == 12);
23+
24+
auto c = rnda.randomf(100, []() { return rndg.pointf(1); });
25+
BOOST_TEST(c.size() == 100);
26+
}
27+
1728
BOOST_AUTO_TEST_CASE(polygon) {
1829
rnd.seed(123);
1930
auto p = rndg.convexPolygon(10, 100, 100);
31+
// TODO: check that it is convex
2032
BOOST_CHECK_EQUAL(p.size(), 10);
2133
}
2234

0 commit comments

Comments
 (0)