6#include <unordered_set>
8#include "testing/testing.h"
22TEST(set, DefaultConstructor)
26 EXPECT_TRUE(set.is_empty());
29TEST(set, ContainsNotExistant)
32 EXPECT_FALSE(set.contains(3));
38 EXPECT_FALSE(set.contains(5));
39 EXPECT_TRUE(set.is_empty());
41 EXPECT_TRUE(set.contains(5));
42 EXPECT_FALSE(set.is_empty());
48 for (
int i = 0; i < 100; i++) {
52 for (
int i = 50; i < 100; i++) {
53 EXPECT_TRUE(set.contains(i));
55 for (
int i = 100; i < 150; i++) {
56 EXPECT_FALSE(set.contains(i));
60TEST(set, InitializerListConstructor)
64 EXPECT_TRUE(set.contains(4));
65 EXPECT_TRUE(set.contains(5));
66 EXPECT_TRUE(set.contains(6));
67 EXPECT_FALSE(set.contains(2));
68 EXPECT_FALSE(set.contains(3));
74 EXPECT_TRUE(set.contains(3));
75 EXPECT_FALSE(set.contains(4));
82 EXPECT_FALSE(set.contains(4));
97 EXPECT_TRUE(set.contains(3));
98 EXPECT_FALSE(set.contains(4));
106 EXPECT_FALSE(set.contains(4));
114 set2 = std::move(set);
122 EXPECT_TRUE(set.contains(3));
123 EXPECT_TRUE(set.contains(4));
124 EXPECT_TRUE(set.contains(5));
125 set.remove_contained(4);
126 EXPECT_TRUE(set.contains(3));
127 EXPECT_FALSE(set.contains(4));
128 EXPECT_TRUE(set.contains(5));
129 set.remove_contained(3);
130 EXPECT_FALSE(set.contains(3));
131 EXPECT_FALSE(set.contains(4));
132 EXPECT_TRUE(set.contains(5));
133 set.remove_contained(5);
134 EXPECT_FALSE(set.contains(3));
135 EXPECT_FALSE(set.contains(4));
136 EXPECT_FALSE(set.contains(5));
142 for (
int i = 0; i < 1000; i++) {
145 for (
int i = 100; i < 1000; i++) {
146 set.remove_contained(i);
148 for (
int i = 900; i < 1000; i++) {
152 for (
int i = 0; i < 1000; i++) {
153 if (i < 100 || i >= 900) {
154 EXPECT_TRUE(set.contains(i));
157 EXPECT_FALSE(set.contains(i));
182 EXPECT_TRUE(a.contains(5));
183 EXPECT_TRUE(a.contains(7));
184 EXPECT_FALSE(a.contains(4));
185 a.add_multiple({2, 4, 7});
186 EXPECT_TRUE(a.contains(4));
187 EXPECT_TRUE(a.contains(2));
195 EXPECT_TRUE(a.contains(5));
196 EXPECT_TRUE(a.contains(6));
203 for (
int value :
set) {
214TEST(set, OftenAddRemoveContained)
217 for (
int i = 0; i < 100; i++) {
220 set.remove_contained(42);
228 set.add_new(std::make_unique<int>());
229 auto value1 = std::make_unique<int>();
230 set.add_new(std::move(value1));
231 set.add(std::make_unique<int>());
250 EXPECT_TRUE(set.contains(
"hello"));
251 EXPECT_TRUE(set.contains(
"world"));
252 EXPECT_FALSE(set.contains(
"world2"));
262 EXPECT_TRUE(set.contains(&a));
263 EXPECT_TRUE(set.contains(&
b));
264 EXPECT_FALSE(set.contains(&c));
271 EXPECT_TRUE(set.remove(2));
273 EXPECT_FALSE(set.contains(2));
274 EXPECT_FALSE(set.remove(2));
276 EXPECT_TRUE(set.remove(5));
290 return a.value ==
b.value;
294 return a.value ==
b.value;
318 EXPECT_TRUE(set.contains_as(
Type1{5}));
319 EXPECT_TRUE(set.contains_as(
Type2{5}));
320 EXPECT_FALSE(set.contains_as(
Type1{6}));
321 EXPECT_FALSE(set.contains_as(
Type2{6}));
328 EXPECT_TRUE(set.contains_as(
"test"));
329 EXPECT_TRUE(set.contains_as(
StringRef(
"test")));
330 EXPECT_FALSE(set.contains_as(
"string"));
331 EXPECT_FALSE(set.contains_as(
StringRef(
"string")));
338 EXPECT_TRUE(set.contains_as(
Type2{5}));
339 set.remove_contained_as(
Type2{5});
340 EXPECT_FALSE(set.contains_as(
Type2{5}));
347 EXPECT_TRUE(set.contains_as(
Type2{5}));
348 set.remove_as(
Type2{6});
349 EXPECT_TRUE(set.contains_as(
Type2{5}));
350 set.remove_as(
Type2{5});
351 EXPECT_FALSE(set.contains_as(
Type2{5}));
352 set.remove_as(
Type2{5});
353 EXPECT_FALSE(set.contains_as(
Type2{5}));
359 EXPECT_TRUE(set.add_as(
"test"));
360 EXPECT_TRUE(set.add_as(
StringRef(
"qwe")));
361 EXPECT_FALSE(set.add_as(
StringRef(
"test")));
362 EXPECT_FALSE(set.add_as(
"qwe"));
368 return (a %
N) == (
b %
N);
379TEST(set, CustomizeHashAndEquality)
383 EXPECT_TRUE(set.contains(4));
384 EXPECT_TRUE(set.contains(14));
385 EXPECT_TRUE(set.contains(104));
386 EXPECT_FALSE(set.contains(5));
388 EXPECT_TRUE(set.contains(5));
389 EXPECT_TRUE(set.contains(14));
391 EXPECT_FALSE(set.contains(14));
403 EXPECT_TRUE(set.add(4));
404 EXPECT_TRUE(set.add(3));
405 EXPECT_TRUE(set.add(11));
406 EXPECT_TRUE(set.add(8));
407 EXPECT_FALSE(set.add(3));
408 EXPECT_FALSE(set.add(4));
409 EXPECT_TRUE(set.remove(4));
410 EXPECT_FALSE(set.remove(7));
411 EXPECT_TRUE(set.add(4));
412 EXPECT_TRUE(set.remove(4));
426 return a.key ==
b.key;
435 EXPECT_EQ(set.lookup_key({1, 30}).attached_data, 10);
436 EXPECT_EQ(set.lookup_key({2, 0}).attached_data, 20);
446 EXPECT_EQ(set.lookup_key_default({1, 66}, fallback).attached_data, 10);
447 EXPECT_EQ(set.lookup_key_default({4, 40}, fallback).attached_data, 50);
455 EXPECT_EQ(set.lookup_key_ptr({1, 50})->attached_data, 10);
456 EXPECT_EQ(set.lookup_key_ptr({2, 50})->attached_data, 20);
457 EXPECT_EQ(set.lookup_key_ptr({3, 50}),
nullptr);
463 set.lookup_key_or_add({1, 10});
464 set.lookup_key_or_add({2, 20});
466 EXPECT_EQ(set.lookup_key_or_add({2, 40}).attached_data, 20);
468 EXPECT_EQ(set.lookup_key_or_add({3, 40}).attached_data, 40);
470 EXPECT_EQ(set.lookup_key_or_add({3, 60}).attached_data, 40);
479 EXPECT_FALSE(set.contains(
"worlds"));
480 EXPECT_TRUE(set.contains(
"world"));
481 EXPECT_TRUE(set.contains(
"hello"));
484TEST(set, SpanConstructorExceptions)
486 std::array<ExceptionThrower, 5>
array = {1, 2, 3, 4, 5};
487 array[3].throw_during_copy =
true;
493TEST(set, CopyConstructorExceptions)
500TEST(set, MoveConstructorExceptions)
503 SetType set = {1, 2, 3};
505 EXPECT_ANY_THROW({ SetType set_moved(std::move(set)); });
507 set.add_multiple({3, 6, 7});
516 EXPECT_ANY_THROW({ set.add_new(value); });
518 EXPECT_ANY_THROW({ set.add_new(value); });
527 EXPECT_ANY_THROW({ set.add(value); });
529 EXPECT_ANY_THROW({ set.add(value); });
552 EXPECT_FALSE(std::any_of(set.begin(), set.end(), [](
int v) { return v == 5; }));
553 EXPECT_TRUE(std::any_of(set.begin(), set.end(), [](
int v) { return v == 30; }));
554 EXPECT_EQ(std::count(set.begin(), set.end(), 20), 1);
557TEST(set, RemoveDuringIteration)
568 Iter begin = set.begin();
569 Iter end = set.end();
570 for (Iter iter = begin; iter != end; ++iter) {
578 EXPECT_TRUE(set.contains(5));
579 EXPECT_TRUE(set.contains(6));
580 EXPECT_TRUE(set.contains(3));
589 const int64_t removed = set.remove_if([](
const int64_t key) {
return key > 100; });
596TEST(set, RemoveUniquePtrWithRaw)
599 std::unique_ptr<int> a = std::make_unique<int>(5);
600 int *a_ptr = a.get();
601 set.add(std::move(a));
603 set.remove_as(a_ptr);
604 EXPECT_TRUE(set.is_empty());
612 const Set<int> d = {1, 2, 3, 4, 5, 6};
614 const Set<int> f = {10, 11, 12, 13, 14};
633template<
typename SetT>
638 for (
int i = 0; i < amount; i++) {
647 for (
int value : values) {
654 for (
int value : values) {
655 count += set.contains(value);
660 for (
int value : values) {
661 count += set.remove(value);
666 std::cout <<
"Count: " <<
count <<
"\n";
673template<
typename Key>
class StdUnorderedSetWrapper {
675 using SetType = std::unordered_set<Key, blender::DefaultHash<Key>>;
684 bool is_empty()
const
691 set_.reserve(
size_t(n));
694 void add_new(
const Key &key)
698 void add_new(
Key &&key)
700 set_.insert(std::move(key));
705 return set_.insert(key).second;
709 return set_.insert(std::move(key)).second;
712 void add_multiple(Span<Key> keys)
714 for (
const Key &key : keys) {
719 bool contains(
const Key &key)
const
721 return set_.find(key) != set_.end();
724 bool remove(
const Key &key)
726 return bool(set_.erase(key));
729 void remove_contained(
const Key &key)
731 return set_.erase(key);
739 typename SetType::iterator begin()
const
744 typename SetType::iterator end()
const
752 for (
int i = 0; i < 3; i++) {
753 benchmark_random_ints<Set<int>>(
"blender::Set ", 100000, 1);
754 benchmark_random_ints<StdUnorderedSetWrapper<int>>(
"std::unordered_set", 100000, 1);
757 for (
int i = 0; i < 3; i++) {
759 benchmark_random_ints<Set<int>>(
"blender::Set ", 100000,
int(factor));
760 benchmark_random_ints<StdUnorderedSetWrapper<int>>(
"std::unordered_set", 100000,
int(factor));
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
void int BLI_rng_get_int(struct RNG *rng) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
struct RNG * BLI_rng_new(unsigned int seed)
void BLI_rng_free(struct RNG *rng) ATTR_NONNULL(1)
#define SCOPED_TIMER(name)
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
void add_multiple_new(Span< Key > keys)
const Key & lookup_key(const Key &key) const
bool contains(const Key &key) const
void add_multiple(Span< Key > keys)
bool contains(const T &value) const
void append(const T &value)
local_group_size(16, 16) .push_constant(Type b
node_ attributes set("label", ss.str())
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
static void clear(Message &msg)
static void add(blender::Map< std::string, std::string > &messages, Message &msg)
static bool operator==(const Type1 &a, const Type1 &b)
TEST(any, DefaultConstructor)
PythonProbingStrategy<> DefaultProbingStrategy
unsigned __int64 uint64_t
uint32_t operator()(const tests::Type1 &value) const
uint32_t operator()(const tests::Type2 &value) const
bool operator()(uint a, uint b) const
uint64_t operator()(uint value) const
friend bool operator==(const MyKeyType &a, const MyKeyType &b)