45 if (value >
static_cast<unsigned>((std::numeric_limits<int>::max)()))
46 throw std::invalid_argument(
"Container size exceeds supported range");
47 return static_cast<int>(value);
52 throw std::invalid_argument(
"Invalid container size bounds");
57 if (
size != -1)
return static_cast<unsigned>(
size);
62 template <
class Inner,
class Corpus>
63 void mutate(
Rng& rng, Corpus& v,
bool only_shrink,
const Inner& inner)
const {
67 if (v.size() < lower || v.size() > upper)
68 throw std::invalid_argument(
"Corpus violates container size bounds");
69 const unsigned action = rng.
bounded(5);
70 if (
size == -1 && action == 0) {
72 v.erase(v.begin() + rng.
bounded(
static_cast<uint32_t
>(v.size())));
73 }
else if (
size == -1 && action == 1 && !only_shrink) {
74 if (v.size() < upper) v.push_back(inner.GetRandomCorpus(rng));
75 }
else if (!v.empty()) {
76 inner.Mutate(rng, v[rng.
bounded(
static_cast<uint32_t
>(v.size()))], only_shrink);
83template <
typename T,
typename InnerDomain>
86 InnerDomain inner_domain;
90 using CorpusType = std::vector<typename InnerDomain::CorpusType>;
96 for (
const auto& elem : v) {
97 result.insert(inner_domain.GetValue(elem));
104 for (
const auto& elem : v) {
105 result.push_back(inner_domain.FromValue(elem));
114 for (
unsigned i = 0; i < E; i++) {
115 result.push_back(inner_domain.GetRandomCorpus(rng));
121 mutate(rng, v, only_shrink, inner_domain);
125template <
typename T,
typename InnerDomain>
128 InnerDomain inner_domain;
132 using CorpusType = std::vector<typename InnerDomain::CorpusType>;
147 for (
unsigned i = 0; i < E; i++) {
148 result.push_back(inner_domain.GetRandomCorpus(rng));
154 mutate(rng, v, only_shrink, inner_domain);
171template <
typename T,
typename Inner>
172typename std::enable_if<detail::is_associative_container<T>::value,
173 AssociativeContainerOf<T, Inner>>::type
178template <
typename T,
typename Inner>
179typename std::enable_if<!detail::is_associative_container<T>::value &&
180 detail::is_container<T>::value,
181 SequenceContainerOf<T, Inner>>::type
192template <
template <
typename,
typename...>
class T,
typename... Inner,
193 typename C = T<
typename Inner::ValueType...>>
Definition container_of.h:85
std::vector< typename InnerDomain::CorpusType > CorpusType
Definition container_of.h:90
AssociativeContainerOf(InnerDomain &&inner_domain)
Definition container_of.h:92
void Mutate(Rng &rng, CorpusType &v, bool only_shrink) const override
Definition container_of.h:120
T ValueType
Definition container_of.h:89
CorpusType GetRandomCorpus(Rng &rng) const override
Definition container_of.h:110
virtual CorpusType FromValue(const ValueType &v) const override
Definition container_of.h:102
virtual ValueType GetValue(const CorpusType &v) const override
Definition container_of.h:94
Domain class for generating random values of a specific type.
Definition domain.h:21
uint32_t bounded(uint32_t range) noexcept
Definition rng.h:126
Definition container_of.h:127
SequenceContainerOf(InnerDomain &&inner_domain)
Definition container_of.h:134
virtual ValueType GetValue(const CorpusType &v) const override
Definition container_of.h:136
void Mutate(Rng &rng, CorpusType &v, bool only_shrink) const override
Definition container_of.h:153
CorpusType GetRandomCorpus(Rng &rng) const override
Definition container_of.h:143
virtual CorpusType FromValue(const ValueType &v) const override
Definition container_of.h:139
T ValueType
Definition container_of.h:131
std::vector< typename InnerDomain::CorpusType > CorpusType
Definition container_of.h:132
#define ZEROERR_SUPPRESS_COMMON_WARNINGS_POP
Definition config.h:283
#define ZEROERR_SUPPRESS_COMMON_WARNINGS_PUSH
Definition config.h:235
Definition assert_text.cpp:5
std::enable_if< detail::is_associative_container< T >::value, AssociativeContainerOf< T, Inner > >::type ContainerOf(Inner &&inner)
Definition container_of.h:174
ContainerOf is a domain that generates random containers filled with elements from an inner domain.
Definition container_of.h:36
int min_size
Definition container_of.h:37
unsigned randomSize(Rng &rng) const
Definition container_of.h:55
void mutate(Rng &rng, Corpus &v, bool only_shrink, const Inner &inner) const
Definition container_of.h:63
void WithMinSize(unsigned value)
Definition container_of.h:40
static int checkedSize(unsigned value)
Definition container_of.h:44
void validate() const
Definition container_of.h:50
int max_size
Definition container_of.h:37
void WithSize(unsigned value)
Definition container_of.h:41
void WithMaxSize(unsigned value)
Definition container_of.h:39
int size
Definition container_of.h:37