@@ -32,7 +32,7 @@ use self::xml::reader::XmlEvent;
32
32
#[ derive( Copy , Clone , PartialEq , Eq ) ]
33
33
pub enum Api { Gl , Glx , Wgl , Egl , GlCore , Gles1 , Gles2 }
34
34
35
- #[ derive( Copy , Clone ) ]
35
+ #[ derive( Copy , Clone , PartialEq , Eq ) ]
36
36
pub enum Fallbacks { All , None }
37
37
38
38
impl FromStr for Api {
@@ -107,7 +107,7 @@ pub struct Registry {
107
107
108
108
impl Registry {
109
109
/// Generate a registry from the supplied XML string
110
- pub fn from_xml < R : io:: Read > ( data : R , api : Api , filter : Option < Filter > ) -> Registry {
110
+ pub fn from_xml < R : io:: Read > ( data : R , api : Api , filter : Filter ) -> Registry {
111
111
use std:: io:: BufReader ;
112
112
let data = BufReader :: new ( data) ;
113
113
@@ -262,7 +262,7 @@ pub struct GlxOpcode {
262
262
263
263
struct RegistryBuilder < R : io:: Read > {
264
264
pub api : Api ,
265
- pub filter : Option < Filter > ,
265
+ pub filter : Filter ,
266
266
pub reader : XmlEventReader < R > ,
267
267
}
268
268
@@ -380,85 +380,78 @@ impl<R: io::Read> RegistryBuilder<R> {
380
380
}
381
381
}
382
382
383
- match self . filter {
384
- Some ( ref filter) => {
385
- let Registry { api, enums, cmds, aliases, features : feats, extensions : exts } = registry;
386
- let mut desired_enums = HashSet :: new ( ) ;
387
- let mut desired_cmds = HashSet :: new ( ) ;
388
-
389
- // find the features we want
390
- let mut found_feat = false ;
391
- for f in feats. iter ( ) {
392
- // XXX: verify that the string comparison with <= actually works as desired
393
- if f. api == filter. api && f. number <= filter. version {
394
- for req in f. requires . iter ( ) {
395
- desired_enums. extend ( req. enums . iter ( ) . map ( |x| x. clone ( ) ) ) ;
396
- desired_cmds. extend ( req. commands . iter ( ) . map ( |x| x. clone ( ) ) ) ;
397
- }
398
- }
399
- if f. number == filter. version {
400
- found_feat = true ;
401
- }
383
+ let Registry { api, enums, cmds, aliases, features : feats, extensions : exts } = registry;
384
+ let mut desired_enums = HashSet :: new ( ) ;
385
+ let mut desired_cmds = HashSet :: new ( ) ;
386
+
387
+ // find the features we want
388
+ let mut found_feat = false ;
389
+ for f in feats. iter ( ) {
390
+ // XXX: verify that the string comparison with <= actually works as desired
391
+ if f. api == self . filter . api && f. number <= self . filter . version {
392
+ for req in f. requires . iter ( ) {
393
+ desired_enums. extend ( req. enums . iter ( ) . map ( |x| x. clone ( ) ) ) ;
394
+ desired_cmds. extend ( req. commands . iter ( ) . map ( |x| x. clone ( ) ) ) ;
402
395
}
396
+ }
397
+ if f. number == self . filter . version {
398
+ found_feat = true ;
399
+ }
400
+ }
403
401
404
- // remove the things that should be removed
405
- for f in feats. iter ( ) {
406
- // XXX: verify that the string comparison with <= actually works as desired
407
- if f. api == filter. api && f. number <= filter. version {
408
- for rem in f. removes . iter ( ) {
409
- if rem. profile == filter. profile {
410
- for enm in rem. enums . iter ( ) {
411
- debug ! ( "Removing {}" , enm) ;
412
- desired_enums. remove ( enm) ;
413
- }
414
- for cmd in rem. commands . iter ( ) {
415
- debug ! ( "Removing {}" , cmd) ;
416
- desired_cmds. remove ( cmd) ;
417
- }
418
- }
402
+ // remove the things that should be removed
403
+ for f in feats. iter ( ) {
404
+ // XXX: verify that the string comparison with <= actually works as desired
405
+ if f. api == self . filter . api && f. number <= self . filter . version {
406
+ for rem in f. removes . iter ( ) {
407
+ if rem. profile == self . filter . profile {
408
+ for enm in rem. enums . iter ( ) {
409
+ debug ! ( "Removing {}" , enm) ;
410
+ desired_enums. remove ( enm) ;
411
+ }
412
+ for cmd in rem. commands . iter ( ) {
413
+ debug ! ( "Removing {}" , cmd) ;
414
+ desired_cmds. remove ( cmd) ;
419
415
}
420
416
}
421
417
}
418
+ }
419
+ }
422
420
423
- if !found_feat {
424
- panic ! ( "Did not find version {} in the registry" , filter. version) ;
425
- }
421
+ if !found_feat {
422
+ panic ! ( "Did not find version {} in the registry" , self . filter. version) ;
423
+ }
426
424
427
- for ext in exts. iter ( ) {
428
- if filter. extensions . iter ( ) . any ( |x| x == & ext. name ) {
429
- if !ext. supported . iter ( ) . any ( |x| x == & filter. api ) {
430
- panic ! ( "Requested {}, which doesn't support the {} API" , ext. name, filter. api) ;
431
- }
432
- for req in ext. requires . iter ( ) {
433
- desired_enums. extend ( req. enums . iter ( ) . map ( |x| x. clone ( ) ) ) ;
434
- desired_cmds. extend ( req. commands . iter ( ) . map ( |x| x. clone ( ) ) ) ;
435
- }
436
- }
425
+ for ext in exts. iter ( ) {
426
+ if self . filter . extensions . iter ( ) . any ( |x| x == & ext. name ) {
427
+ if !ext. supported . iter ( ) . any ( |x| x == & self . filter . api ) {
428
+ panic ! ( "Requested {}, which doesn't support the {} API" , ext. name, self . filter. api) ;
437
429
}
438
-
439
- let aliases = if let & Filter { fallbacks : Fallbacks :: None , ..} = filter { HashMap :: new ( ) } else { aliases } ;
440
-
441
- Registry {
442
- api : api,
443
- enums : enums. into_iter ( ) . filter ( |e| {
444
- desired_enums. contains ( & ( "GL_" . to_string ( ) + & e. ident ) ) ||
445
- desired_enums. contains ( & ( "WGL_" . to_string ( ) + & e. ident ) ) ||
446
- desired_enums. contains ( & ( "GLX_" . to_string ( ) + & e. ident ) ) ||
447
- desired_enums. contains ( & ( "EGL_" . to_string ( ) + & e. ident ) )
448
- } ) . collect :: < Vec < Enum > > ( ) ,
449
- cmds : cmds. into_iter ( ) . filter ( |c| {
450
- desired_cmds. contains ( & ( "gl" . to_string ( ) + & c. proto . ident ) ) ||
451
- desired_cmds. contains ( & ( "wgl" . to_string ( ) + & c. proto . ident ) ) ||
452
- desired_cmds. contains ( & ( "glX" . to_string ( ) + & c. proto . ident ) ) ||
453
- desired_cmds. contains ( & ( "egl" . to_string ( ) + & c. proto . ident ) )
454
- } ) . collect :: < Vec < Cmd > > ( ) ,
455
- // these aren't important after this step
456
- features : Vec :: new ( ) ,
457
- extensions : Vec :: new ( ) ,
458
- aliases : aliases,
430
+ for req in ext. requires . iter ( ) {
431
+ desired_enums. extend ( req. enums . iter ( ) . map ( |x| x. clone ( ) ) ) ;
432
+ desired_cmds. extend ( req. commands . iter ( ) . map ( |x| x. clone ( ) ) ) ;
459
433
}
460
- } ,
461
- None => registry
434
+ }
435
+ }
436
+
437
+ Registry {
438
+ api : api,
439
+ enums : enums. into_iter ( ) . filter ( |e| {
440
+ desired_enums. contains ( & ( "GL_" . to_string ( ) + & e. ident ) ) ||
441
+ desired_enums. contains ( & ( "WGL_" . to_string ( ) + & e. ident ) ) ||
442
+ desired_enums. contains ( & ( "GLX_" . to_string ( ) + & e. ident ) ) ||
443
+ desired_enums. contains ( & ( "EGL_" . to_string ( ) + & e. ident ) )
444
+ } ) . collect ( ) ,
445
+ cmds : cmds. into_iter ( ) . filter ( |c| {
446
+ desired_cmds. contains ( & ( "gl" . to_string ( ) + & c. proto . ident ) ) ||
447
+ desired_cmds. contains ( & ( "wgl" . to_string ( ) + & c. proto . ident ) ) ||
448
+ desired_cmds. contains ( & ( "glX" . to_string ( ) + & c. proto . ident ) ) ||
449
+ desired_cmds. contains ( & ( "egl" . to_string ( ) + & c. proto . ident ) )
450
+ } ) . collect ( ) ,
451
+ // these aren't important after this step
452
+ features : Vec :: new ( ) ,
453
+ extensions : Vec :: new ( ) ,
454
+ aliases : if self . filter . fallbacks == Fallbacks :: None { HashMap :: new ( ) } else { aliases } ,
462
455
}
463
456
}
464
457
0 commit comments