Blender Git Loki
Git Commits -> Revision c4286dd
Revision c4286dd by Jacques Lucke (master) January 15, 2021, 15:35 (GMT) |
RNA: support range-based for loops in C++ api Cycles has a lot of code like this: ```lang=c++ BL::Object::modifiers_iterator b_mod; for (b_ob->modifiers.begin(b_mod); b_mod != b_ob->modifiers.end(); ++b_mod) { ``` Range-based for loops allow us to simplify this to: ```lang=c++ for (BL::Modifier &b_mod : b_ob->modifiers) { ``` In order to support this, a collection (such as `b_ob->modifiers`) must have a `begin()` and `end()` method, that take no parameters and return an iterator. The `end` method already exists, but the `begin` method takes the iterator as argument currently. This patch adds a new `begin` method that returns the iterator. The old `begin` method is still available to avoid breaking existing code. My assumption is that the old `begin` method took the iterator as parameter so that the iterator is not copied or moved, i.e. its memory address is stable and the destructor is only called once. I'm not sure if both of these requirements are really necessary to ensure that the iterators work correctly. To be on the safe side, I deleted the copy/move constructors/assignment operators. Since C++17 there is "guaranteed copy elision" which basically allows us to return a non-copyable and non-movable type from a function. To make that work, I had to add a new constructor to `CollectionIterator` that calls `begin` on itself. Reviewers: brecht Differential Revision: https://developer.blender.org/D10120 |
Commit Details:
Full Hash: c4286ddb095d32714c9d5f10751a14f5871b3844
Parent Commit: df96a9c
Lines Changed: +8, -3
1 Modified Path:
/source/blender/makesrna/intern/makesrna.c (+8, -3) (Diff)