1//
2// immer: immutable data structures for C++
3// Copyright (C) 2016, 2017, 2018 Juan Pedro Bolivar Puente
4//
5// This software is distributed under the Boost Software License, Version 1.0.
6// See accompanying file LICENSE or copy at http://boost.org/LICENSE_1_0.txt
7//
8
9#include "fuzzer_input.hpp"
10#include <immer/set.hpp>
11#include <iostream>
12#include <array>
13
14extern "C"
15int LLVMFuzzerTestOneInput(const std::uint8_t* data, std::size_t size)
16{
17 constexpr auto var_count = 4;
18
19 using set_t= immer::set<int>;
20
21 auto vars = std::array<set_t, var_count>{};
22
23 auto is_valid_var = [&] (auto idx) {
24 return idx >= 0 && idx < var_count;
25 };
26
27 return fuzzer_input{data, size}.run([&] (auto& in)
28 {
29 enum ops {
30 op_insert,
31 op_erase,
32 op_insert_move,
33 op_erase_move,
34 op_iterate
35 };
36 auto src = read<char>(in, is_valid_var);
37 auto dst = read<char>(in, is_valid_var);
38 switch (read<char>(in))
39 {
40 case op_insert: {
41 auto value = read<size_t>(in);
42 vars[dst] = vars[src].insert(value);
43 break;
44 }
45 case op_erase: {
46 auto value = read<size_t>(in);
47 vars[dst] = vars[src].erase(value);
48 break;
49 }
50 case op_insert_move: {
51 auto value = read<size_t>(in);
52 vars[dst] = std::move(vars[src]).insert(value);
53 break;
54 }
55 case op_erase_move: {
56 auto value = read<size_t>(in);
57 vars[dst] = vars[src].erase(value);
58 break;
59 }
60 case op_iterate: {
61 auto srcv = vars[src];
62 for(const auto &v : srcv) {
63 vars[dst] = vars[dst].insert(v);
64 }
65 break;
66 }
67 default:
68 break;
69 };
70 return true;
71 });
72}
73