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