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)