pub struct MessageReader<'w, 's, M>where
M: Message,{ /* private fields */ }Expand description
Reads Messages of type T in order and tracks which messages have already been read.
Use PopulatedMessageReader<T> to skip the system if there are no messages.
§Usage
#[derive(Message)]
pub struct MyMessage(String); // Custom message type.
fn my_system(mut reader: MessageReader<MyMessage>) {
for msg in reader.read() {
println!("{}", msg.0)
}
}
§Concurrency
Unlike MessageWriter<T>, systems with MessageReader<T> param can be executed concurrently
(but not concurrently with MessageWriter<T> or MessageMutator<T> systems for the same message type).
Implementations§
Source§impl<'w, 's, M> MessageReader<'w, 's, M>where
M: Message,
impl<'w, 's, M> MessageReader<'w, 's, M>where
M: Message,
Sourcepub fn read(&mut self) -> MessageIterator<'_, M> ⓘ
pub fn read(&mut self) -> MessageIterator<'_, M> ⓘ
Iterates over the messages this MessageReader has not seen yet. This updates the
MessageReader’s message counter, which means subsequent message reads will not include messages
that happened before now.
Examples found in repository?
More examples
508fn handle_window_resize_events(
509 mut events: MessageReader<WindowResized>,
510 mut regenerate_image_message_writer: MessageWriter<RegenerateImage>,
511) {
512 for _ in events.read() {
513 regenerate_image_message_writer.write(RegenerateImage);
514 }
515}
516
517/// Recreates the image, as well as all views that show the image, when a
518/// [`RegenerateImage`] message is received.
519///
520/// The views that show the image consist of the animated mesh on the left side
521/// of the window and the column of mipmap level views on the right side of the
522/// window.
523fn regenerate_image_when_requested(
524 mut commands: Commands,
525 image_views_query: Query<Entity, With<ImageView>>,
526 windows_query: Query<&Window, With<PrimaryWindow>>,
527 app_assets: Res<AppAssets>,
528 mut app_status: ResMut<AppStatus>,
529 mut images: ResMut<Assets<Image>>,
530 mut single_mip_level_materials: ResMut<Assets<SingleMipLevelMaterial>>,
531 mut color_materials: ResMut<Assets<ColorMaterial>>,
532 mut message_reader: MessageReader<RegenerateImage>,
533) {
534 // Only do this at most once per frame, or else the despawn logic below will
535 // get confused.
536 if message_reader.read().count() == 0 {
537 return;
538 }
539
540 // Despawn all entities that show the image.
541 for entity in image_views_query.iter() {
542 commands.entity(entity).despawn();
543 }
544
545 // Regenerate the image.
546 let image_handle = app_status.regenerate_mipmap_source_image(&mut commands, &mut images);
547
548 // Respawn the animated image view on the left side of the window.
549 spawn_animated_mesh(
550 &mut commands,
551 &app_status,
552 &app_assets,
553 &windows_query,
554 &mut color_materials,
555 &image_handle,
556 );
557
558 // Respawn the column of mip level views on the right side of the window.
559 spawn_mip_level_views(
560 &mut commands,
561 &app_status,
562 &app_assets,
563 &windows_query,
564 &mut single_mip_level_materials,
565 &image_handle,
566 );
567}296fn handle_mouse_move(
297 mut cursor_moved_reader: MessageReader<CursorMoved>,
298 mut mouse_position: ResMut<MousePosition>,
299) {
300 if let Some(cursor_moved) = cursor_moved_reader.read().last() {
301 mouse_position.0 = Some(cursor_moved.position);
302 }
303}
304
305/// This system handles updating the [`MouseEditMove`] resource, orchestrating the logical part
306/// of the click-and-drag motion which actually creates new control points.
307fn handle_mouse_press(
308 mut mouse_button_input_reader: MessageReader<MouseButtonInput>,
309 mouse_position: Res<MousePosition>,
310 mut edit_move: ResMut<MouseEditMove>,
311 mut control_points: ResMut<ControlPoints>,
312 camera: Single<(&Camera, &GlobalTransform)>,
313) {
314 let Some(mouse_pos) = mouse_position.0 else {
315 return;
316 };
317
318 // Handle click and drag behavior
319 for mouse_button_input in mouse_button_input_reader.read() {
320 if mouse_button_input.button != MouseButton::Left {
321 continue;
322 }
323
324 match mouse_button_input.state {
325 ButtonState::Pressed => {
326 if edit_move.start.is_some() {
327 // If the edit move already has a start, press event should do nothing.
328 continue;
329 }
330 // This press represents the start of the edit move.
331 edit_move.start = Some(mouse_pos);
332 }
333
334 ButtonState::Released => {
335 // Release is only meaningful if we started an edit move.
336 let Some(start) = edit_move.start else {
337 continue;
338 };
339
340 let (camera, camera_transform) = *camera;
341
342 // Convert the starting point and end point (current mouse pos) into world coords:
343 let Ok(point) = camera.viewport_to_world_2d(camera_transform, start) else {
344 continue;
345 };
346 let Ok(end_point) = camera.viewport_to_world_2d(camera_transform, mouse_pos) else {
347 continue;
348 };
349 let tangent = end_point - point;
350
351 // The start of the click-and-drag motion represents the point to add,
352 // while the difference with the current position represents the tangent.
353 control_points.points_and_tangents.push((point, tangent));
354
355 // Reset the edit move since we've consumed it.
356 edit_move.start = None;
357 }
358 }
359 }
360}- examples/app/settings.rs
- examples/async_tasks/external_source_external_thread.rs
- examples/input/char_input_events.rs
- examples/2d/texture_atlas.rs
- examples/ecs/message.rs
- examples/2d/pixel_grid_snap.rs
- examples/audio/pitch.rs
- examples/animation/morph_targets.rs
- examples/window/persisting_window_settings.rs
- examples/app/log_layers_ecs.rs
- examples/picking/custom_hit_data.rs
- examples/ui/scroll_and_overflow/scroll.rs
- examples/transforms/align.rs
- examples/math/random_sampling.rs
- examples/3d/split_screen.rs
- examples/3d/tonemapping.rs
- examples/3d/mirror.rs
- examples/input/mouse_input_events.rs
- examples/testbed/full_ui.rs
- examples/input/gamepad_input_events.rs
- examples/3d/ssr.rs
- examples/3d/visibility_range.rs
- examples/ui/render_ui_to_texture.rs
- examples/3d/mixed_lighting.rs
- examples/camera/pan_orbit_camera_custom_input_plugin.rs
Sourcepub fn read_with_id(&mut self) -> MessageIteratorWithId<'_, M> ⓘ
pub fn read_with_id(&mut self) -> MessageIteratorWithId<'_, M> ⓘ
Sourcepub fn par_read(&mut self) -> MessageParIter<'_, M>
Available on crate feature multi_threaded only.
pub fn par_read(&mut self) -> MessageParIter<'_, M>
multi_threaded only.Returns a parallel iterator over the messages this MessageReader has not seen yet.
See also for_each.
§Example
#[derive(Message)]
struct MyMessage {
value: usize,
}
#[derive(Resource, Default)]
struct Counter(AtomicUsize);
// setup
let mut world = World::new();
world.init_resource::<Messages<MyMessage>>();
world.insert_resource(Counter::default());
let mut schedule = Schedule::default();
schedule.add_systems(|mut messages: MessageReader<MyMessage>, counter: Res<Counter>| {
messages.par_read().for_each(|MyMessage { value }| {
counter.0.fetch_add(*value, Ordering::Relaxed);
});
});
for value in 0..100 {
world.write_message(MyMessage { value });
}
schedule.run(&mut world);
let Counter(counter) = world.remove_resource::<Counter>().unwrap();
// all messages were processed
assert_eq!(counter.into_inner(), 4950);Sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Determines the number of messages available to be read from this MessageReader without consuming any.
Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true if there are no messages available to read.
§Example
The following example shows a useful pattern where some behavior is triggered if new messages are available.
MessageReader::clear() is used so the same messages don’t re-trigger the behavior the next time the system runs.
#[derive(Message)]
struct Collision;
fn play_collision_sound(mut messages: MessageReader<Collision>) {
if !messages.is_empty() {
messages.clear();
// Play a sound
}
}Examples found in repository?
114fn extract_components(
115 b: Extract<Query<(RenderEntity, &B)>>,
116 c: Extract<Query<(RenderEntity, &C)>>,
117 mut reader: Extract<MessageReader<ExtractMessage>>,
118 mut commands: Commands,
119) {
120 for (entity, b) in &b {
121 commands.entity(entity).insert(b.clone());
122 }
123
124 if !reader.is_empty() {
125 for (entity, c) in &c {
126 commands.entity(entity).insert(c.clone());
127 }
128 reader.clear();
129 }
130}More examples
249fn print_text(
250 handles: Res<TextAssets>,
251 texts: Res<Assets<Text>>,
252 mut asset_events: MessageReader<AssetEvent<Text>>,
253) {
254 if !asset_events.is_empty() {
255 // This prints the current values of the assets
256 // Hot-reloading is supported, so try modifying the source assets (and their meta files)!
257 println!("Current Values:");
258 println!(" a: {:?}", texts.get(&handles.a));
259 println!(" b: {:?}", texts.get(&handles.b));
260 println!(" c: {:?}", texts.get(&handles.c));
261 println!(" d: {:?}", texts.get(&handles.d));
262 println!(" e: {:?}", texts.get(&handles.e));
263 println!("(You can modify source assets and their .meta files to hot-reload changes!)");
264 println!();
265 asset_events.clear();
266 }
267}Sourcepub fn clear(&mut self)
pub fn clear(&mut self)
Consumes all available messages.
This means these messages will not appear in calls to MessageReader::read() or
MessageReader::read_with_id() and MessageReader::is_empty() will return true.
For usage, see MessageReader::is_empty().
Examples found in repository?
114fn extract_components(
115 b: Extract<Query<(RenderEntity, &B)>>,
116 c: Extract<Query<(RenderEntity, &C)>>,
117 mut reader: Extract<MessageReader<ExtractMessage>>,
118 mut commands: Commands,
119) {
120 for (entity, b) in &b {
121 commands.entity(entity).insert(b.clone());
122 }
123
124 if !reader.is_empty() {
125 for (entity, c) in &c {
126 commands.entity(entity).insert(c.clone());
127 }
128 reader.clear();
129 }
130}More examples
249fn print_text(
250 handles: Res<TextAssets>,
251 texts: Res<Assets<Text>>,
252 mut asset_events: MessageReader<AssetEvent<Text>>,
253) {
254 if !asset_events.is_empty() {
255 // This prints the current values of the assets
256 // Hot-reloading is supported, so try modifying the source assets (and their meta files)!
257 println!("Current Values:");
258 println!(" a: {:?}", texts.get(&handles.a));
259 println!(" b: {:?}", texts.get(&handles.b));
260 println!(" c: {:?}", texts.get(&handles.c));
261 println!(" d: {:?}", texts.get(&handles.d));
262 println!(" e: {:?}", texts.get(&handles.e));
263 println!("(You can modify source assets and their .meta files to hot-reload changes!)");
264 println!();
265 asset_events.clear();
266 }
267}69pub fn custom_camera_inputs(
70 pointers: Query<(&PointerId, &PointerLocation)>,
71 pointer_map: Res<CameraPointerMap>,
72 mut controller: MessageWriter<PanOrbitCameraInputMessage>,
73 mut mouse_wheel: MessageReader<MouseWheel>,
74 mouse_input: Res<ButtonInput<MouseButton>>,
75 cameras: Query<(Entity, &Camera, &RenderTarget, &PanOrbitCamera)>,
76 primary_window: Query<Entity, With<PrimaryWindow>>,
77) {
78 let orbit_start = MouseButton::Right;
79 let pan_start = MouseButton::Left;
80 let zoom_stop = 0.0;
81
82 if let Some(&camera) = pointer_map.get(&PointerId::Mouse) {
83 let camera_query = cameras.get(camera).ok();
84 let is_in_zoom_mode = camera_query
85 .map(|(.., editor_cam)| editor_cam.current_motion.is_zooming_only())
86 .unwrap_or_default();
87 let zoom_amount_abs = camera_query
88 .and_then(|(.., editor_cam)| {
89 editor_cam
90 .current_motion
91 .inputs()
92 .map(|inputs| inputs.zoom_velocity_abs(editor_cam.smoothing.zoom.mul_f32(2.0)))
93 })
94 .unwrap_or(0.0);
95 let should_zoom_end = is_in_zoom_mode && zoom_amount_abs <= zoom_stop;
96
97 if mouse_input.any_just_released([orbit_start, pan_start]) || should_zoom_end {
98 controller.write(PanOrbitCameraInputMessage::End { camera });
99 }
100 }
101
102 for (&pointer, pointer_location) in pointers
103 .iter()
104 .filter_map(|(id, loc)| loc.location().map(|loc| (id, loc)))
105 {
106 match pointer {
107 PointerId::Mouse => {
108 let Some((camera, ..)) = cameras.iter().find(|(_, camera, render_target, _)| {
109 pointer_location.is_in_viewport(camera, render_target, &primary_window)
110 }) else {
111 continue; // Pointer must be in viewport to start a motion.
112 };
113
114 if mouse_input.just_pressed(orbit_start) {
115 controller.write(PanOrbitCameraInputMessage::Start {
116 kind: MotionKind::OrbitZoom,
117 camera,
118 pointer,
119 });
120 } else if mouse_input.just_pressed(pan_start) {
121 controller.write(PanOrbitCameraInputMessage::Start {
122 kind: MotionKind::PanZoom,
123 camera,
124 pointer,
125 });
126 } else if mouse_wheel.read().map(|mw| mw.y.abs()).sum::<f32>() > 0.0 {
127 // Note we can't just check if the mouse wheel inputs are empty, we need to
128 // check if the y value abs greater than zero, otherwise we get a bunch of false
129 // positives, which can cause issues with figuring out what the user is trying
130 // to do.
131 controller.write(PanOrbitCameraInputMessage::Start {
132 kind: MotionKind::Zoom,
133 camera,
134 pointer,
135 });
136 }
137 }
138 PointerId::Touch(_) | PointerId::Custom(_) => continue,
139 }
140 }
141
142 // This must be cleared manually because reading these inputs is conditional - we are not
143 // guaranteed to be flushing the events every frame.
144 mouse_wheel.clear();
145}
146
147/// Maps pointers to the camera they are currently controlling.
148///
149/// This is needed so we can automatically track pointer movements and update camera movement after
150/// a [`PanOrbitCameraInputMessage::Start`] has been received.
151#[derive(Debug, Clone, Default, Deref, DerefMut, Resource)]
152pub struct CameraPointerMap(HashMap<PointerId, Entity>);
153
154/// Messages used when implementing input systems for the [`PanOrbitCamera`].
155#[derive(Debug, Clone, Message)]
156pub enum PanOrbitCameraInputMessage {
157 /// Send this event to start moving the camera. The anchor and inputs will be computed
158 /// automatically until the [`PanOrbitCameraInputMessage::End`] event is received.
159 Start {
160 /// The kind of camera movement that is being started.
161 kind: MotionKind,
162 /// The camera to move.
163 camera: Entity,
164 /// The pointer that will be controlling the camera. The rotation anchor point in the world
165 /// will be automatically computed using picking backends.
166 pointer: PointerId,
167 },
168 /// Send this event when a user's input ends, e.g. the button is released.
169 End {
170 /// The entity of the camera that should end its current input motion.
171 camera: Entity,
172 },
173}
174
175impl PanOrbitCameraInputMessage {
176 /// Get the camera entity associated with this event.
177 pub fn camera(&self) -> Entity {
178 match self {
179 PanOrbitCameraInputMessage::Start { camera, .. }
180 | PanOrbitCameraInputMessage::End { camera } => *camera,
181 }
182 }
183
184 /// Receive [`PanOrbitCameraInputMessage`]s, and use these to start and end moves on the [`PanOrbitCamera`].
185 pub fn receive_messages(
186 mut events: MessageReader<Self>,
187 mut controllers: Query<(&mut PanOrbitCamera, &GlobalTransform)>,
188 mut camera_map: ResMut<CameraPointerMap>,
189 pointer_map: Res<PointerMap>,
190 pointer_interactions: Query<&PointerInteraction>,
191 pointer_locations: Query<&PointerLocation>,
192 cameras: Query<(&Camera, &Projection)>,
193 windows: Query<&Window>,
194 ) {
195 for event in events.read() {
196 let Ok((mut controller, cam_transform)) = controllers.get_mut(event.camera()) else {
197 continue;
198 };
199
200 match event {
201 PanOrbitCameraInputMessage::Start { kind, pointer, .. } => {
202 if controller.is_actively_controlled() {
203 continue;
204 }
205 let anchor = pointer_map
206 .get_entity(*pointer)
207 .and_then(|entity| pointer_interactions.get(entity).ok())
208 .and_then(|interaction| interaction.get_nearest_hit())
209 // Since `bevy` 0.17.3:
210 //
211 // If the current hit is on a window, we cannot use the `hit.position` as an anchor
212 // as the `hit.position` is in viewport coordinates.
213 .filter(|(entity, _hit)| !windows.contains(*entity))
214 .and_then(|(_, hit)| hit.position)
215 .map(|world_space_hit| {
216 // Convert the world space hit to view (camera) space
217 cam_transform
218 .to_matrix()
219 .as_dmat4()
220 .inverse()
221 .transform_point3(world_space_hit.into())
222 })
223 .filter(|p| {
224 #[cfg(debug_assertions)]
225 if !p.is_finite() {
226 bevy::log::warn!(
227 "Non-finite input fed to camera controller: {p:?}"
228 );
229 }
230 p.is_finite()
231 })
232 .or_else(|| {
233 let camera = cameras.get(event.camera()).ok();
234 let pointer_location = pointer_map
235 .get_entity(*pointer)
236 .and_then(|entity| pointer_locations.get(entity).ok())
237 .and_then(|l| l.location());
238 if let Some(((camera, proj), pointer_location)) =
239 camera.zip(pointer_location)
240 {
241 screen_to_view_space(
242 camera,
243 proj,
244 &controller,
245 pointer_location.position,
246 )
247 } else {
248 None
249 }
250 })
251 .filter(|p| p.is_finite());
252
253 match kind {
254 MotionKind::OrbitZoom => controller.start_orbit(anchor),
255 MotionKind::PanZoom => controller.start_pan(anchor),
256 MotionKind::Zoom => controller.start_zoom(anchor),
257 }
258 camera_map.insert(*pointer, event.camera());
259 }
260 PanOrbitCameraInputMessage::End { .. } => {
261 controller.end_move();
262 if let Some(pointer) = camera_map
263 .iter()
264 .find(|(.., camera)| **camera == event.camera())
265 .map(|(&pointer, ..)| pointer)
266 {
267 camera_map.remove(&pointer);
268 }
269 }
270 }
271 }
272 }
273
274 /// While a camera motion is active, this system will take care of sending new pointer motion to
275 /// the camera controller. The camera controller assumes that pan and orbit movements are tied
276 /// to screen space pointer motion.
277 ///
278 /// This is because some of the pixel-perfect features of the controller require that data be
279 /// passed in as screen space deltas, to compute perfect first-order control. This is also
280 /// because the plugin uses pointer information to know which camera is being controlled.
281 ///
282 /// If you want to control the camera with different inputs, you will need to replace this
283 /// system with one that tracks other input methods, and sends the required zoom and screenspace
284 /// movement information.
285 pub fn send_pointer_inputs(
286 camera_map: Res<CameraPointerMap>,
287 mut camera_controllers: Query<&mut PanOrbitCamera>,
288 mut mouse_wheel: MessageReader<MouseWheel>,
289 mut moves: MessageReader<PointerInput>,
290 ) {
291 let moves_list: Vec<_> = moves.read().collect();
292 for (pointer, camera) in camera_map.iter() {
293 let Ok(mut camera_controller) = camera_controllers.get_mut(*camera) else {
294 continue;
295 };
296
297 let screenspace_input = moves_list
298 .iter()
299 .filter(|m| m.pointer_id.eq(pointer))
300 .filter_map(|m| match m.action {
301 PointerAction::Move { delta } => Some(delta),
302 _ => None,
303 })
304 .sum();
305
306 let zoom_amount = match pointer {
307 // TODO: add pinch zoom support
308 PointerId::Mouse => mouse_wheel
309 .read()
310 .map(|mw| {
311 let scroll_multiplier = match mw.unit {
312 MouseScrollUnit::Line => 150.0,
313 MouseScrollUnit::Pixel => 1.0,
314 };
315 mw.y * scroll_multiplier
316 })
317 .sum::<f32>(),
318 _ => 0.0,
319 };
320
321 camera_controller.send_screenspace_input(screenspace_input);
322 camera_controller.send_zoom_input(zoom_amount);
323 }
324 // This must be cleared manually because reading these inputs is conditional - we are not
325 // guaranteed to be flushing the events every frame.
326 mouse_wheel.clear();
327 }Trait Implementations§
Source§impl<'w, 's, M> Debug for MessageReader<'w, 's, M>
impl<'w, 's, M> Debug for MessageReader<'w, 's, M>
impl<'w, 's, M> ReadOnlySystemParam for MessageReader<'w, 's, M>where
M: Message,
Local<'s, MessageCursor<M>>: ReadOnlySystemParam,
Res<'w, Messages<M>>: ReadOnlySystemParam,
Source§impl<M> SystemParam for MessageReader<'_, '_, M>where
M: Message,
impl<M> SystemParam for MessageReader<'_, '_, M>where
M: Message,
Source§type Item<'w, 's> = MessageReader<'w, 's, M>
type Item<'w, 's> = MessageReader<'w, 's, M>
Self, instantiated with new lifetimes. Read moreSource§fn init_state(
world: &mut World,
) -> <MessageReader<'_, '_, M> as SystemParam>::State
fn init_state( world: &mut World, ) -> <MessageReader<'_, '_, M> as SystemParam>::State
State.Source§fn init_access(
state: &<MessageReader<'_, '_, M> as SystemParam>::State,
system_meta: &mut SystemMeta,
system_access: &mut SystemAccess,
world: &mut World,
)
fn init_access( state: &<MessageReader<'_, '_, M> as SystemParam>::State, system_meta: &mut SystemMeta, system_access: &mut SystemAccess, world: &mut World, )
Source§fn apply(
state: &mut <MessageReader<'_, '_, M> as SystemParam>::State,
system_meta: &SystemMeta,
world: &mut World,
)
fn apply( state: &mut <MessageReader<'_, '_, M> as SystemParam>::State, system_meta: &SystemMeta, world: &mut World, )
SystemParam’s state.
This is used to apply Commands during ApplyDeferred.Source§fn queue(
state: &mut <MessageReader<'_, '_, M> as SystemParam>::State,
system_meta: &SystemMeta,
world: DeferredWorld<'_>,
)
fn queue( state: &mut <MessageReader<'_, '_, M> as SystemParam>::State, system_meta: &SystemMeta, world: DeferredWorld<'_>, )
ApplyDeferred.Source§unsafe fn get_param<'w, 's>(
state: &'s mut <MessageReader<'_, '_, M> as SystemParam>::State,
system_meta: &SystemMeta,
world: UnsafeWorldCell<'w>,
change_tick: Tick,
) -> Result<<MessageReader<'_, '_, M> as SystemParam>::Item<'w, 's>, SystemParamValidationError>
unsafe fn get_param<'w, 's>( state: &'s mut <MessageReader<'_, '_, M> as SystemParam>::State, system_meta: &SystemMeta, world: UnsafeWorldCell<'w>, change_tick: Tick, ) -> Result<<MessageReader<'_, '_, M> as SystemParam>::Item<'w, 's>, SystemParamValidationError>
SystemParamFunction. Read moreAuto Trait Implementations§
impl<'w, 's, M> !UnwindSafe for MessageReader<'w, 's, M>
impl<'w, 's, M> Freeze for MessageReader<'w, 's, M>
impl<'w, 's, M> RefUnwindSafe for MessageReader<'w, 's, M>
impl<'w, 's, M> Send for MessageReader<'w, 's, M>
impl<'w, 's, M> Sync for MessageReader<'w, 's, M>
impl<'w, 's, M> Unpin for MessageReader<'w, 's, M>
impl<'w, 's, M> UnsafeUnpin for MessageReader<'w, 's, M>
Blanket Implementations§
Source§impl<T, U> AsBindGroupShaderType<U> for T
impl<T, U> AsBindGroupShaderType<U> for T
Source§fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
T ShaderType for self. When used in AsBindGroup
derives, it is safe to assume that all images in self exist.Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
impl<T> ConditionalSend for Twhere
T: Send,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
impl<S, T> Duplex<S> for Twhere
T: FromSample<S> + ToSample<S>,
impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
Source§impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T> HitDataExtra for T
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
Source§impl<T> InitializeFromFunction<T> for T
impl<T> InitializeFromFunction<T> for T
Source§fn initialize_from_function(f: fn() -> T) -> T
fn initialize_from_function(f: fn() -> T) -> T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoResult<T> for T
impl<T> IntoResult<T> for T
Source§fn into_result(self) -> Result<T, RunSystemError>
fn into_result(self) -> Result<T, RunSystemError>
Source§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
impl<T> Settings for T
Source§impl<Ret> SpawnIfAsync<(), Ret> for Ret
impl<Ret> SpawnIfAsync<(), Ret> for Ret
Source§impl<T, O> SuperFrom<T> for Owhere
O: From<T>,
impl<T, O> SuperFrom<T> for Owhere
O: From<T>,
Source§fn super_from(input: T) -> O
fn super_from(input: T) -> O
Source§impl<T, O, M> SuperInto<O, M> for Twhere
O: SuperFrom<T, M>,
impl<T, O, M> SuperInto<O, M> for Twhere
O: SuperFrom<T, M>,
Source§fn super_into(self) -> O
fn super_into(self) -> O
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.