Skip to content

Commit ba6357e

Browse files
committed
macros: Take a visibility for c_enum variants
Accept a visibility so we are able to make some variants nonpublic. This means that `pub` needs to be added on all variants we want to be visible: it is more verbose, but matches how everything else works.
1 parent 9713fd1 commit ba6357e

File tree

12 files changed

+426
-377
lines changed

12 files changed

+426
-377
lines changed

src/macros.rs

Lines changed: 66 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -294,13 +294,13 @@ macro_rules! c_enum {
294294
($(
295295
$(#[repr($repr:ty)])?
296296
pub enum $($ty_name:ident)? $(#$anon:ident)? {
297-
$($variant:ident $(= $value:expr)?,)+
297+
$($vis:vis $variant:ident $(= $value:expr)?,)+
298298
}
299299
)+) => {
300300
$(c_enum!(@single;
301301
$(#[repr($repr)])?
302302
pub enum $($ty_name)? $(#$anon)? {
303-
$($variant $(= $value)?,)+
303+
$($vis $variant $(= $value)?,)+
304304
}
305305
);)+
306306
};
@@ -309,31 +309,45 @@ macro_rules! c_enum {
309309
(@single;
310310
$(#[repr($repr:ty)])?
311311
pub enum $ty_name:ident {
312-
$($variant:ident $(= $value:expr)?,)+
312+
$($vis:vis $variant:ident $(= $value:expr)?,)+
313313
}
314314
) => {
315315
pub type $ty_name = c_enum!(@ty $($repr)?);
316-
c_enum!(@variant; $ty_name; 0; $($variant $(= $value)?,)+);
316+
c_enum! {
317+
@variant;
318+
ty: $ty_name;
319+
default: 0;
320+
variants: [$($vis $variant $(= $value)?,)+]
321+
}
317322
};
318323

319324
// Matcher for a single anonymous enum
320325
(@single;
321326
$(#[repr($repr:ty)])?
322327
pub enum #anon {
323-
$($variant:ident $(= $value:expr)?,)+
328+
$($vis:vis $variant:ident $(= $value:expr)?,)+
324329
}
325330
) => {
326-
c_enum!(@variant; c_enum!(@ty $($repr)?); 0; $($variant $(= $value)?,)+);
331+
c_enum! {
332+
@variant;
333+
ty: c_enum!(@ty $($repr)?);
334+
default: 0;
335+
variants: [$($vis $variant $(= $value)?,)+]
336+
}
327337
};
328338

329-
// Matcher for a single variant
330-
(@variant; $_ty_name:ty; $_idx:expr;) => { /* end of the chain */ };
339+
// Matcher for variants: eats a single variant then recurses with the rest
340+
(@variant; ty: $_ty_name:ty; default: $_idx:expr; variants: []) => { /* end of the chain */ };
331341
(
332-
@variant; $ty_name:ty; $default_val:expr;
333-
$variant:ident $(= $value:expr)?,
334-
$($tail:tt)*
342+
@variant;
343+
ty: $ty_name:ty;
344+
default: $default_val:expr;
345+
variants: [
346+
$vis:vis $variant:ident $(= $value:expr)?,
347+
$($tail:tt)*
348+
]
335349
) => {
336-
pub const $variant: $ty_name = {
350+
$vis const $variant: $ty_name = {
337351
#[allow(unused_variables)]
338352
let r = $default_val;
339353
$(let r = $value;)?
@@ -342,7 +356,12 @@ macro_rules! c_enum {
342356

343357
// The next value is always one more than the previous value, unless
344358
// set explicitly.
345-
c_enum!(@variant; $ty_name; $variant + 1; $($tail)*);
359+
c_enum! {
360+
@variant;
361+
ty: $ty_name;
362+
default: $variant + 1;
363+
variants: [$($tail)*]
364+
}
346365
};
347366

348367
// Use a specific type if provided, otherwise default to `CEnumRepr`
@@ -505,6 +524,40 @@ mod tests {
505524
assert_eq!(VAR4_1, 4 as CEnumRepr);
506525
}
507526

527+
#[test]
528+
fn c_enum_vis() {
529+
mod priv1 {
530+
c_enum! {
531+
#[repr(u8)]
532+
pub enum e1 {
533+
PRIV_ON_1 = 10,
534+
// Variant should still be usable within its visibility
535+
pub PUB1 = PRIV_ON_1 * 2,
536+
}
537+
}
538+
}
539+
mod priv2 {
540+
c_enum! {
541+
#[repr(u16)]
542+
pub enum e2 {
543+
pub PRIV_ON_1 = 42,
544+
pub PUB2 = PRIV_ON_1 * 2,
545+
}
546+
}
547+
}
548+
549+
use priv1::*;
550+
use priv2::*;
551+
552+
assert_eq!(TypeId::of::<e1>(), TypeId::of::<u8>());
553+
assert_eq!(TypeId::of::<e2>(), TypeId::of::<u16>());
554+
assert_eq!(PUB1, 10u8 * 2);
555+
assert_eq!(PUB2, 42u16 * 2);
556+
// Verify that the default is private. If `PRIV_ON_1` was actually public in `priv1`, this
557+
// would be an ambiguous import and/or type mismatch error.
558+
assert_eq!(PRIV_ON_1, 42u16);
559+
}
560+
508561
fn type_id_of_val<T: 'static>(_: &T) -> TypeId {
509562
TypeId::of::<T>()
510563
}

src/new/apple/libpthread/pthread_/introspection.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ pub use crate::pthread_::pthread::*;
88
c_enum! {
99
#[repr(c_uint)]
1010
pub enum #anon {
11-
PTHREAD_INTROSPECTION_THREAD_CREATE = 1,
12-
PTHREAD_INTROSPECTION_THREAD_START,
13-
PTHREAD_INTROSPECTION_THREAD_TERMINATE,
14-
PTHREAD_INTROSPECTION_THREAD_DESTROY,
11+
pub PTHREAD_INTROSPECTION_THREAD_CREATE = 1,
12+
pub PTHREAD_INTROSPECTION_THREAD_START,
13+
pub PTHREAD_INTROSPECTION_THREAD_TERMINATE,
14+
pub PTHREAD_INTROSPECTION_THREAD_DESTROY,
1515
}
1616
}
1717

src/new/apple/libpthread/sys/qos.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
c_enum! {
66
#[repr(u32)]
77
pub enum qos_class_t {
8-
QOS_CLASS_USER_INTERACTIVE = 0x21,
9-
QOS_CLASS_USER_INITIATED = 0x19,
10-
QOS_CLASS_DEFAULT = 0x15,
11-
QOS_CLASS_UTILITY = 0x11,
12-
QOS_CLASS_BACKGROUND = 0x09,
13-
QOS_CLASS_UNSPECIFIED = 0x00,
8+
pub QOS_CLASS_USER_INTERACTIVE = 0x21,
9+
pub QOS_CLASS_USER_INITIATED = 0x19,
10+
pub QOS_CLASS_DEFAULT = 0x15,
11+
pub QOS_CLASS_UTILITY = 0x11,
12+
pub QOS_CLASS_BACKGROUND = 0x09,
13+
pub QOS_CLASS_UNSPECIFIED = 0x00,
1414
}
1515
}

src/new/linux_uapi/linux/can/bcm.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,18 @@ s! {
2323
c_enum! {
2424
#[repr(u32)]
2525
pub enum #anon {
26-
TX_SETUP = 1,
27-
TX_DELETE,
28-
TX_READ,
29-
TX_SEND,
30-
RX_SETUP,
31-
RX_DELETE,
32-
RX_READ,
33-
TX_STATUS,
34-
TX_EXPIRED,
35-
RX_STATUS,
36-
RX_TIMEOUT,
37-
RX_CHANGED,
26+
pub TX_SETUP = 1,
27+
pub TX_DELETE,
28+
pub TX_READ,
29+
pub TX_SEND,
30+
pub RX_SETUP,
31+
pub RX_DELETE,
32+
pub RX_READ,
33+
pub TX_STATUS,
34+
pub TX_EXPIRED,
35+
pub RX_STATUS,
36+
pub RX_TIMEOUT,
37+
pub RX_CHANGED,
3838
}
3939
}
4040

src/unix/aix/mod.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,17 +65,17 @@ pub type iconv_t = *mut c_void;
6565
c_enum! {
6666
#[repr(u32)]
6767
pub enum uio_rw {
68-
UIO_READ = 0,
69-
UIO_WRITE,
70-
UIO_READ_NO_MOVE,
71-
UIO_WRITE_NO_MOVE,
72-
UIO_PWRITE,
68+
pub UIO_READ = 0,
69+
pub UIO_WRITE,
70+
pub UIO_READ_NO_MOVE,
71+
pub UIO_WRITE_NO_MOVE,
72+
pub UIO_PWRITE,
7373
}
7474

7575
#[repr(u32)]
7676
pub enum ACTION {
77-
FIND = 0,
78-
ENTER,
77+
pub FIND = 0,
78+
pub ENTER,
7979
}
8080
}
8181

src/unix/bsd/apple/mod.rs

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -182,39 +182,39 @@ extern_ty! {
182182
c_enum! {
183183
#[repr(u32)]
184184
pub enum sysdir_search_path_directory_t {
185-
SYSDIR_DIRECTORY_APPLICATION = 1,
186-
SYSDIR_DIRECTORY_DEMO_APPLICATION = 2,
187-
SYSDIR_DIRECTORY_DEVELOPER_APPLICATION = 3,
188-
SYSDIR_DIRECTORY_ADMIN_APPLICATION = 4,
189-
SYSDIR_DIRECTORY_LIBRARY = 5,
190-
SYSDIR_DIRECTORY_DEVELOPER = 6,
191-
SYSDIR_DIRECTORY_USER = 7,
192-
SYSDIR_DIRECTORY_DOCUMENTATION = 8,
193-
SYSDIR_DIRECTORY_DOCUMENT = 9,
194-
SYSDIR_DIRECTORY_CORESERVICE = 10,
195-
SYSDIR_DIRECTORY_AUTOSAVED_INFORMATION = 11,
196-
SYSDIR_DIRECTORY_DESKTOP = 12,
197-
SYSDIR_DIRECTORY_CACHES = 13,
198-
SYSDIR_DIRECTORY_APPLICATION_SUPPORT = 14,
199-
SYSDIR_DIRECTORY_DOWNLOADS = 15,
200-
SYSDIR_DIRECTORY_INPUT_METHODS = 16,
201-
SYSDIR_DIRECTORY_MOVIES = 17,
202-
SYSDIR_DIRECTORY_MUSIC = 18,
203-
SYSDIR_DIRECTORY_PICTURES = 19,
204-
SYSDIR_DIRECTORY_PRINTER_DESCRIPTION = 20,
205-
SYSDIR_DIRECTORY_SHARED_PUBLIC = 21,
206-
SYSDIR_DIRECTORY_PREFERENCE_PANES = 22,
207-
SYSDIR_DIRECTORY_ALL_APPLICATIONS = 100,
208-
SYSDIR_DIRECTORY_ALL_LIBRARIES = 101,
185+
pub SYSDIR_DIRECTORY_APPLICATION = 1,
186+
pub SYSDIR_DIRECTORY_DEMO_APPLICATION = 2,
187+
pub SYSDIR_DIRECTORY_DEVELOPER_APPLICATION = 3,
188+
pub SYSDIR_DIRECTORY_ADMIN_APPLICATION = 4,
189+
pub SYSDIR_DIRECTORY_LIBRARY = 5,
190+
pub SYSDIR_DIRECTORY_DEVELOPER = 6,
191+
pub SYSDIR_DIRECTORY_USER = 7,
192+
pub SYSDIR_DIRECTORY_DOCUMENTATION = 8,
193+
pub SYSDIR_DIRECTORY_DOCUMENT = 9,
194+
pub SYSDIR_DIRECTORY_CORESERVICE = 10,
195+
pub SYSDIR_DIRECTORY_AUTOSAVED_INFORMATION = 11,
196+
pub SYSDIR_DIRECTORY_DESKTOP = 12,
197+
pub SYSDIR_DIRECTORY_CACHES = 13,
198+
pub SYSDIR_DIRECTORY_APPLICATION_SUPPORT = 14,
199+
pub SYSDIR_DIRECTORY_DOWNLOADS = 15,
200+
pub SYSDIR_DIRECTORY_INPUT_METHODS = 16,
201+
pub SYSDIR_DIRECTORY_MOVIES = 17,
202+
pub SYSDIR_DIRECTORY_MUSIC = 18,
203+
pub SYSDIR_DIRECTORY_PICTURES = 19,
204+
pub SYSDIR_DIRECTORY_PRINTER_DESCRIPTION = 20,
205+
pub SYSDIR_DIRECTORY_SHARED_PUBLIC = 21,
206+
pub SYSDIR_DIRECTORY_PREFERENCE_PANES = 22,
207+
pub SYSDIR_DIRECTORY_ALL_APPLICATIONS = 100,
208+
pub SYSDIR_DIRECTORY_ALL_LIBRARIES = 101,
209209
}
210210

211211
#[repr(u32)]
212212
pub enum sysdir_search_path_domain_mask_t {
213-
SYSDIR_DOMAIN_MASK_USER = 1 << 0,
214-
SYSDIR_DOMAIN_MASK_LOCAL = 1 << 1,
215-
SYSDIR_DOMAIN_MASK_NETWORK = 1 << 2,
216-
SYSDIR_DOMAIN_MASK_SYSTEM = 1 << 3,
217-
SYSDIR_DOMAIN_MASK_ALL = 0x0ffff,
213+
pub SYSDIR_DOMAIN_MASK_USER = 1 << 0,
214+
pub SYSDIR_DOMAIN_MASK_LOCAL = 1 << 1,
215+
pub SYSDIR_DOMAIN_MASK_NETWORK = 1 << 2,
216+
pub SYSDIR_DOMAIN_MASK_SYSTEM = 1 << 3,
217+
pub SYSDIR_DOMAIN_MASK_ALL = 0x0ffff,
218218
}
219219
}
220220

src/unix/bsd/freebsdlike/dragonfly/mod.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,18 @@ extern_ty! {
5555
c_enum! {
5656
#[repr(u32)]
5757
pub enum lwpstat {
58-
LSRUN = 1,
59-
LSSTOP = 2,
60-
LSSLEEP = 3,
58+
pub LSRUN = 1,
59+
pub LSSTOP = 2,
60+
pub LSSLEEP = 3,
6161
}
6262

6363
#[repr(u32)]
6464
pub enum procstat {
65-
SIDL = 1,
66-
SACTIVE = 2,
67-
SSTOP = 3,
68-
SZOMB = 4,
69-
SCORE = 5,
65+
pub SIDL = 1,
66+
pub SACTIVE = 2,
67+
pub SSTOP = 3,
68+
pub SZOMB = 4,
69+
pub SCORE = 5,
7070
}
7171
}
7272

0 commit comments

Comments
 (0)