summaryrefslogtreecommitdiff
path: root/benchmarks/quick-xml/src/count_highway_crossings.rs
diff options
context:
space:
mode:
Diffstat (limited to 'benchmarks/quick-xml/src/count_highway_crossings.rs')
-rw-r--r--benchmarks/quick-xml/src/count_highway_crossings.rs74
1 files changed, 74 insertions, 0 deletions
diff --git a/benchmarks/quick-xml/src/count_highway_crossings.rs b/benchmarks/quick-xml/src/count_highway_crossings.rs
new file mode 100644
index 0000000..9b68142
--- /dev/null
+++ b/benchmarks/quick-xml/src/count_highway_crossings.rs
@@ -0,0 +1,74 @@
+use quick_xml::events::Event;
+use quick_xml::Reader;
+
+pub fn count_highway_crossings(buffer: &[u8]) -> usize {
+ let mut reader = Reader::from_reader(buffer);
+ reader.config_mut().check_end_names = false;
+
+ let mut count = 0usize;
+ let mut in_node = false;
+
+ loop {
+ match reader.read_event() {
+ Ok(Event::Eof) => break,
+
+ Ok(Event::Start(e)) if e.name().as_ref() == b"node" => {
+ in_node = true;
+ }
+
+ Ok(Event::End(e)) if e.name().as_ref() == b"node" => {
+ in_node = false;
+ }
+
+ Ok(Event::Start(e)) | Ok(Event::Empty(e))
+ if in_node && e.name().as_ref() == b"tag" =>
+ {
+ let mut attrs = e.attributes();
+ if attrs.next().unwrap().unwrap().value.as_ref() == b"highway"
+ && attrs.next().unwrap().unwrap().value.as_ref() == b"crossing" {
+ count += 1;
+ }
+ }
+
+ Ok(_) => {}
+ Err(_) => break,
+ }
+ }
+
+ count
+}
+
+pub fn count_highway_crossings_cheat_and_early_out(buffer: &[u8]) -> usize {
+ let mut reader = Reader::from_reader(buffer);
+ reader.config_mut().check_end_names = false;
+
+ let mut count = 0usize;
+
+ loop {
+ match reader.read_event() {
+ Ok(Event::Eof) => break,
+
+ Ok(Event::Start(e)) | Ok(Event::Empty(e))
+ if e.name().as_ref() == b"tag" =>
+ {
+ let mut attrs = e.attributes();
+ if attrs.next().unwrap().unwrap().value.as_ref() == b"highway"
+ && attrs.next().unwrap().unwrap().value.as_ref() == b"crossing" {
+ count += 1;
+ }
+ }
+
+ Ok(Event::Start(e)) | Ok(Event::Empty(e))
+ if e.name().as_ref() == b"way" =>
+ {
+ break;
+ }
+
+ Ok(_) => {}
+ Err(_) => break,
+ }
+ }
+
+ count
+}
+