def __init__(self, type, values): values = tuple(type.value(v) for v in values) iterator = ValuesIterator(type, values) generator = Function().returns(type) generator.code(""" switch({{rand_int}}(0, {{_size}})) { {%- for i, v in _values %} case {{i}}: return {{b(v)}}; {%- endfor %} default: assert(0); } """, _values=enumerate(values), _size=len(values), rand_int=rand_int) generator.uses(values) super().__init__(type, iterator, generator())
def _make_generator(self, type, domains, ratios): generators = tuple(d.generator for d in domains) f = Function(returns=type) f.code(""" qint s = 0; {%- for r in _ratios %} s += {{b(r)}}; {%- if not loop.last %} qint r{{loop.index0}} = s; {%- endif %} {%- endfor %} qint r = {{rand_int}}(0, s); {%- for g in _generators %} {%- if not loop.last %} if (r < r{{loop.index0}}) {% endif %} { return {{b(g)}}; } {%- endfor %} """, _generators=generators, _ratios=ratios, rand_int=rand_int) f.uses(generators + ratios) return f()