@@ -1115,6 +1115,179 @@ fn test_enum_with_funcs() {
1115
1115
run_test ( cxx, hdr, rs, & [ "Bob" , "give_bob" ] , & [ ] ) ;
1116
1116
}
1117
1117
1118
+ #[ test]
1119
+ fn test_bitfield_enum ( ) {
1120
+ let hdr = indoc ! { "
1121
+ #include <cstdint>
1122
+ enum SomeFlags : int {
1123
+ FLAG_A = 1 << 0, // 0x1
1124
+ FLAG_B = 1 << 2, // 0x4
1125
+ FLAG_C = FLAG_A | FLAG_B, // 0x5
1126
+ };
1127
+ " } ;
1128
+ let hexathorpe = Token ! [ #] ( Span :: call_site ( ) ) ;
1129
+ let rs = quote ! {
1130
+ use autocxx:: prelude:: * ;
1131
+ include_cpp! {
1132
+ #hexathorpe include "input.h"
1133
+ safety!( unsafe_ffi)
1134
+ enum_style!( BitfieldEnum , "SomeFlags" )
1135
+ generate_pod!( "SomeFlags" )
1136
+ }
1137
+
1138
+ fn main( ) {
1139
+ let a = ffi:: SomeFlags :: FLAG_A ;
1140
+ let b = ffi:: SomeFlags :: FLAG_B ;
1141
+ let c = ffi:: SomeFlags :: FLAG_C ;
1142
+ assert_eq!( a. 0 , 0x1 ) ;
1143
+ assert_eq!( b. 0 , 0x4 ) ;
1144
+ assert_eq!( c. 0 , 0x5 ) ;
1145
+
1146
+ let aob = ffi:: SomeFlags :: FLAG_A | ffi:: SomeFlags :: FLAG_B ;
1147
+ assert_eq!( aob. 0 , 0x5 ) ;
1148
+ assert_eq!( aob. 0 , ffi:: SomeFlags :: FLAG_C . 0 ) ;
1149
+
1150
+ let anb = ffi:: SomeFlags :: FLAG_A & ffi:: SomeFlags :: FLAG_B ;
1151
+ assert_eq!( anb. 0 , 0x0 ) ;
1152
+ }
1153
+ } ;
1154
+ do_run_test_manual ( "" , hdr, rs, None , None ) . unwrap ( ) ;
1155
+ }
1156
+
1157
+ #[ test]
1158
+ fn test_newtype_enum ( ) {
1159
+ let hdr = indoc ! { "
1160
+ #include <cstdint>
1161
+ enum SomeFlags : int {
1162
+ FLAG_A = 1 << 0, // 0x1
1163
+ FLAG_B = 1 << 2, // 0x4
1164
+ FLAG_C = FLAG_A | FLAG_B, // 0x5
1165
+ };
1166
+ " } ;
1167
+ let hexathorpe = Token ! [ #] ( Span :: call_site ( ) ) ;
1168
+ let rs = quote ! {
1169
+ use autocxx:: prelude:: * ;
1170
+ include_cpp! {
1171
+ #hexathorpe include "input.h"
1172
+ safety!( unsafe_ffi)
1173
+ enum_style!( NewtypeEnum , "SomeFlags" )
1174
+ generate_pod!( "SomeFlags" )
1175
+ }
1176
+
1177
+ fn main( ) {
1178
+ let a = ffi:: SomeFlags :: FLAG_A ;
1179
+ let b = ffi:: SomeFlags :: FLAG_B ;
1180
+ let c = ffi:: SomeFlags :: FLAG_C ;
1181
+ assert_eq!( a. 0 , 0x1 ) ;
1182
+ assert_eq!( b. 0 , 0x4 ) ;
1183
+ assert_eq!( c. 0 , 0x5 ) ;
1184
+ }
1185
+ } ;
1186
+ do_run_test_manual ( "" , hdr, rs, None , None ) . unwrap ( ) ;
1187
+ }
1188
+
1189
+ #[ test]
1190
+ fn test_rustified_enum ( ) {
1191
+ let hdr = indoc ! { "
1192
+ enum Bob {
1193
+ BOB_VALUE_1,
1194
+ BOB_VALUE_2,
1195
+ };
1196
+ " } ;
1197
+ let hexathorpe = Token ! [ #] ( Span :: call_site ( ) ) ;
1198
+ let rs = quote ! {
1199
+ use autocxx:: prelude:: * ;
1200
+ include_cpp! {
1201
+ #hexathorpe include "input.h"
1202
+ safety!( unsafe_ffi)
1203
+ enum_style!( RustifiedEnum , "Bob" )
1204
+ generate_pod!( "Bob" )
1205
+ }
1206
+
1207
+ fn main( ) {
1208
+ let a = ffi:: Bob :: BOB_VALUE_1 ;
1209
+ let b = ffi:: Bob :: BOB_VALUE_2 ;
1210
+ assert!( a != b) ;
1211
+ }
1212
+ } ;
1213
+ do_run_test_manual ( "" , hdr, rs, None , None ) . unwrap ( ) ;
1214
+ }
1215
+
1216
+ #[ test]
1217
+ fn test_rustified_nonexhaustive_enum ( ) {
1218
+ let hdr = indoc ! { "
1219
+ enum Bob {
1220
+ BOB_VALUE_1,
1221
+ BOB_VALUE_2,
1222
+ };
1223
+ " } ;
1224
+ let hexathorpe = Token ! [ #] ( Span :: call_site ( ) ) ;
1225
+ let rs = quote ! {
1226
+ use autocxx:: prelude:: * ;
1227
+ include_cpp! {
1228
+ #hexathorpe include "input.h"
1229
+ safety!( unsafe_ffi)
1230
+ enum_style!( RustifiedEnum , "Bob" )
1231
+ generate_pod!( "Bob" )
1232
+ }
1233
+
1234
+ fn main( ) {
1235
+ let a = ffi:: Bob :: BOB_VALUE_1 ;
1236
+ let b = ffi:: Bob :: BOB_VALUE_2 ;
1237
+ assert!( a != b) ;
1238
+ }
1239
+ } ;
1240
+ do_run_test_manual ( "" , hdr, rs, None , None ) . unwrap ( ) ;
1241
+ }
1242
+
1243
+ #[ test]
1244
+ fn test_several_enums ( ) {
1245
+ let hdr = indoc ! { "
1246
+ enum First : int {
1247
+ FIRST_A = 5,
1248
+ FIRST_B = 6
1249
+ };
1250
+ enum Second {
1251
+ SECOND_A,
1252
+ SECOND_B
1253
+ };
1254
+ enum Default : int {
1255
+ DEFAULT_A = 1 << 1,
1256
+ DEFAULT_B = 1 << 3
1257
+ };
1258
+ enum Newtype {
1259
+ NEWTYPE_A,
1260
+ NEWTYPE_B
1261
+ };
1262
+ " } ;
1263
+ let hexathorpe = Token ! [ #] ( Span :: call_site ( ) ) ;
1264
+ let rs = quote ! {
1265
+ use autocxx:: prelude:: * ;
1266
+ include_cpp! {
1267
+ #hexathorpe include "input.h"
1268
+ safety!( unsafe_ffi)
1269
+ enum_style!( BitfieldEnum , "First" , "Second" )
1270
+ enum_style!( NewtypeEnum , "Newtype" )
1271
+ generate_pod!( "First" )
1272
+ generate_pod!( "Second" )
1273
+ generate_pod!( "Newtype" )
1274
+ generate!( "Default" )
1275
+ }
1276
+
1277
+ fn main( ) {
1278
+ let first_a = ffi:: First :: FIRST_A ;
1279
+ let first_b = ffi:: First :: FIRST_B ;
1280
+ assert_eq!( ( first_a & first_b) . 0 , 0x4 ) ;
1281
+ let second_a = ffi:: Second :: SECOND_A ;
1282
+ let second_b = ffi:: Second :: SECOND_B ;
1283
+ assert_eq!( ( second_a | second_b) . 0 , 0x1 ) ;
1284
+ assert!( ffi:: Default :: DEFAULT_A != ffi:: Default :: DEFAULT_B ) ;
1285
+ assert!( ffi:: Newtype :: NEWTYPE_A != ffi:: Newtype :: NEWTYPE_B ) ;
1286
+ }
1287
+ } ;
1288
+ do_run_test_manual ( "" , hdr, rs, None , None ) . unwrap ( ) ;
1289
+ }
1290
+
1118
1291
#[ test]
1119
1292
fn test_re_export ( ) {
1120
1293
let cxx = indoc ! { "
0 commit comments