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