SVD_to_D: Generate over 100k lines of highly-optimized microcontroller mmapped-IO code in the blink of an eye

Adam D. Ruppe via Digitalmars-d-announce digitalmars-d-announce at puremagic.com
Tue Aug 1 18:03:26 PDT 2017


On Wednesday, 2 August 2017 at 00:39:24 UTC, Mike wrote:
> Looking at your code though, I probably should have used Adam's 
> dom.d too; std.xml was weird to say the least.

There's a couple functions in dom.d too that might have 
simplified this:

foreach(EnumsTop; Flds.getElementsByTagName("enumeratedValues")){
	foreach(Enums; EnumsTop.getElementsByTagName("enumeratedValue")){
		foreach(child; Enums.childNodes){
			if(child.tagName=="description"){EnumV.description  = 
child.innerText();}
			if(child.tagName=="name"       ){EnumV.name         = 
child.innerText();}		
			if(child.tagName=="value"      ){EnumV.value        = 
child.innerText();}
		}


This pattern is used throughout, and it is pretty nice. Not 
saying it is wrong!

But that could prolly be written:

foreach(Enums; Flds.querySelectorAll("enumeratedValues > 
enumeratedValue")) {
     EnumV.description  = 
Enum.optionSelector("description").innerText();
     EnumV.name  = Enum.optionSelector("name").innerText();
     EnumV.value  = Enum.optionSelector("value").innerText();
}




The various *selector functions do CSS selector syntax. 
querySelector/querySelectorAll returns the first/all matching 
element, or null if none. requireSelector returns the first 
matching, or throws exception if there is none. optionSelector 
returns a wrapper object that is never null so you can call its 
methods, but they return null if it was.

Meaning you don't have to explicitly check presence, the 
.innerText just returns the null string if the element wasn't 
there.


The idea of these is to make navigating xml like this a bit more 
convenient.


More information about the Digitalmars-d-announce mailing list