From: Vsevolod Stakhov Date: Mon, 29 Mar 2021 13:43:14 +0000 (+0100) Subject: [Project] Css: Tidy up lambdas X-Git-Tag: 3.0~544 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=dfbd181e9cc0dc13eba0d00b0fa77b133ee364f3;p=thirdparty%2Frspamd.git [Project] Css: Tidy up lambdas --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 2a42d1886d..b53793008f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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") diff --git a/src/libserver/css/css_parser.cxx b/src/libserver/css/css_parser.cxx index d828ffa464..104792693d 100644 --- a/src/libserver/css/css_parser.cxx +++ b/src/libserver/css/css_parser.cxx @@ -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 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); diff --git a/src/libserver/css/css_parser.hxx b/src/libserver/css/css_parser.hxx index 8450316181..4b5598fa97 100644 --- a/src/libserver/css/css_parser.hxx +++ b/src/libserver/css/css_parser.hxx @@ -24,6 +24,7 @@ #include #include +#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; +using blocks_gen_functor = fu2::unique_function; class css_style_sheet; auto parse_css(rspamd_mempool_t *pool, const std::string_view &st) -> diff --git a/src/libserver/css/css_rule.cxx b/src/libserver/css/css_rule.cxx index cf04eb689b..c301ebdca2 100644 --- a/src/libserver/css/css_rule.cxx +++ b/src/libserver/css/css_rule.cxx @@ -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; diff --git a/src/libserver/css/css_rule.hxx b/src/libserver/css/css_rule.hxx index c7cbae45d3..ec9ccde428 100644 --- a/src/libserver/css/css_rule.hxx +++ b/src/libserver/css/css_rule.hxx @@ -105,7 +105,7 @@ private: using css_declarations_block_ptr = std::shared_ptr; 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; } diff --git a/src/libserver/css/css_selector.cxx b/src/libserver/css/css_selector.cxx index b198b8553b..de7b9afac0 100644 --- a/src/libserver/css/css_selector.cxx +++ b/src/libserver/css/css_selector.cxx @@ -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; diff --git a/src/libserver/css/css_selector.hxx b/src/libserver/css/css_selector.hxx index 5ed4d54b82..7a211c11cf 100644 --- a/src/libserver/css/css_selector.hxx +++ b/src/libserver/css/css_selector.hxx @@ -23,9 +23,9 @@ #include #include #include -#include #include +#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>; * 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; }