Skip to main content

gstreamer/
rank.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use crate::ffi;
4use glib::{prelude::*, translate::*};
5use std::fmt;
6use std::ops;
7
8#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
10#[doc(alias = "GstRank")]
11pub struct Rank(i32);
12
13impl Rank {
14    #[doc(alias = "GST_RANK_NONE")]
15    pub const NONE: Rank = Self(ffi::GST_RANK_NONE);
16    #[doc(alias = "GST_RANK_MARGINAL")]
17    pub const MARGINAL: Rank = Self(ffi::GST_RANK_MARGINAL);
18    #[doc(alias = "GST_RANK_SECONDARY")]
19    pub const SECONDARY: Rank = Self(ffi::GST_RANK_SECONDARY);
20    #[doc(alias = "GST_RANK_PRIMARY")]
21    pub const PRIMARY: Rank = Self(ffi::GST_RANK_PRIMARY);
22}
23
24impl IntoGlib for Rank {
25    type GlibType = i32;
26
27    #[inline]
28    fn into_glib(self) -> i32 {
29        self.0
30    }
31}
32
33#[doc(hidden)]
34impl FromGlib<i32> for Rank {
35    #[inline]
36    unsafe fn from_glib(value: i32) -> Self {
37        Rank(value)
38    }
39}
40
41impl StaticType for Rank {
42    #[inline]
43    fn static_type() -> glib::Type {
44        unsafe { from_glib(ffi::gst_rank_get_type()) }
45    }
46}
47
48impl HasParamSpec for Rank {
49    type ParamSpec = glib::ParamSpecEnum;
50    type SetValue = Self;
51    type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
52
53    fn param_spec_builder() -> Self::BuilderFn {
54        Self::ParamSpec::builder_with_default
55    }
56}
57
58impl glib::value::ValueType for Rank {
59    type Type = Self;
60}
61
62unsafe impl<'a> glib::value::FromValue<'a> for Rank {
63    type Checker = glib::value::GenericValueTypeChecker<Self>;
64
65    #[inline]
66    unsafe fn from_value(value: &'a glib::Value) -> Self {
67        unsafe {
68            skip_assert_initialized!();
69            from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0))
70        }
71    }
72}
73
74impl ToValue for Rank {
75    #[inline]
76    fn to_value(&self) -> glib::Value {
77        let mut value = glib::Value::for_value_type::<Self>();
78        unsafe {
79            glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
80        }
81        value
82    }
83
84    #[inline]
85    fn value_type(&self) -> glib::Type {
86        Self::static_type()
87    }
88}
89
90impl From<Rank> for glib::Value {
91    #[inline]
92    fn from(v: Rank) -> Self {
93        skip_assert_initialized!();
94        ToValue::to_value(&v)
95    }
96}
97
98impl From<i32> for Rank {
99    #[inline]
100    fn from(v: i32) -> Self {
101        skip_assert_initialized!();
102        Rank(v)
103    }
104}
105
106impl From<Rank> for i32 {
107    #[inline]
108    fn from(v: Rank) -> Self {
109        skip_assert_initialized!();
110        v.0
111    }
112}
113
114impl ops::Add<i32> for Rank {
115    type Output = Rank;
116
117    #[inline]
118    fn add(self, rhs: i32) -> Rank {
119        Rank(self.0 + rhs)
120    }
121}
122
123impl ops::Add<Rank> for i32 {
124    type Output = Rank;
125
126    #[inline]
127    fn add(self, rhs: Rank) -> Rank {
128        Rank(self + rhs.0)
129    }
130}
131
132impl ops::AddAssign<i32> for Rank {
133    #[inline]
134    fn add_assign(&mut self, rhs: i32) {
135        self.0 += rhs;
136    }
137}
138
139impl ops::Sub<i32> for Rank {
140    type Output = Rank;
141
142    #[inline]
143    fn sub(self, rhs: i32) -> Rank {
144        Rank(self.0 - rhs)
145    }
146}
147
148impl ops::Sub<Rank> for i32 {
149    type Output = Rank;
150
151    #[inline]
152    fn sub(self, rhs: Rank) -> Rank {
153        Rank(self - rhs.0)
154    }
155}
156
157impl ops::SubAssign<i32> for Rank {
158    #[inline]
159    fn sub_assign(&mut self, rhs: i32) {
160        self.0 -= rhs
161    }
162}
163
164impl std::cmp::PartialEq<i32> for Rank {
165    #[inline]
166    fn eq(&self, rhs: &i32) -> bool {
167        self.0 == *rhs
168    }
169}
170
171impl std::cmp::PartialEq<Rank> for i32 {
172    #[inline]
173    fn eq(&self, rhs: &Rank) -> bool {
174        *self == rhs.0
175    }
176}
177
178impl fmt::Display for Rank {
179    #[inline]
180    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
181        let rank = self.into_glib();
182        let names: [&str; 4] = ["none", "marginal", "secondary", "primary"];
183        let ranks: [Rank; 4] = [Rank::NONE, Rank::MARGINAL, Rank::SECONDARY, Rank::PRIMARY];
184
185        let mut best_i = 0;
186        for i in 0..4 {
187            if rank == ranks[i].into_glib() {
188                return f.write_str(names[i]);
189            }
190            if (rank - ranks[i]).into_glib().abs() < (rank - ranks[best_i]).into_glib().abs() {
191                best_i = i;
192            }
193        }
194
195        let diff = (rank - ranks[best_i]).into_glib();
196        let op_str = if diff > 0 { '+' } else { '-' };
197
198        write!(f, "{} {} {}", names[best_i], op_str, diff.abs())
199    }
200}