From 01d5644c89bbf9b8fabbfc0fb44ce5efe0a09af0 Mon Sep 17 00:00:00 2001
From: adazem009 <68537469+adazem009@users.noreply.github.com>
Date: Sat, 28 Oct 2023 23:10:53 +0200
Subject: [PATCH 1/2] Make input and field map update methods private
---
include/scratchcpp/block.h | 7 +++++--
src/scratch/block.cpp | 6 ++++--
test/blocks/control_blocks_test.cpp | 6 ------
test/blocks/custom_blocks_test.cpp | 4 ----
test/blocks/event_blocks_test.cpp | 4 ----
test/blocks/list_blocks_test.cpp | 3 ---
test/blocks/looks_blocks_test.cpp | 4 ----
test/blocks/motion_blocks_test.cpp | 4 ----
test/blocks/operator_blocks_test.cpp | 4 ----
test/blocks/sensing_blocks_test.cpp | 4 ----
test/blocks/variable_blocks_test.cpp | 2 --
test/compiler/compiler_test.cpp | 3 ---
test/scratch_classes/block_test.cpp | 2 --
13 files changed, 9 insertions(+), 44 deletions(-)
diff --git a/include/scratchcpp/block.h b/include/scratchcpp/block.h
index 11660ab0..48c319cd 100644
--- a/include/scratchcpp/block.h
+++ b/include/scratchcpp/block.h
@@ -19,6 +19,8 @@ class BlockPrivate;
class LIBSCRATCHCPP_EXPORT Block : public Entity
{
public:
+ friend class Engine;
+
Block(const std::string &id, const std::string &opcode);
Block(const Block &) = delete;
@@ -41,14 +43,12 @@ class LIBSCRATCHCPP_EXPORT Block : public Entity
std::shared_ptr inputAt(int index) const;
int findInput(const std::string &inputName) const;
Input *findInputById(int id) const;
- void updateInputMap();
std::vector> fields() const;
int addField(std::shared_ptr field);
std::shared_ptr fieldAt(int index) const;
int findField(const std::string &fieldName) const;
Field *findFieldById(int id) const;
- void updateFieldMap();
bool shadow() const;
void setShadow(bool newShadow);
@@ -75,6 +75,9 @@ class LIBSCRATCHCPP_EXPORT Block : public Entity
InputValue *topLevelReporterInfo();
private:
+ void updateInputMap();
+ void updateFieldMap();
+
spimpl::unique_impl_ptr impl;
};
diff --git a/src/scratch/block.cpp b/src/scratch/block.cpp
index 619950ac..5609c784 100644
--- a/src/scratch/block.cpp
+++ b/src/scratch/block.cpp
@@ -168,6 +168,8 @@ int Block::addInput(std::shared_ptr input)
return it - impl->inputs.begin();
impl->inputs.push_back(input);
+ impl->inputMap[input->inputId()] = input.get();
+
return impl->inputs.size() - 1;
}
@@ -200,7 +202,6 @@ Input *Block::findInputById(int id) const
return nullptr;
}
-/*! Updates the map that assigns input IDs to input indexes. Used internally by Engine. */
void Block::updateInputMap()
{
impl->inputMap.clear();
@@ -223,6 +224,8 @@ int Block::addField(std::shared_ptr field)
return it - impl->fields.begin();
impl->fields.push_back(field);
+ impl->fieldMap[field->fieldId()] = field.get();
+
return impl->fields.size() - 1;
}
@@ -255,7 +258,6 @@ Field *Block::findFieldById(int id) const
return nullptr;
}
-/*! Updates the map that assigns input IDs to input indexes. Used internally by Engine. */
void Block::updateFieldMap()
{
impl->fieldMap.clear();
diff --git a/test/blocks/control_blocks_test.cpp b/test/blocks/control_blocks_test.cpp
index e9ecab88..2074255c 100644
--- a/test/blocks/control_blocks_test.cpp
+++ b/test/blocks/control_blocks_test.cpp
@@ -63,7 +63,6 @@ class ControlBlocksTest : public testing::Test
input->setValueBlock(valueBlock);
input->setInputId(id);
block->addInput(input);
- block->updateInputMap();
}
void addObscuredInput(std::shared_ptr block, const std::string &name, ControlBlocks::Inputs id, std::shared_ptr valueBlock) const
@@ -72,7 +71,6 @@ class ControlBlocksTest : public testing::Test
input->setValueBlock(valueBlock);
input->setInputId(id);
block->addInput(input);
- block->updateInputMap();
}
void addValueInput(std::shared_ptr block, const std::string &name, ControlBlocks::Inputs id, const Value &value) const
@@ -81,7 +79,6 @@ class ControlBlocksTest : public testing::Test
input->setPrimaryValue(value);
input->setInputId(id);
block->addInput(input);
- block->updateInputMap();
}
std::shared_ptr addNullInput(std::shared_ptr block, const std::string &name, ControlBlocks::Inputs id) const
@@ -89,7 +86,6 @@ class ControlBlocksTest : public testing::Test
auto input = std::make_shared(name, Input::Type::Shadow);
input->setInputId(id);
block->addInput(input);
- block->updateInputMap();
return input;
}
@@ -100,7 +96,6 @@ class ControlBlocksTest : public testing::Test
field->setFieldId(id);
field->setSpecialValueId(valueId);
block->addField(field);
- block->updateFieldMap();
}
void addVariableField(std::shared_ptr block, std::shared_ptr variable)
@@ -108,7 +103,6 @@ class ControlBlocksTest : public testing::Test
auto variableField = std::make_shared("VARIABLE", Value(), variable);
variableField->setFieldId(ControlBlocks::VARIABLE);
block->addField(variableField);
- block->updateFieldMap();
}
std::shared_ptr createSubstack(const std::string &id)
diff --git a/test/blocks/custom_blocks_test.cpp b/test/blocks/custom_blocks_test.cpp
index 0597e0f0..d133cdb5 100644
--- a/test/blocks/custom_blocks_test.cpp
+++ b/test/blocks/custom_blocks_test.cpp
@@ -27,7 +27,6 @@ class CustomBlocksTest : public testing::Test
input->setValueBlock(prototypeBlock);
input->setInputId(CustomBlocks::CUSTOM_BLOCK);
definitionBlock->addInput(input);
- definitionBlock->updateInputMap();
}
void addArgumentInput(std::shared_ptr block, const std::string &argId, const Value &value) const
@@ -94,7 +93,6 @@ TEST_F(CustomBlocksTest, CustomBlocks)
auto valueField = std::make_shared("VALUE", "boolean");
valueField->setFieldId(CustomBlocks::VALUE);
argBlock->addField(valueField);
- argBlock->updateFieldMap();
input->setValueBlock(argBlock);
input->setInputId(-100);
testBlock->addInput(input);
@@ -105,12 +103,10 @@ TEST_F(CustomBlocksTest, CustomBlocks)
valueField = std::make_shared("VALUE", "invalid");
valueField->setFieldId(CustomBlocks::VALUE);
argBlock->addField(valueField);
- argBlock->updateFieldMap();
input->setValueBlock(argBlock);
input->setInputId(-101);
testBlock->addInput(input);
- testBlock->updateInputMap();
testBlock->setCompileFunction([](Compiler *compiler) {
compiler->addInput(-100);
compiler->addInstruction(vm::OP_PRINT);
diff --git a/test/blocks/event_blocks_test.cpp b/test/blocks/event_blocks_test.cpp
index 4b54a910..684d9131 100644
--- a/test/blocks/event_blocks_test.cpp
+++ b/test/blocks/event_blocks_test.cpp
@@ -40,7 +40,6 @@ class EventBlocksTest : public testing::Test
input->primaryValue()->setType(InputValue::Type::Broadcast);
input->setInputId(id);
block->addInput(input);
- block->updateInputMap();
}
void addObscuredInput(std::shared_ptr block, const std::string &name, EventBlocks::Inputs id, std::shared_ptr valueBlock) const
@@ -49,7 +48,6 @@ class EventBlocksTest : public testing::Test
input->setValueBlock(valueBlock);
input->setInputId(id);
block->addInput(input);
- block->updateInputMap();
}
void addValueField(std::shared_ptr block, const std::string &name, EventBlocks::Fields id, const std::string &value) const
@@ -57,7 +55,6 @@ class EventBlocksTest : public testing::Test
auto field = std::make_shared(name, value);
field->setFieldId(id);
block->addField(field);
- block->updateFieldMap();
}
void addBroadcastField(std::shared_ptr block, const std::string &name, EventBlocks::Fields id, std::shared_ptr broadcast) const
@@ -65,7 +62,6 @@ class EventBlocksTest : public testing::Test
auto field = std::make_shared(name, Value(), broadcast);
field->setFieldId(id);
block->addField(field);
- block->updateFieldMap();
}
std::unique_ptr m_section;
diff --git a/test/blocks/list_blocks_test.cpp b/test/blocks/list_blocks_test.cpp
index a6e9af07..5ec69805 100644
--- a/test/blocks/list_blocks_test.cpp
+++ b/test/blocks/list_blocks_test.cpp
@@ -28,7 +28,6 @@ class ListBlocksTest : public testing::Test
auto listField = std::make_shared("LIST", Value(), list);
listField->setFieldId(ListBlocks::LIST);
block->addField(listField);
- block->updateFieldMap();
return block;
}
@@ -39,7 +38,6 @@ class ListBlocksTest : public testing::Test
input->setPrimaryValue(item);
input->setInputId(ListBlocks::ITEM);
block->addInput(input);
- block->updateInputMap();
}
void addIndexInput(std::shared_ptr block, const Value &index) const
@@ -48,7 +46,6 @@ class ListBlocksTest : public testing::Test
input->setPrimaryValue(index);
input->setInputId(ListBlocks::INDEX);
block->addInput(input);
- block->updateInputMap();
}
// For add item, item index and list contains item
diff --git a/test/blocks/looks_blocks_test.cpp b/test/blocks/looks_blocks_test.cpp
index 02a9352d..83a6b482 100644
--- a/test/blocks/looks_blocks_test.cpp
+++ b/test/blocks/looks_blocks_test.cpp
@@ -45,7 +45,6 @@ class LooksBlocksTest : public testing::Test
input->setPrimaryValue(value);
input->setInputId(id);
block->addInput(input);
- block->updateInputMap();
}
void addObscuredInput(std::shared_ptr block, const std::string &name, LooksBlocks::Inputs id, std::shared_ptr valueBlock) const
@@ -54,7 +53,6 @@ class LooksBlocksTest : public testing::Test
input->setValueBlock(valueBlock);
input->setInputId(id);
block->addInput(input);
- block->updateInputMap();
}
std::shared_ptr addNullInput(std::shared_ptr block, const std::string &name, LooksBlocks::Inputs id) const
@@ -62,7 +60,6 @@ class LooksBlocksTest : public testing::Test
auto input = std::make_shared(name, Input::Type::Shadow);
input->setInputId(id);
block->addInput(input);
- block->updateInputMap();
return input;
}
@@ -85,7 +82,6 @@ class LooksBlocksTest : public testing::Test
field->setFieldId(id);
field->setSpecialValueId(valueId);
block->addField(field);
- block->updateFieldMap();
}
std::unique_ptr m_section;
diff --git a/test/blocks/motion_blocks_test.cpp b/test/blocks/motion_blocks_test.cpp
index d70c765a..a1fa70ca 100644
--- a/test/blocks/motion_blocks_test.cpp
+++ b/test/blocks/motion_blocks_test.cpp
@@ -45,7 +45,6 @@ class MotionBlocksTest : public testing::Test
input->setPrimaryValue(value);
input->setInputId(id);
block->addInput(input);
- block->updateInputMap();
}
void addObscuredInput(std::shared_ptr block, const std::string &name, MotionBlocks::Inputs id, std::shared_ptr valueBlock) const
@@ -54,7 +53,6 @@ class MotionBlocksTest : public testing::Test
input->setValueBlock(valueBlock);
input->setInputId(id);
block->addInput(input);
- block->updateInputMap();
}
std::shared_ptr addNullInput(std::shared_ptr block, const std::string &name, MotionBlocks::Inputs id) const
@@ -62,7 +60,6 @@ class MotionBlocksTest : public testing::Test
auto input = std::make_shared(name, Input::Type::Shadow);
input->setInputId(id);
block->addInput(input);
- block->updateInputMap();
return input;
}
@@ -85,7 +82,6 @@ class MotionBlocksTest : public testing::Test
field->setFieldId(id);
field->setSpecialValueId(valueId);
block->addField(field);
- block->updateFieldMap();
}
std::unique_ptr m_section;
diff --git a/test/blocks/operator_blocks_test.cpp b/test/blocks/operator_blocks_test.cpp
index 24f6504b..cb5a465e 100644
--- a/test/blocks/operator_blocks_test.cpp
+++ b/test/blocks/operator_blocks_test.cpp
@@ -30,7 +30,6 @@ class OperatorBlocksTest : public testing::Test
input->setPrimaryValue(value);
input->setInputId(id);
block->addInput(input);
- block->updateInputMap();
}
void addObscuredInput(std::shared_ptr block, const std::string &name, OperatorBlocks::Inputs id, std::shared_ptr valueBlock) const
@@ -39,7 +38,6 @@ class OperatorBlocksTest : public testing::Test
input->setValueBlock(valueBlock);
input->setInputId(id);
block->addInput(input);
- block->updateInputMap();
}
void addNullInput(std::shared_ptr block, const std::string &name, OperatorBlocks::Inputs id) const
@@ -47,7 +45,6 @@ class OperatorBlocksTest : public testing::Test
auto input = std::make_shared(name, Input::Type::Shadow);
input->setInputId(id);
block->addInput(input);
- block->updateInputMap();
}
// For the mathop block
@@ -57,7 +54,6 @@ class OperatorBlocksTest : public testing::Test
field->setFieldId(OperatorBlocks::OPERATOR);
field->setSpecialValueId(operatorId);
block->addField(field);
- block->updateFieldMap();
}
std::unique_ptr m_section;
diff --git a/test/blocks/sensing_blocks_test.cpp b/test/blocks/sensing_blocks_test.cpp
index b1bd3adc..4a9fe5bb 100644
--- a/test/blocks/sensing_blocks_test.cpp
+++ b/test/blocks/sensing_blocks_test.cpp
@@ -34,7 +34,6 @@ class SensingBlocksTest : public testing::Test
optionField->setFieldId(SensingBlocks::CURRENTMENU);
optionField->setSpecialValueId(option);
block->addField(optionField);
- block->updateFieldMap();
return block;
}
@@ -54,7 +53,6 @@ class SensingBlocksTest : public testing::Test
input->setValueBlock(valueBlock);
input->setInputId(id);
block->addInput(input);
- block->updateInputMap();
}
std::shared_ptr addNullInput(std::shared_ptr block, const std::string &name, SensingBlocks::Inputs id) const
@@ -62,7 +60,6 @@ class SensingBlocksTest : public testing::Test
auto input = std::make_shared(name, Input::Type::Shadow);
input->setInputId(id);
block->addInput(input);
- block->updateInputMap();
return input;
}
@@ -85,7 +82,6 @@ class SensingBlocksTest : public testing::Test
field->setFieldId(id);
field->setSpecialValueId(valueId);
block->addField(field);
- block->updateFieldMap();
}
std::unique_ptr m_section;
diff --git a/test/blocks/variable_blocks_test.cpp b/test/blocks/variable_blocks_test.cpp
index 24f0d1ec..33eecad3 100644
--- a/test/blocks/variable_blocks_test.cpp
+++ b/test/blocks/variable_blocks_test.cpp
@@ -28,13 +28,11 @@ class VariableBlocksTest : public testing::Test
auto variableField = std::make_shared("VARIABLE", Value(), variable);
variableField->setFieldId(VariableBlocks::VARIABLE);
block->addField(variableField);
- block->updateFieldMap();
auto valueInput = std::make_shared("VALUE", Input::Type::Shadow);
valueInput->setPrimaryValue(value);
valueInput->setInputId(VariableBlocks::VALUE);
block->addInput(valueInput);
- block->updateInputMap();
return block;
}
diff --git a/test/compiler/compiler_test.cpp b/test/compiler/compiler_test.cpp
index 9a09148d..baf71059 100644
--- a/test/compiler/compiler_test.cpp
+++ b/test/compiler/compiler_test.cpp
@@ -338,7 +338,6 @@ TEST_F(CompilerTest, ResolveInput)
input->setPrimaryValue("test");
input->setInputId(TestBlockSection::INPUT1);
block->addInput(input);
- block->updateInputMap();
block->setCompileFunction(&TestBlockSection::compileTestBlock1);
compiler.compile(block);
@@ -361,7 +360,6 @@ TEST_F(CompilerTest, ResolveDropdownMenuInput)
input->setValueBlock(menu);
menu->addField(optionField);
block->addInput(input);
- block->updateInputMap();
block->setCompileFunction(&TestBlockSection::compileTestBlock1);
compiler.compile(block);
@@ -402,7 +400,6 @@ TEST_F(CompilerTest, ResolveField)
field->setFieldId(TestBlockSection::FIELD1);
field->setSpecialValueId(TestBlockSection::TestValue);
block->addField(field);
- block->updateFieldMap();
block->setCompileFunction(&TestBlockSection::compileTestBlock2);
compiler.compile(block);
diff --git a/test/scratch_classes/block_test.cpp b/test/scratch_classes/block_test.cpp
index 14430946..087adefe 100644
--- a/test/scratch_classes/block_test.cpp
+++ b/test/scratch_classes/block_test.cpp
@@ -114,7 +114,6 @@ TEST_F(BlockTest, Inputs)
ASSERT_EQ(block.findInput("VALUE2"), 1);
ASSERT_EQ(block.findInput("VALUE3"), 2);
- block.updateInputMap();
ASSERT_EQ(block.findInputById(5), nullptr);
ASSERT_EQ(block.findInputById(11), i1.get());
ASSERT_EQ(block.findInputById(12), i2.get());
@@ -150,7 +149,6 @@ TEST_F(BlockTest, Fields)
ASSERT_EQ(block.findField("VARIABLE2"), 1);
ASSERT_EQ(block.findField("VARIABLE3"), 2);
- block.updateFieldMap();
ASSERT_EQ(block.findFieldById(5), nullptr);
ASSERT_EQ(block.findFieldById(11), f1.get());
ASSERT_EQ(block.findFieldById(12), f2.get());
From c0031eb684bec94a2730d77efaa971df0735fbb0 Mon Sep 17 00:00:00 2001
From: adazem009 <68537469+adazem009@users.noreply.github.com>
Date: Sun, 29 Oct 2023 10:05:10 +0100
Subject: [PATCH 2/2] Find inputs and fields by ID manually if not found in the
map
---
src/scratch/block.cpp | 12 ++++++++++++
test/scratch_classes/block_test.cpp | 10 ++++++++++
2 files changed, 22 insertions(+)
diff --git a/src/scratch/block.cpp b/src/scratch/block.cpp
index 5609c784..5ad69cd6 100644
--- a/src/scratch/block.cpp
+++ b/src/scratch/block.cpp
@@ -199,6 +199,12 @@ Input *Block::findInputById(int id) const
{
if (impl->inputMap.count(id) == 1)
return impl->inputMap.at(id);
+ else {
+ auto it = std::find_if(impl->inputs.begin(), impl->inputs.end(), [id](std::shared_ptr input) { return input->inputId() == id; });
+
+ if (it != impl->inputs.end())
+ return it->get();
+ }
return nullptr;
}
@@ -255,6 +261,12 @@ Field *Block::findFieldById(int id) const
{
if (impl->fieldMap.count(id) == 1)
return impl->fieldMap.at(id);
+ else {
+ auto it = std::find_if(impl->fields.begin(), impl->fields.end(), [id](std::shared_ptr field) { return field->fieldId() == id; });
+
+ if (it != impl->fields.end())
+ return it->get();
+ }
return nullptr;
}
diff --git a/test/scratch_classes/block_test.cpp b/test/scratch_classes/block_test.cpp
index 087adefe..cec36baf 100644
--- a/test/scratch_classes/block_test.cpp
+++ b/test/scratch_classes/block_test.cpp
@@ -118,6 +118,11 @@ TEST_F(BlockTest, Inputs)
ASSERT_EQ(block.findInputById(11), i1.get());
ASSERT_EQ(block.findInputById(12), i2.get());
ASSERT_EQ(block.findInputById(15), i3.get());
+
+ auto i4 = std::make_shared("VALUE4", Input::Type::Shadow);
+ block.addInput(i4);
+ i4->setInputId(20);
+ ASSERT_EQ(block.findInputById(20), i4.get());
}
TEST_F(BlockTest, Fields)
@@ -153,6 +158,11 @@ TEST_F(BlockTest, Fields)
ASSERT_EQ(block.findFieldById(11), f1.get());
ASSERT_EQ(block.findFieldById(12), f2.get());
ASSERT_EQ(block.findFieldById(15), f3.get());
+
+ auto f4 = std::make_shared("VARIABLE4", Value());
+ block.addField(f4);
+ f4->setFieldId(20);
+ ASSERT_EQ(block.findFieldById(20), f4.get());
}
TEST_F(BlockTest, Shadow)