diff options
author | Bastien Montagne <bastien@blender.org> | 2021-11-19 16:39:40 +0300 |
---|---|---|
committer | Bastien Montagne <bastien@blender.org> | 2021-11-19 17:41:36 +0300 |
commit | d6ea881a741a254b6f4e931ea25047d3f51686d0 (patch) | |
tree | acd9b37713733c54b71a0768454b54067bee0272 /source/blender/blenlib/tests | |
parent | 04ec36f677d47e3a70baa944bb26fc03d5e8d52e (diff) |
BLI_listbase: Add utils to search from string or index.
If a valid matching string is found, return that item, otherwise
fallback to the item matching the given index, if any.
This will be useful in RNA override code, and potentially other
areas where data in lists can be referenced by their names or indices.
Diffstat (limited to 'source/blender/blenlib/tests')
-rw-r--r-- | source/blender/blenlib/tests/BLI_listbase_test.cc | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/source/blender/blenlib/tests/BLI_listbase_test.cc b/source/blender/blenlib/tests/BLI_listbase_test.cc index 0ba08a0cd48..d66eb214902 100644 --- a/source/blender/blenlib/tests/BLI_listbase_test.cc +++ b/source/blender/blenlib/tests/BLI_listbase_test.cc @@ -96,6 +96,64 @@ TEST(listbase, FindLinkOrIndex) BLI_freelistN(&lb); } +TEST(listbase, FindLinkFromStringOrPointer) +{ + struct TestLink { + struct TestLink *prev, *next; + char name[64]; + const void *ptr; + }; + + const char *const link1_name = "Link1"; + const char *const link2_name = "Link2"; + const void *const link1_ptr = nullptr; + const void *const link2_ptr = link2_name; + + const size_t name_offset = offsetof(struct TestLink, name); + const size_t ptr_offset = offsetof(struct TestLink, ptr); + + ListBase lb; + struct TestLink *link1 = (struct TestLink *)MEM_callocN(sizeof(TestLink), "link1"); + BLI_strncpy(link1->name, link1_name, sizeof(link1->name)); + link1->ptr = link1_ptr; + struct TestLink *link2 = (struct TestLink *)MEM_callocN(sizeof(TestLink), "link2"); + BLI_strncpy(link2->name, link2_name, sizeof(link2->name)); + link2->ptr = link2_ptr; + + /* Empty list */ + BLI_listbase_clear(&lb); + EXPECT_EQ(BLI_findptr(&lb, link1_ptr, ptr_offset), (void *)nullptr); + EXPECT_EQ(BLI_findstring(&lb, link1_name, name_offset), (void *)nullptr); + EXPECT_EQ(BLI_rfindptr(&lb, link1_ptr, ptr_offset), (void *)nullptr); + EXPECT_EQ(BLI_rfindstring(&lb, link1_name, name_offset), (void *)nullptr); + EXPECT_EQ(BLI_listbase_string_or_index_find(&lb, link1_name, name_offset, 0), (void *)nullptr); + + /* One link */ + BLI_addtail(&lb, link1); + EXPECT_EQ(BLI_findptr(&lb, link1_ptr, ptr_offset), (void *)link1); + EXPECT_EQ(BLI_findstring(&lb, link1_name, name_offset), (void *)link1); + EXPECT_EQ(BLI_rfindptr(&lb, link1_ptr, ptr_offset), (void *)link1); + EXPECT_EQ(BLI_rfindstring(&lb, link1_name, name_offset), (void *)link1); + EXPECT_EQ(BLI_listbase_string_or_index_find(&lb, link1_name, name_offset, 0), (void *)link1); + EXPECT_EQ(BLI_listbase_string_or_index_find(&lb, "", name_offset, 0), (void *)link1); + EXPECT_EQ(BLI_listbase_string_or_index_find(&lb, nullptr, name_offset, 0), (void *)link1); + EXPECT_EQ(BLI_listbase_string_or_index_find(&lb, nullptr, name_offset, 1), (void *)nullptr); + + /* Two links */ + BLI_addtail(&lb, link2); + EXPECT_EQ(BLI_findptr(&lb, link1_ptr, ptr_offset), (void *)link1); + EXPECT_EQ(BLI_findstring(&lb, link1_name, name_offset), (void *)link1); + EXPECT_EQ(BLI_rfindptr(&lb, link1_ptr, ptr_offset), (void *)link1); + EXPECT_EQ(BLI_rfindstring(&lb, link1_name, name_offset), (void *)link1); + EXPECT_EQ(BLI_listbase_string_or_index_find(&lb, link1_name, name_offset, 0), (void *)link1); + EXPECT_EQ(BLI_listbase_string_or_index_find(&lb, link2_name, name_offset, 0), (void *)link2); + EXPECT_EQ(BLI_listbase_string_or_index_find(&lb, nullptr, name_offset, 0), (void *)link1); + EXPECT_EQ(BLI_listbase_string_or_index_find(&lb, nullptr, name_offset, 1), (void *)link2); + EXPECT_EQ(BLI_listbase_string_or_index_find(&lb, nullptr, name_offset, -1), (void *)nullptr); + + BLI_freelistN(&lb); +} + /* -------------------------------------------------------------------- */ /* Sort utilities & test */ |