]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Project] Css: Tidy up lambdas
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 29 Mar 2021 13:43:14 +0000 (14:43 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 29 Mar 2021 13:43:14 +0000 (14:43 +0100)
CMakeLists.txt
src/libserver/css/css_parser.cxx
src/libserver/css/css_parser.hxx
src/libserver/css/css_rule.cxx
src/libserver/css/css_rule.hxx
src/libserver/css/css_selector.cxx
src/libserver/css/css_selector.hxx

index 2a42d1886d1fa7a020b9ed431cf6d620c292e758..b53793008fb0494b206feb66a57a8776b4fc7716 100644 (file)
@@ -119,7 +119,7 @@ INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/"
                "${CMAKE_SOURCE_DIR}/contrib/frozen/include"
                "${CMAKE_SOURCE_DIR}/contrib/fmt/include"
                "${CMAKE_SOURCE_DIR}/contrib/doctest"
-               "${CMAKE_BINARY_DIR}/contrib/fu2/include"
+               "${CMAKE_SOURCE_DIR}/contrib/fu2/include"
                "${CMAKE_BINARY_DIR}/src" #Stored in the binary dir
                "${CMAKE_BINARY_DIR}/src/libcryptobox")
 
index d828ffa46461c4ca3a209829bfe253093092b128..104792693d1f607f5814cfef5dd2a44fc3b006fe 100644 (file)
@@ -650,13 +650,7 @@ get_selectors_parser_functor(rspamd_mempool_t *pool,
 {
        css_parser parser(pool);
 
-       /*
-        * We use shared ptr here to avoid std::function limitation around
-        * unique_ptr due to copyable of std::function
-        * Hence, to elongate consumed_blocks lifetime we need to copy them
-        * inside lambda.
-        */
-       std::shared_ptr<css_consumed_block> consumed_blocks = parser.consume_css_blocks(st);
+       auto &&consumed_blocks = parser.consume_css_blocks(st);
        const auto &rules = consumed_blocks->get_blocks_or_empty();
 
        auto rules_it = rules.begin();
@@ -664,7 +658,18 @@ get_selectors_parser_functor(rspamd_mempool_t *pool,
        auto cur = children.begin();
        auto last = children.end();
 
-       return [cur, consumed_blocks, last](void) mutable -> const css_consumed_block & {
+       /*
+        * We use move only wrapper to state the fact that the cosumed blocks
+        * are moved into the closure, not copied.
+        * It prevents us from thinking about copies of the blocks and
+        * functors.
+        * Mutable lambda is required to copy iterators inside of the closure,
+        * as, again, it is C++ where lifetime of the objects must be explicitly
+        * transferred. On the other hand, we could move all stuff inside and remove
+        * mutable.
+        */
+       return [cur, consumed_blocks = std::move(consumed_blocks), last](void) mutable
+               -> const css_consumed_block & {
                if (cur != last) {
                        const auto &ret = (*cur);
 
index 8450316181ff961559e24ae960dafb2c52a70872..4b5598fa97ac926035daded04b98db4d236902cd 100644 (file)
@@ -24,6 +24,7 @@
 #include <memory>
 #include <string>
 
+#include "function2/function2.hpp"
 #include "css_tokeniser.hxx"
 #include "parse_error.hxx"
 #include "contrib/expected/expected.hpp"
@@ -181,7 +182,7 @@ private:
 
 extern const css_consumed_block css_parser_eof_block;
 
-using blocks_gen_functor = std::function<const css_consumed_block &(void)>;
+using blocks_gen_functor = fu2::unique_function<const css_consumed_block &(void)>;
 
 class css_style_sheet;
 auto parse_css(rspamd_mempool_t *pool, const std::string_view &st) ->
index cf04eb689b805fdc599d439162fdbd32fe9882d8..c301ebdca2309b9b6fdab2f4fd919a47a66eba29 100644 (file)
@@ -169,7 +169,7 @@ allowed_property_value(const css_property &prop, const css_consumed_block &parse
 }
 
 auto process_declaration_tokens(rspamd_mempool_t *pool,
-                                                               const blocks_gen_functor &next_block_functor)
+                                                               blocks_gen_functor &&next_block_functor)
        -> css_declarations_block_ptr
 {
        css_declarations_block_ptr ret;
index c7cbae45d378d95450e31ac5dc08e4bbd80109f8..ec9ccde4285541bca9a52097c281963f3883dd04 100644 (file)
@@ -105,7 +105,7 @@ private:
 using css_declarations_block_ptr = std::shared_ptr<css_declarations_block>;
 
 auto process_declaration_tokens(rspamd_mempool_t *pool,
-                                                        const blocks_gen_functor &next_token_functor)
+                                                               blocks_gen_functor &&next_token_functor)
        -> css_declarations_block_ptr;
 
 }
index b198b8553bb6108391339ccb27b1197b781b7dd3..de7b9afac0b1b9fe3c567c33dc21ea53b190e5a7 100644 (file)
@@ -23,7 +23,7 @@
 namespace rspamd::css {
 
 auto process_selector_tokens(rspamd_mempool_t *pool,
-                                                        const blocks_gen_functor &next_token_functor)
+                                                        blocks_gen_functor &&next_token_functor)
        -> selectors_vec
 {
        selectors_vec ret;
index 5ed4d54b820c72f03472b049e45aa7f5d826e196..7a211c11cf347a8e8428ae5b46798629a13598ea 100644 (file)
@@ -23,9 +23,9 @@
 #include <string>
 #include <optional>
 #include <vector>
-#include <functional>
 #include <memory>
 
+#include "function2/function2.hpp"
 #include "parse_error.hxx"
 #include "css_parser.hxx"
 #include "html_tags.h"
@@ -85,7 +85,7 @@ using selectors_vec = std::vector<std::unique_ptr<css_selector>>;
  * Consume selectors token and split them to the list of selectors
  */
 auto process_selector_tokens(rspamd_mempool_t *pool,
-                                                        const blocks_gen_functor &next_token_functor)
+                                                        blocks_gen_functor &&next_token_functor)
        -> selectors_vec;
 
 }