ZeroErr
Loading...
Searching...
No Matches
arbitrary.h
Go to the documentation of this file.
1#pragma once
3
5
9
10#include <limits>
11
13
14namespace zeroerr {
15
16
41template <typename T, unsigned N = 2, typename = void>
42class Arbitrary : public Arbitrary<T, N-1> {};
43
44template <typename T>
45struct Arbitrary <T, 0> {
46 static_assert(detail::always_false<T>::value, "No Arbitrary specialization for this type");
47};
48
49template <>
50class Arbitrary<bool> : public DomainConvertable<bool> {
51public:
52 using ValueType = bool;
53 using CorpusType = bool;
54
55 CorpusType GetRandomCorpus(Rng& rng) const override { return rng.bounded(2); }
56
57 void Mutate(Rng&, CorpusType& v, bool) const override { v = !v; }
58};
59
60
61template <typename T>
63 typename std::enable_if<std::is_integral<T>::value && !std::numeric_limits<T>::is_signed,
64 void>::type;
65template <typename T>
66class Arbitrary<T, 2, is_unsigned_int<T>> : public DomainConvertable<T> {
67public:
68 using ValueType = T;
69 using CorpusType = T;
70
71 CorpusType GetRandomCorpus(Rng& rng) const override { return static_cast<T>(rng.bounded(100)); }
72
73 void Mutate(Rng& rng, CorpusType& v, bool only_shrink) const override {
74 v = static_cast<T>(rng.bounded(100));
75 }
76};
77
78template <typename T>
80 typename std::enable_if<std::is_integral<T>::value && std::numeric_limits<T>::is_signed,
81 void>::type;
82
83template <typename T>
84class Arbitrary<T, 2, is_signed_int<T>> : public DomainConvertable<T> {
85public:
86 using ValueType = T;
87 using CorpusType = T;
88
89 CorpusType GetRandomCorpus(Rng& rng) const override { return static_cast<T>(rng.bounded(100)); }
90
91 void Mutate(Rng& rng, CorpusType& v, bool only_shrink) const override {
92 v = static_cast<T>(rng.bounded(100));
93 v -= 50;
94 }
95};
96
97template <typename T>
98using is_float_point = typename std::enable_if<std::is_floating_point<T>::value, void>::type;
99template <typename T>
100class Arbitrary<T, 2, is_float_point<T>> : public DomainConvertable<T> {
101public:
102 using ValueType = T;
103 using CorpusType = T;
104
105 CorpusType GetRandomCorpus(Rng& rng) const override {
106 return static_cast<T>(rng.bounded(1000));
107 }
108
109 void Mutate(Rng& rng, CorpusType& v, bool only_shrink) const override {
110 v = static_cast<T>(rng.bounded(1000));
111 }
112};
113
114
115template <typename T>
117 typename std::enable_if<detail::is_specialization<T, std::basic_string>::value>::type;
118
119template <typename T>
120class Arbitrary<T, 2, is_string<T>> : public Domain<T, std::vector<typename T::value_type>> {
122
123public:
124 using ValueType = T;
125 using CorpusType = std::vector<typename T::value_type>;
126
127 ValueType GetValue(const CorpusType& v) const override { return ValueType(v.begin(), v.end()); }
128 CorpusType FromValue(const ValueType& v) const override {
129 return CorpusType(v.begin(), v.end());
130 }
131
132 CorpusType GetRandomCorpus(Rng& rng) const override { return impl.GetRandomCorpus(rng); }
133
134 void Mutate(Rng& rng, CorpusType& v, bool only_shrink) const override {
135 impl.Mutate(rng, v, only_shrink);
136 }
137};
138
139template <typename T>
140using is_modifiable = typename std::enable_if<detail::is_modifiable<T>::value>::type;
141
142template <typename T>
144 : public SequenceContainerOf<T, Arbitrary<typename T::value_type>> {
145public:
147 : SequenceContainerOf<T, Arbitrary<typename T::value_type>>(
148 Arbitrary<typename T::value_type>{}) {}
149};
150
151template <typename T, typename U>
152class Arbitrary<std::pair<T, U>, 1>
153 : public AggregateOf<
154 std::pair<typename std::remove_const<T>::type, typename std::remove_const<U>::type>> {};
155
156
157template <typename... T>
158class Arbitrary<std::tuple<T...>, 1>
159 : public AggregateOf<std::tuple<typename std::remove_const<T>::type...>> {};
160
161template <typename T>
162class Arbitrary<const T, 2> : public Arbitrary<T> {};
163
164} // namespace zeroerr
165
AggregateOf is a domain that combines multiple inner domains into a tuple or aggregate type.
Definition aggregate_of.h:41
CorpusType GetRandomCorpus(Rng &rng) const override
Definition arbitrary.h:105
void Mutate(Rng &rng, CorpusType &v, bool only_shrink) const override
Definition arbitrary.h:109
void Mutate(Rng &rng, CorpusType &v, bool only_shrink) const override
Definition arbitrary.h:91
CorpusType GetRandomCorpus(Rng &rng) const override
Definition arbitrary.h:89
CorpusType GetRandomCorpus(Rng &rng) const override
Definition arbitrary.h:132
T ValueType
Definition arbitrary.h:124
std::vector< typename T::value_type > CorpusType
Definition arbitrary.h:125
CorpusType FromValue(const ValueType &v) const override
Definition arbitrary.h:128
ValueType GetValue(const CorpusType &v) const override
Definition arbitrary.h:127
void Mutate(Rng &rng, CorpusType &v, bool only_shrink) const override
Definition arbitrary.h:134
void Mutate(Rng &rng, CorpusType &v, bool only_shrink) const override
Definition arbitrary.h:73
CorpusType GetRandomCorpus(Rng &rng) const override
Definition arbitrary.h:71
bool ValueType
Definition arbitrary.h:52
void Mutate(Rng &, CorpusType &v, bool) const override
Definition arbitrary.h:57
CorpusType GetRandomCorpus(Rng &rng) const override
Definition arbitrary.h:55
bool CorpusType
Definition arbitrary.h:53
Arbitrary is a domain that generates random values of a given type.
Definition arbitrary.h:42
DomainConvertable is a base class for domains that can be converted to and from a ValueType.
Definition domain.h:48
Domain class for generating random values of a specific type.
Definition domain.h:21
Definition rng.h:30
uint32_t bounded(uint32_t range) noexcept
Definition rng.h:126
Definition container_of.h:97
#define ZEROERR_SUPPRESS_COMMON_WARNINGS_POP
Definition config.h:265
#define ZEROERR_SUPPRESS_COMMON_WARNINGS_PUSH
Definition config.h:218
STL namespace.
Definition benchmark.cpp:17
typename std::enable_if< std::is_integral< T >::value &&!std::numeric_limits< T >::is_signed, void >::type is_unsigned_int
Definition arbitrary.h:64
typename std::enable_if< std::is_integral< T >::value &&std::numeric_limits< T >::is_signed, void >::type is_signed_int
Definition arbitrary.h:81
typename std::enable_if< detail::is_specialization< T, std::basic_string >::value >::type is_string
Definition arbitrary.h:117
typename std::enable_if< std::is_floating_point< T >::value, void >::type is_float_point
Definition arbitrary.h:98
typename std::enable_if< detail::is_modifiable< T >::value >::type is_modifiable
Definition arbitrary.h:140
Definition typetraits.h:61