1use rust_libretro_sys::{
2 RETRO_DEVICE_ID_JOYPAD_A, RETRO_DEVICE_ID_JOYPAD_B, RETRO_DEVICE_ID_JOYPAD_DOWN,
3 RETRO_DEVICE_ID_JOYPAD_L, RETRO_DEVICE_ID_JOYPAD_L2, RETRO_DEVICE_ID_JOYPAD_L3,
4 RETRO_DEVICE_ID_JOYPAD_LEFT, RETRO_DEVICE_ID_JOYPAD_R, RETRO_DEVICE_ID_JOYPAD_R2,
5 RETRO_DEVICE_ID_JOYPAD_R3, RETRO_DEVICE_ID_JOYPAD_RIGHT, RETRO_DEVICE_ID_JOYPAD_SELECT,
6 RETRO_DEVICE_ID_JOYPAD_START, RETRO_DEVICE_ID_JOYPAD_UP, RETRO_DEVICE_ID_JOYPAD_X,
7 RETRO_DEVICE_ID_JOYPAD_Y,
8};
9
10#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default, Debug)]
11pub struct Buttons(i16);
12impl From<Buttons> for i16 {
13 fn from(value: Buttons) -> Self {
14 value.0
15 }
16}
17impl From<i16> for Buttons {
18 fn from(value: i16) -> Self {
19 Self(value)
20 }
21}
22impl Buttons {
23 #[must_use]
24 pub fn new() -> Self {
25 Buttons::default()
26 }
27 #[must_use]
30 pub fn get(self, id: u32) -> bool {
31 assert!(id < 16);
32 (self.0 & (1 << id)) != 0
33 }
34 fn mask_inout(self, b: bool, id: u32) -> Self {
36 assert!(id < 16);
37 if b {
38 Buttons(self.0 | (1 << id))
39 } else {
40 Buttons(self.0 & !(1 << id))
41 }
42 }
43 #[must_use]
44 pub fn up(self, b: bool) -> Self {
45 self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_UP)
46 }
47 #[must_use]
48 pub fn down(self, b: bool) -> Self {
49 self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_DOWN)
50 }
51 #[must_use]
52 pub fn left(self, b: bool) -> Self {
53 self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_LEFT)
54 }
55 #[must_use]
56 pub fn right(self, b: bool) -> Self {
57 self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_RIGHT)
58 }
59
60 #[must_use]
61 pub fn select(self, b: bool) -> Self {
62 self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_SELECT)
63 }
64 #[must_use]
65 pub fn start(self, b: bool) -> Self {
66 self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_START)
67 }
68 #[must_use]
69 pub fn a(self, b: bool) -> Self {
70 self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_A)
71 }
72 #[must_use]
73 pub fn b(self, b: bool) -> Self {
74 self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_B)
75 }
76 #[must_use]
77 pub fn y(self, b: bool) -> Self {
78 self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_Y)
79 }
80 #[must_use]
81 pub fn x(self, b: bool) -> Self {
82 self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_X)
83 }
84 #[must_use]
85 pub fn l1(self, b: bool) -> Self {
86 self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_L)
87 }
88 #[must_use]
89 pub fn r1(self, b: bool) -> Self {
90 self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_R)
91 }
92 #[must_use]
93 pub fn l2(self, b: bool) -> Self {
94 self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_L2)
95 }
96 #[must_use]
97 pub fn r2(self, b: bool) -> Self {
98 self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_R2)
99 }
100 #[must_use]
101 pub fn l3(self, b: bool) -> Self {
102 self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_L3)
103 }
104 #[must_use]
105 pub fn r3(self, b: bool) -> Self {
106 self.mask_inout(b, RETRO_DEVICE_ID_JOYPAD_R3)
107 }
108
109 #[must_use]
110 pub fn get_up(self) -> bool {
111 self.get(RETRO_DEVICE_ID_JOYPAD_UP)
112 }
113 #[must_use]
114 pub fn get_down(self) -> bool {
115 self.get(RETRO_DEVICE_ID_JOYPAD_DOWN)
116 }
117 #[must_use]
118 pub fn get_left(self) -> bool {
119 self.get(RETRO_DEVICE_ID_JOYPAD_LEFT)
120 }
121 #[must_use]
122 pub fn get_right(self) -> bool {
123 self.get(RETRO_DEVICE_ID_JOYPAD_RIGHT)
124 }
125
126 #[must_use]
127 pub fn get_select(self) -> bool {
128 self.get(RETRO_DEVICE_ID_JOYPAD_SELECT)
129 }
130 #[must_use]
131 pub fn get_start(self) -> bool {
132 self.get(RETRO_DEVICE_ID_JOYPAD_START)
133 }
134 #[must_use]
135 pub fn get_a(self) -> bool {
136 self.get(RETRO_DEVICE_ID_JOYPAD_A)
137 }
138 #[must_use]
139 pub fn get_b(self) -> bool {
140 self.get(RETRO_DEVICE_ID_JOYPAD_B)
141 }
142 #[must_use]
143 pub fn get_y(self) -> bool {
144 self.get(RETRO_DEVICE_ID_JOYPAD_Y)
145 }
146 #[must_use]
147 pub fn get_x(self) -> bool {
148 self.get(RETRO_DEVICE_ID_JOYPAD_X)
149 }
150 #[must_use]
151 pub fn get_l1(self) -> bool {
152 self.get(RETRO_DEVICE_ID_JOYPAD_L)
153 }
154 #[must_use]
155 pub fn get_r1(self) -> bool {
156 self.get(RETRO_DEVICE_ID_JOYPAD_R)
157 }
158 #[must_use]
159 pub fn get_l2(self) -> bool {
160 self.get(RETRO_DEVICE_ID_JOYPAD_L2)
161 }
162 #[must_use]
163 pub fn get_r2(self) -> bool {
164 self.get(RETRO_DEVICE_ID_JOYPAD_R2)
165 }
166 #[must_use]
167 pub fn get_l3(self) -> bool {
168 self.get(RETRO_DEVICE_ID_JOYPAD_L3)
169 }
170 #[must_use]
171 pub fn get_r3(self) -> bool {
172 self.get(RETRO_DEVICE_ID_JOYPAD_R3)
173 }
174}