Skip to content

Commit ce87b96

Browse files
committed
LLVMInstructionList: Add predicate-based contains method
1 parent 19d7996 commit ce87b96

File tree

3 files changed

+77
-0
lines changed

3 files changed

+77
-0
lines changed

src/engine/internal/llvm/llvminstructionlist.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,20 @@ bool LLVMInstructionList::containsInstruction(LLVMInstruction *ins) const
3131
return false;
3232
}
3333

34+
bool LLVMInstructionList::containsInstruction(std::function<bool(const LLVMInstruction *)> func) const
35+
{
36+
LLVMInstruction *ptr = m_first.get();
37+
38+
while (ptr) {
39+
if (func(ptr))
40+
return true;
41+
42+
ptr = ptr->next;
43+
}
44+
45+
return false;
46+
}
47+
3448
void LLVMInstructionList::addInstruction(std::shared_ptr<LLVMInstruction> ins)
3549
{
3650
if (!(m_first && m_last)) {

src/engine/internal/llvm/llvminstructionlist.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#pragma once
44

55
#include <memory>
6+
#include <functional>
67

78
namespace libscratchcpp
89
{
@@ -19,6 +20,8 @@ class LLVMInstructionList
1920
LLVMInstruction *last() const;
2021

2122
bool containsInstruction(LLVMInstruction *ins) const;
23+
bool containsInstruction(std::function<bool(const LLVMInstruction *)> func) const;
24+
2225
void addInstruction(std::shared_ptr<LLVMInstruction> ins);
2326

2427
private:

test/llvm/llvminstructionlist_test.cpp

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ TEST(LLVMInstructionListTest, EmptyList_ContainsNull)
2323
ASSERT_FALSE(list.containsInstruction(nullptr));
2424
}
2525

26+
TEST(LLVMInstructionListTest, EmptyList_ContainsFunc)
27+
{
28+
LLVMInstructionList list;
29+
auto ins = std::make_shared<LLVMInstruction>(LLVMInstruction::Type::FunctionCall, nullptr, false);
30+
ASSERT_FALSE(list.containsInstruction([](const LLVMInstruction *) { return true; }));
31+
}
32+
2633
TEST(LLVMInstructionListTest, EmptyList_Contains)
2734
{
2835
LLVMInstructionList list;
@@ -61,6 +68,27 @@ TEST(LLVMInstructionListTest, SingleInstructionList_ContainsNull)
6168
ASSERT_FALSE(list.containsInstruction(nullptr));
6269
}
6370

71+
TEST(LLVMInstructionListTest, SingleInstructionList_ContainsFuncTrue)
72+
{
73+
LLVMInstructionList list;
74+
75+
auto ins1 = std::make_shared<LLVMInstruction>(LLVMInstruction::Type::FunctionCall, nullptr, false);
76+
list.addInstruction(ins1);
77+
78+
ASSERT_TRUE(list.containsInstruction([](const LLVMInstruction *) { return true; }));
79+
}
80+
81+
TEST(LLVMInstructionListTest, SingleInstructionList_ContainsFuncFalse)
82+
{
83+
LLVMInstructionList list;
84+
85+
auto ins1 = std::make_shared<LLVMInstruction>(LLVMInstruction::Type::FunctionCall, nullptr, false);
86+
list.addInstruction(ins1);
87+
88+
auto ins = std::make_shared<LLVMInstruction>(LLVMInstruction::Type::FunctionCall, nullptr, false);
89+
ASSERT_FALSE(list.containsInstruction([](const LLVMInstruction *) { return false; }));
90+
}
91+
6492
TEST(LLVMInstructionListTest, MultipleInstructionList_ContainsExistent)
6593
{
6694
LLVMInstructionList list;
@@ -110,6 +138,38 @@ TEST(LLVMInstructionListTest, MultipleInstructionList_ContainsNull)
110138
ASSERT_FALSE(list.containsInstruction(nullptr));
111139
}
112140

141+
TEST(LLVMInstructionListTest, MultipleInstructionList_ContainsExistentFunc)
142+
{
143+
LLVMInstructionList list;
144+
145+
auto ins1 = std::make_shared<LLVMInstruction>(LLVMInstruction::Type::FunctionCall, nullptr, false);
146+
list.addInstruction(ins1);
147+
148+
auto ins2 = std::make_shared<LLVMInstruction>(LLVMInstruction::Type::Stop, nullptr, false);
149+
list.addInstruction(ins2);
150+
151+
auto ins3 = std::make_shared<LLVMInstruction>(LLVMInstruction::Type::FunctionCall, nullptr, false);
152+
list.addInstruction(ins3);
153+
154+
ASSERT_TRUE(list.containsInstruction([](const LLVMInstruction *ins) { return ins->type == LLVMInstruction::Type::Stop; }));
155+
}
156+
157+
TEST(LLVMInstructionListTest, MultipleInstructionList_ContainsNonExistentFunc)
158+
{
159+
LLVMInstructionList list;
160+
161+
auto ins1 = std::make_shared<LLVMInstruction>(LLVMInstruction::Type::FunctionCall, nullptr, false);
162+
list.addInstruction(ins1);
163+
164+
auto ins2 = std::make_shared<LLVMInstruction>(LLVMInstruction::Type::FunctionCall, nullptr, false);
165+
list.addInstruction(ins2);
166+
167+
auto ins3 = std::make_shared<LLVMInstruction>(LLVMInstruction::Type::FunctionCall, nullptr, false);
168+
list.addInstruction(ins3);
169+
170+
ASSERT_FALSE(list.containsInstruction([](const LLVMInstruction *ins) { return ins->type == LLVMInstruction::Type::Stop; }));
171+
}
172+
113173
TEST(LLVMInstructionListTest, AddSingleInstruction_First)
114174
{
115175
LLVMInstructionList list;

0 commit comments

Comments
 (0)