65 if (*rootp ==
nullptr) {
75 if (key < found->key) {
77 newNode->
right = found;
78 found->
left =
nullptr;
80 newNode->
left = found;
82 found->
right =
nullptr;
91 if (!out.insert(root->
key).second)
101 *rootp =
splay(*rootp, key);
102 return (*rootp)->key == key;
106 const std::vector<uintptr_t>& insertion_order) {
108 for (
size_t i = 0; i < insertion_order.size(); ++i) {
109 insert(&root, insertion_order[i], (
int)i, apply_fix);
114 std::set<uintptr_t> reachable;
117 size_t missing_reachable = 0;
118 for (uintptr_t k : insertion_order) {
119 if (!reachable.count(k))
127 size_t missing_splay = 0;
128 for (uintptr_t k : insertion_order) {
134 "[%s] insert=%zu reachable=%zu splay_lookups_failed=%zu missing_reachable=%zu\n",
135 label, insertion_order.size(), reachable.size(),
136 missing_splay, missing_reachable);
137 return missing_reachable == 0 && missing_splay == 0;
146 std::vector<uintptr_t> asc = {100, 200, 300, 400, 500, 600, 700, 800};
147 std::vector<uintptr_t> desc = {800, 700, 600, 500, 400, 300, 200, 100};
148 std::vector<uintptr_t>
mix = {500, 100, 900, 300, 700, 200, 800, 400, 600};
152 const std::vector<uintptr_t>* seq;
156 {
"descending", &desc},
161 for (
const Case& c : cases) {
162 fprintf(stderr,
"\n== scenario: %s ==\n", c.name);
172 fprintf(stderr,
"[FAIL] FIXED scenario '%s' should have passed\n", c.name);
178 fprintf(stderr,
"\n== composite (BUGGY must fail at least one scenario) ==\n");
179 bool any_buggy_failure =
false;
180 for (
const Case& c : cases) {
182 any_buggy_failure =
true;
185 if (!any_buggy_failure) {
186 fprintf(stderr,
"[FAIL] baseline BUGGY variant unexpectedly passed all scenarios\n");
189 fprintf(stderr,
"[OK ] baseline BUGGY variant does fail as expected\n");
192 fprintf(stderr,
"\n%d failures\n", failures);
193 return failures == 0 ? 0 : 1;
uint8_t value[MAX_WRITE_OP_LENGTH]
#define REGULAR_SPLAY_TREE(type, root, key, value, left, right)
static void insert(TraceSplay **rootp, uintptr_t key, int value, bool apply_fix)
static bool run_scenario(bool apply_fix, const char *label, const std::vector< uintptr_t > &insertion_order)
static bool splay_finds(TraceSplay **rootp, uintptr_t key)
static void collect_keys(TraceSplay *root, std::set< uintptr_t > &out)
static TraceSplay * splay(TraceSplay *root, uintptr_t key)