pub struct SoundEngine { /* private fields */ }Expand description
Internal state of sound engine.
Implementations§
Source§impl SoundEngine
impl SoundEngine
Sourcepub fn new() -> Arc<Mutex<Self>>
pub fn new() -> Arc<Mutex<Self>>
Creates new instance of a sound engine. It is possible to have multiple engine running at the same time, but you shouldn’t do this because you can create multiple contexts which should cover 99% of use cases.
Examples found in repository?
53fn main() {
54 // Initialize sound engine with default output device.
55 let engine = SoundEngine::new();
56
57 // Initialize new sound context.
58 let context = SoundContext::new();
59
60 engine.lock().unwrap().add_context(context.clone());
61
62 // Create sine wave generator
63 let sine_wave = DataSource::RawStreaming(Box::new(SamplesGenerator::new()));
64
65 let sine_wave_buffer = SoundBufferResource::new_streaming(sine_wave).unwrap();
66
67 // Create generic source (without spatial effects) using that buffer.
68 let source = GenericSourceBuilder::new()
69 .with_buffer(sine_wave_buffer)
70 .with_status(Status::Playing)
71 .build_source()
72 .unwrap();
73
74 context.state().add_source(source);
75
76 // Play sound for some time.
77 thread::sleep(Duration::from_secs(10));
78}More examples
11fn main() {
12 // Initialize sound engine with default output device.
13 let engine = SoundEngine::new();
14
15 // Initialize new sound context.
16 let context = SoundContext::new();
17
18 engine.lock().unwrap().add_context(context.clone());
19
20 // Load sound buffer.
21 let waterfall_buffer = SoundBufferResource::new_streaming(
22 block_on(DataSource::from_file("examples/data/waterfall.ogg")).unwrap(),
23 )
24 .unwrap();
25
26 // Create flat source (without spatial effects) using that buffer.
27 let source = GenericSourceBuilder::new()
28 .with_buffer(waterfall_buffer)
29 .with_status(Status::Playing)
30 .with_looping(true)
31 .build_source()
32 .unwrap();
33
34 // Each sound sound must be added to context, context takes ownership on source
35 // and returns pool handle to it by which it can be accessed later on if needed.
36 let _source_handle: Handle<SoundSource> = context.state().add_source(source);
37
38 thread::sleep(Duration::from_secs(30))
39}10fn main() {
11 // Initialize sound engine with default output device.
12 let engine = SoundEngine::new();
13
14 // Create new context.
15 let context = SoundContext::new();
16
17 // Register context in the engine.
18 engine.lock().unwrap().add_context(context.clone());
19
20 // Load sound buffer.
21 let door_open_buffer = SoundBufferResource::new_generic(
22 rg3d_sound::futures::executor::block_on(DataSource::from_file(
23 "examples/data/door_open.wav",
24 ))
25 .unwrap(),
26 )
27 .unwrap();
28
29 // Create generic source (without spatial effects) using that buffer.
30 let source = GenericSourceBuilder::new()
31 .with_buffer(door_open_buffer)
32 .with_status(Status::Playing)
33 .build_source()
34 .unwrap();
35
36 // Each sound sound must be added to context, context takes ownership on source
37 // and returns pool handle to it by which it can be accessed later on if needed.
38 let _source_handle: Handle<SoundSource> = context.state().add_source(source);
39
40 // Wait until sound will play completely.
41 thread::sleep(Duration::from_secs(3));
42}9fn main() {
10 // Initialize sound engine with default output device.
11 let engine = SoundEngine::new();
12
13 // Initialize new sound context.
14 let context = SoundContext::new();
15
16 engine.lock().unwrap().add_context(context.clone());
17
18 // Create sine wave.
19 let sample_rate = 44100;
20 let sine_wave = DataSource::Raw {
21 sample_rate,
22 channel_count: 1,
23 samples: {
24 let frequency = 440.0;
25 let amplitude = 0.75;
26 (0..44100)
27 .map(|i| {
28 amplitude
29 * ((2.0 * std::f32::consts::PI * i as f32 * frequency) / sample_rate as f32)
30 .sin()
31 })
32 .collect()
33 },
34 };
35
36 let sine_wave_buffer = SoundBufferResource::new_generic(sine_wave).unwrap();
37
38 // Create generic source (without spatial effects) using that buffer.
39 let source = GenericSourceBuilder::new()
40 .with_buffer(sine_wave_buffer)
41 .with_status(Status::Playing)
42 .with_looping(true)
43 .build_source()
44 .unwrap();
45
46 context.state().add_source(source);
47
48 // Play sound for some time.
49 thread::sleep(Duration::from_secs(10));
50}15fn main() {
16 // Initialize sound engine with default output device.
17 let engine = SoundEngine::new();
18
19 // Initialize new sound context.
20 let context = SoundContext::new();
21
22 engine.lock().unwrap().add_context(context.clone());
23
24 // Load sound buffer.
25 let drop_buffer = SoundBufferResource::new_generic(
26 block_on(DataSource::from_file("examples/data/drop.wav")).unwrap(),
27 )
28 .unwrap();
29
30 // Create spatial source - spatial sources can be positioned in space.
31 let source = SpatialSourceBuilder::new(
32 GenericSourceBuilder::new()
33 .with_buffer(drop_buffer)
34 .with_looping(true)
35 .with_status(Status::Playing)
36 .build()
37 .unwrap(),
38 )
39 .build_source();
40
41 // Each sound sound must be added to context, context takes ownership on source
42 // and returns pool handle to it by which it can be accessed later on if needed.
43 let source_handle: Handle<SoundSource> = context.state().add_source(source);
44
45 // Move sound around listener for some time.
46 let start_time = time::Instant::now();
47 let mut angle = 0.0f32;
48 while (time::Instant::now() - start_time).as_secs() < 11 {
49 if let SoundSource::Spatial(spatial) = context.state().source_mut(source_handle) {
50 let axis = Vector3::y_axis();
51 let rotation_matrix =
52 UnitQuaternion::from_axis_angle(&axis, angle.to_radians()).to_homogeneous();
53 spatial.set_position(
54 rotation_matrix
55 .transform_point(&Point3::new(0.0, 0.0, 3.0))
56 .coords,
57 );
58 }
59 angle += 3.6;
60
61 // Limit rate of updates.
62 thread::sleep(Duration::from_millis(100));
63 }
64}15fn main() {
16 // Initialize sound engine with default output device.
17 let engine = SoundEngine::new();
18
19 // Initialize new sound context.
20 let context = SoundContext::new();
21
22 engine.lock().unwrap().add_context(context.clone());
23
24 // Load sound buffer.
25 let drop_buffer = SoundBufferResource::new_generic(
26 block_on(DataSource::from_file("examples/data/drop.wav")).unwrap(),
27 )
28 .unwrap();
29
30 // Create spatial source - spatial sources can be positioned in space.
31 let source = SpatialSourceBuilder::new(
32 GenericSourceBuilder::new()
33 .with_buffer(drop_buffer)
34 .with_looping(true)
35 .with_status(Status::Playing)
36 .build()
37 .unwrap(),
38 )
39 .build_source();
40
41 // Each sound sound must be added to context, context takes ownership on source
42 // and returns pool handle to it by which it can be accessed later on if needed.
43 context.state().add_source(source);
44
45 // Rotate listener for some time.
46 let start_time = time::Instant::now();
47 let mut angle = 0.0f32;
48 while (time::Instant::now() - start_time).as_secs() < 20 {
49 // Separate scope for update to make sure that mutex lock will be released before
50 // thread::sleep will be called so context can actually work in background thread.
51 {
52 let mut context = context.state();
53
54 let listener = context.listener_mut();
55
56 // Define up-axis of listener.
57 let up = Vector3::y_axis();
58
59 // And rotate look axis.
60 let rotation_matrix =
61 UnitQuaternion::from_axis_angle(&up, angle.to_radians()).to_homogeneous();
62 let look = rotation_matrix
63 .transform_point(&Point3::new(0.0, 0.0, 1.0))
64 .coords;
65
66 // Finally combine axes. _lh suffix here means that we using left-handed coordinate system.
67 // there is also _rh (right handed) version. Also basis can be set directly by using `set_basis`
68 listener.set_orientation_lh(look, *up);
69
70 // Move listener a bit back from sound source.
71 listener.set_position(Vector3::new(0.0, 0.0, -2.0));
72
73 // Continue rotation.
74 angle += 2.0;
75 }
76
77 // Limit rate of updates.
78 thread::sleep(Duration::from_millis(100));
79 }
80}Sourcepub fn without_device() -> Arc<Mutex<Self>>
pub fn without_device() -> Arc<Mutex<Self>>
Creates new instance of a sound engine without running a device thread. The user must
periodically run Self::render.
Examples found in repository?
9fn main() {
10 // Initialize sound engine without output device.
11 let engine = SoundEngine::without_device();
12
13 // Create new context.
14 let context = SoundContext::new();
15
16 // Register context in the engine.
17 engine.lock().unwrap().add_context(context.clone());
18
19 // Load sound buffer.
20 let door_open_buffer = SoundBufferResource::new_generic(
21 rg3d_sound::futures::executor::block_on(DataSource::from_file(
22 "examples/data/door_open.wav",
23 ))
24 .unwrap(),
25 )
26 .unwrap();
27
28 // Create generic source (without spatial effects) using that buffer.
29 let source = GenericSourceBuilder::new()
30 .with_buffer(door_open_buffer)
31 .with_status(Status::Playing)
32 .build_source()
33 .unwrap();
34
35 // Each sound sound must be added to context, context takes ownership on source
36 // and returns pool handle to it by which it can be accessed later on if needed.
37 let _source_handle: Handle<SoundSource> = context.state().add_source(source);
38
39 // Create output wav file. The sample rate is currently fixed.
40 let wav_spec = hound::WavSpec {
41 channels: 2,
42 sample_rate: rg3d_sound::context::SAMPLE_RATE,
43 bits_per_sample: 32,
44 sample_format: hound::SampleFormat::Float,
45 };
46 let mut wav_writer = hound::WavWriter::create("output.wav", wav_spec).unwrap();
47
48 // Create an output buffer.
49 let buf_len = SoundEngine::render_buffer_len();
50 let mut buf = vec![(0.0f32, 0.0f32); buf_len];
51 let mut samples_written = 0;
52
53 // Wait until sound will play completely.
54 while samples_written < 3 * rg3d_sound::context::SAMPLE_RATE {
55 engine.lock().unwrap().render(&mut buf);
56 for &(l, r) in buf.iter() {
57 wav_writer.write_sample(l).unwrap();
58 wav_writer.write_sample(r).unwrap();
59 }
60 samples_written += buf_len as u32;
61 }
62
63 wav_writer.finalize().unwrap();
64}Sourcepub fn add_context(&mut self, context: SoundContext)
pub fn add_context(&mut self, context: SoundContext)
Adds new context to the engine. Each context must be added to the engine to emit sounds.
Examples found in repository?
53fn main() {
54 // Initialize sound engine with default output device.
55 let engine = SoundEngine::new();
56
57 // Initialize new sound context.
58 let context = SoundContext::new();
59
60 engine.lock().unwrap().add_context(context.clone());
61
62 // Create sine wave generator
63 let sine_wave = DataSource::RawStreaming(Box::new(SamplesGenerator::new()));
64
65 let sine_wave_buffer = SoundBufferResource::new_streaming(sine_wave).unwrap();
66
67 // Create generic source (without spatial effects) using that buffer.
68 let source = GenericSourceBuilder::new()
69 .with_buffer(sine_wave_buffer)
70 .with_status(Status::Playing)
71 .build_source()
72 .unwrap();
73
74 context.state().add_source(source);
75
76 // Play sound for some time.
77 thread::sleep(Duration::from_secs(10));
78}More examples
11fn main() {
12 // Initialize sound engine with default output device.
13 let engine = SoundEngine::new();
14
15 // Initialize new sound context.
16 let context = SoundContext::new();
17
18 engine.lock().unwrap().add_context(context.clone());
19
20 // Load sound buffer.
21 let waterfall_buffer = SoundBufferResource::new_streaming(
22 block_on(DataSource::from_file("examples/data/waterfall.ogg")).unwrap(),
23 )
24 .unwrap();
25
26 // Create flat source (without spatial effects) using that buffer.
27 let source = GenericSourceBuilder::new()
28 .with_buffer(waterfall_buffer)
29 .with_status(Status::Playing)
30 .with_looping(true)
31 .build_source()
32 .unwrap();
33
34 // Each sound sound must be added to context, context takes ownership on source
35 // and returns pool handle to it by which it can be accessed later on if needed.
36 let _source_handle: Handle<SoundSource> = context.state().add_source(source);
37
38 thread::sleep(Duration::from_secs(30))
39}10fn main() {
11 // Initialize sound engine with default output device.
12 let engine = SoundEngine::new();
13
14 // Create new context.
15 let context = SoundContext::new();
16
17 // Register context in the engine.
18 engine.lock().unwrap().add_context(context.clone());
19
20 // Load sound buffer.
21 let door_open_buffer = SoundBufferResource::new_generic(
22 rg3d_sound::futures::executor::block_on(DataSource::from_file(
23 "examples/data/door_open.wav",
24 ))
25 .unwrap(),
26 )
27 .unwrap();
28
29 // Create generic source (without spatial effects) using that buffer.
30 let source = GenericSourceBuilder::new()
31 .with_buffer(door_open_buffer)
32 .with_status(Status::Playing)
33 .build_source()
34 .unwrap();
35
36 // Each sound sound must be added to context, context takes ownership on source
37 // and returns pool handle to it by which it can be accessed later on if needed.
38 let _source_handle: Handle<SoundSource> = context.state().add_source(source);
39
40 // Wait until sound will play completely.
41 thread::sleep(Duration::from_secs(3));
42}9fn main() {
10 // Initialize sound engine with default output device.
11 let engine = SoundEngine::new();
12
13 // Initialize new sound context.
14 let context = SoundContext::new();
15
16 engine.lock().unwrap().add_context(context.clone());
17
18 // Create sine wave.
19 let sample_rate = 44100;
20 let sine_wave = DataSource::Raw {
21 sample_rate,
22 channel_count: 1,
23 samples: {
24 let frequency = 440.0;
25 let amplitude = 0.75;
26 (0..44100)
27 .map(|i| {
28 amplitude
29 * ((2.0 * std::f32::consts::PI * i as f32 * frequency) / sample_rate as f32)
30 .sin()
31 })
32 .collect()
33 },
34 };
35
36 let sine_wave_buffer = SoundBufferResource::new_generic(sine_wave).unwrap();
37
38 // Create generic source (without spatial effects) using that buffer.
39 let source = GenericSourceBuilder::new()
40 .with_buffer(sine_wave_buffer)
41 .with_status(Status::Playing)
42 .with_looping(true)
43 .build_source()
44 .unwrap();
45
46 context.state().add_source(source);
47
48 // Play sound for some time.
49 thread::sleep(Duration::from_secs(10));
50}15fn main() {
16 // Initialize sound engine with default output device.
17 let engine = SoundEngine::new();
18
19 // Initialize new sound context.
20 let context = SoundContext::new();
21
22 engine.lock().unwrap().add_context(context.clone());
23
24 // Load sound buffer.
25 let drop_buffer = SoundBufferResource::new_generic(
26 block_on(DataSource::from_file("examples/data/drop.wav")).unwrap(),
27 )
28 .unwrap();
29
30 // Create spatial source - spatial sources can be positioned in space.
31 let source = SpatialSourceBuilder::new(
32 GenericSourceBuilder::new()
33 .with_buffer(drop_buffer)
34 .with_looping(true)
35 .with_status(Status::Playing)
36 .build()
37 .unwrap(),
38 )
39 .build_source();
40
41 // Each sound sound must be added to context, context takes ownership on source
42 // and returns pool handle to it by which it can be accessed later on if needed.
43 let source_handle: Handle<SoundSource> = context.state().add_source(source);
44
45 // Move sound around listener for some time.
46 let start_time = time::Instant::now();
47 let mut angle = 0.0f32;
48 while (time::Instant::now() - start_time).as_secs() < 11 {
49 if let SoundSource::Spatial(spatial) = context.state().source_mut(source_handle) {
50 let axis = Vector3::y_axis();
51 let rotation_matrix =
52 UnitQuaternion::from_axis_angle(&axis, angle.to_radians()).to_homogeneous();
53 spatial.set_position(
54 rotation_matrix
55 .transform_point(&Point3::new(0.0, 0.0, 3.0))
56 .coords,
57 );
58 }
59 angle += 3.6;
60
61 // Limit rate of updates.
62 thread::sleep(Duration::from_millis(100));
63 }
64}9fn main() {
10 // Initialize sound engine without output device.
11 let engine = SoundEngine::without_device();
12
13 // Create new context.
14 let context = SoundContext::new();
15
16 // Register context in the engine.
17 engine.lock().unwrap().add_context(context.clone());
18
19 // Load sound buffer.
20 let door_open_buffer = SoundBufferResource::new_generic(
21 rg3d_sound::futures::executor::block_on(DataSource::from_file(
22 "examples/data/door_open.wav",
23 ))
24 .unwrap(),
25 )
26 .unwrap();
27
28 // Create generic source (without spatial effects) using that buffer.
29 let source = GenericSourceBuilder::new()
30 .with_buffer(door_open_buffer)
31 .with_status(Status::Playing)
32 .build_source()
33 .unwrap();
34
35 // Each sound sound must be added to context, context takes ownership on source
36 // and returns pool handle to it by which it can be accessed later on if needed.
37 let _source_handle: Handle<SoundSource> = context.state().add_source(source);
38
39 // Create output wav file. The sample rate is currently fixed.
40 let wav_spec = hound::WavSpec {
41 channels: 2,
42 sample_rate: rg3d_sound::context::SAMPLE_RATE,
43 bits_per_sample: 32,
44 sample_format: hound::SampleFormat::Float,
45 };
46 let mut wav_writer = hound::WavWriter::create("output.wav", wav_spec).unwrap();
47
48 // Create an output buffer.
49 let buf_len = SoundEngine::render_buffer_len();
50 let mut buf = vec![(0.0f32, 0.0f32); buf_len];
51 let mut samples_written = 0;
52
53 // Wait until sound will play completely.
54 while samples_written < 3 * rg3d_sound::context::SAMPLE_RATE {
55 engine.lock().unwrap().render(&mut buf);
56 for &(l, r) in buf.iter() {
57 wav_writer.write_sample(l).unwrap();
58 wav_writer.write_sample(r).unwrap();
59 }
60 samples_written += buf_len as u32;
61 }
62
63 wav_writer.finalize().unwrap();
64}Sourcepub fn remove_context(&mut self, context: SoundContext)
pub fn remove_context(&mut self, context: SoundContext)
Removes a context from the engine. Removed context will no longer produce any sound.
Sourcepub fn has_context(&self, context: &SoundContext) -> bool
pub fn has_context(&self, context: &SoundContext) -> bool
Checks if a context is registered in the engine.
Sourcepub fn contexts(&self) -> &[SoundContext]
pub fn contexts(&self) -> &[SoundContext]
Returns a reference to context container.
Sourcepub fn set_master_gain(&mut self, master_gain: f32)
pub fn set_master_gain(&mut self, master_gain: f32)
Set global sound volume in [0; 1] range.
Sourcepub fn master_gain(&self) -> f32
pub fn master_gain(&self) -> f32
Returns global sound volume in [0; 1] range.
Sourcepub fn render_buffer_len() -> usize
pub fn render_buffer_len() -> usize
Returns the length of buf to be passed to Self::render().
Examples found in repository?
9fn main() {
10 // Initialize sound engine without output device.
11 let engine = SoundEngine::without_device();
12
13 // Create new context.
14 let context = SoundContext::new();
15
16 // Register context in the engine.
17 engine.lock().unwrap().add_context(context.clone());
18
19 // Load sound buffer.
20 let door_open_buffer = SoundBufferResource::new_generic(
21 rg3d_sound::futures::executor::block_on(DataSource::from_file(
22 "examples/data/door_open.wav",
23 ))
24 .unwrap(),
25 )
26 .unwrap();
27
28 // Create generic source (without spatial effects) using that buffer.
29 let source = GenericSourceBuilder::new()
30 .with_buffer(door_open_buffer)
31 .with_status(Status::Playing)
32 .build_source()
33 .unwrap();
34
35 // Each sound sound must be added to context, context takes ownership on source
36 // and returns pool handle to it by which it can be accessed later on if needed.
37 let _source_handle: Handle<SoundSource> = context.state().add_source(source);
38
39 // Create output wav file. The sample rate is currently fixed.
40 let wav_spec = hound::WavSpec {
41 channels: 2,
42 sample_rate: rg3d_sound::context::SAMPLE_RATE,
43 bits_per_sample: 32,
44 sample_format: hound::SampleFormat::Float,
45 };
46 let mut wav_writer = hound::WavWriter::create("output.wav", wav_spec).unwrap();
47
48 // Create an output buffer.
49 let buf_len = SoundEngine::render_buffer_len();
50 let mut buf = vec![(0.0f32, 0.0f32); buf_len];
51 let mut samples_written = 0;
52
53 // Wait until sound will play completely.
54 while samples_written < 3 * rg3d_sound::context::SAMPLE_RATE {
55 engine.lock().unwrap().render(&mut buf);
56 for &(l, r) in buf.iter() {
57 wav_writer.write_sample(l).unwrap();
58 wav_writer.write_sample(r).unwrap();
59 }
60 samples_written += buf_len as u32;
61 }
62
63 wav_writer.finalize().unwrap();
64}Sourcepub fn render(&mut self, buf: &mut [(f32, f32)])
pub fn render(&mut self, buf: &mut [(f32, f32)])
Renders the sound into buf. The buf must have at least Self::render_buffer_len()
elements. This method must be used if and only if the engine was created via
Self::without_device.
§Deadlocks
This method internally locks added sound contexts so it must be called when all the contexts are unlocked or you’ll get a deadlock.
Examples found in repository?
9fn main() {
10 // Initialize sound engine without output device.
11 let engine = SoundEngine::without_device();
12
13 // Create new context.
14 let context = SoundContext::new();
15
16 // Register context in the engine.
17 engine.lock().unwrap().add_context(context.clone());
18
19 // Load sound buffer.
20 let door_open_buffer = SoundBufferResource::new_generic(
21 rg3d_sound::futures::executor::block_on(DataSource::from_file(
22 "examples/data/door_open.wav",
23 ))
24 .unwrap(),
25 )
26 .unwrap();
27
28 // Create generic source (without spatial effects) using that buffer.
29 let source = GenericSourceBuilder::new()
30 .with_buffer(door_open_buffer)
31 .with_status(Status::Playing)
32 .build_source()
33 .unwrap();
34
35 // Each sound sound must be added to context, context takes ownership on source
36 // and returns pool handle to it by which it can be accessed later on if needed.
37 let _source_handle: Handle<SoundSource> = context.state().add_source(source);
38
39 // Create output wav file. The sample rate is currently fixed.
40 let wav_spec = hound::WavSpec {
41 channels: 2,
42 sample_rate: rg3d_sound::context::SAMPLE_RATE,
43 bits_per_sample: 32,
44 sample_format: hound::SampleFormat::Float,
45 };
46 let mut wav_writer = hound::WavWriter::create("output.wav", wav_spec).unwrap();
47
48 // Create an output buffer.
49 let buf_len = SoundEngine::render_buffer_len();
50 let mut buf = vec![(0.0f32, 0.0f32); buf_len];
51 let mut samples_written = 0;
52
53 // Wait until sound will play completely.
54 while samples_written < 3 * rg3d_sound::context::SAMPLE_RATE {
55 engine.lock().unwrap().render(&mut buf);
56 for &(l, r) in buf.iter() {
57 wav_writer.write_sample(l).unwrap();
58 wav_writer.write_sample(r).unwrap();
59 }
60 samples_written += buf_len as u32;
61 }
62
63 wav_writer.finalize().unwrap();
64}Trait Implementations§
Source§impl Default for SoundEngine
impl Default for SoundEngine
Source§fn default() -> SoundEngine
fn default() -> SoundEngine
Source§impl Visit for SoundEngine
impl Visit for SoundEngine
Auto Trait Implementations§
impl Freeze for SoundEngine
impl RefUnwindSafe for SoundEngine
impl Send for SoundEngine
impl Sync for SoundEngine
impl Unpin for SoundEngine
impl UnsafeUnpin for SoundEngine
impl UnwindSafe for SoundEngine
Blanket Implementations§
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
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.