aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout_2020/flow/construct.rs
diff options
context:
space:
mode:
authorSimon Sapin <simon.sapin@exyr.org>2019-12-03 01:00:17 +0100
committerSimon Sapin <simon.sapin@exyr.org>2019-12-03 15:11:35 +0100
commit78bfa45eaba9d9da09a2c198bd63f308f293c11c (patch)
tree039ef214bb234ed3186ff2ed27acb5976805c6eb /components/layout_2020/flow/construct.rs
parentcfdd23ac16e3923cc388c96bbf5aab7501967f5e (diff)
downloadservo-78bfa45eaba9d9da09a2c198bd63f308f293c11c.tar.gz
servo-78bfa45eaba9d9da09a2c198bd63f308f293c11c.zip
Add a `Target` struct for `mapfold_reduce_into` call
Diffstat (limited to 'components/layout_2020/flow/construct.rs')
-rw-r--r--components/layout_2020/flow/construct.rs38
1 files changed, 21 insertions, 17 deletions
diff --git a/components/layout_2020/flow/construct.rs b/components/layout_2020/flow/construct.rs
index 0ddd4a41f88..d1a57145110 100644
--- a/components/layout_2020/flow/construct.rs
+++ b/components/layout_2020/flow/construct.rs
@@ -157,25 +157,29 @@ impl BlockContainer {
builder.end_ongoing_inline_formatting_context();
}
- let mut contains_floats = builder.contains_floats;
+ type Intermediate<Node> = IntermediateBlockLevelBox<Node>;
+ #[derive(Default)]
+ struct Target {
+ contains_floats: ContainsFloats,
+ }
+ let mut target = Target {
+ contains_floats: builder.contains_floats,
+ };
let request_content_sizes = false; // FIXME
- let container = BlockContainer::BlockLevelBoxes(
- builder
- .block_level_boxes
- .into_par_iter()
- .mapfold_reduce_into(
- &mut contains_floats,
- |contains_floats, (intermediate, box_slot): (IntermediateBlockLevelBox<_>, BoxSlot<'_>)| {
- let (block_level_box, box_contains_floats) = intermediate.finish(context, request_content_sizes);
- *contains_floats |= box_contains_floats;
- box_slot.set(LayoutBox::BlockLevel(block_level_box.clone()));
- block_level_box
- },
- |left, right| *left |= right,
- )
- .collect(),
+ let iter = builder.block_level_boxes.into_par_iter();
+ let iter = iter.mapfold_reduce_into(
+ &mut target,
+ |target, (intermediate, box_slot): (Intermediate<_>, BoxSlot<'_>)| {
+ let (block_level_box, box_contains_floats) =
+ intermediate.finish(context, request_content_sizes);
+ target.contains_floats |= box_contains_floats;
+ box_slot.set(LayoutBox::BlockLevel(block_level_box.clone()));
+ block_level_box
+ },
+ |left, right| left.contains_floats |= right.contains_floats,
);
- (container, contains_floats)
+ let container = BlockContainer::BlockLevelBoxes(iter.collect());
+ (container, target.contains_floats)
}
}