Advertisement
Guest User

Spirit2 test: OSM bounds

a guest
May 2nd, 2010
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.86 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <windows.h>
  3. #include <boost/config/warning_disable.hpp>
  4. #include <boost/spirit/include/qi.hpp>
  5. #include <stdio.h>
  6. #include <iostream>
  7. #include <fstream>
  8. #include <string>
  9.  
  10. namespace qi = boost::spirit::qi;
  11. namespace ascii = boost::spirit::ascii;
  12.  
  13. double minlat = 1000;
  14. double maxlat = -1000;
  15. double minlon = 1000;
  16. double maxlon = -1000;
  17.  
  18. #define min(a, b)  (((a) < (b)) ? (a) : (b))
  19. #define max(a, b)  (((a) > (b)) ? (a) : (b))
  20.  
  21. void update_lat(double lat)
  22. {
  23.     minlat = min(lat, minlat);
  24.     maxlat = max(lat, maxlat);
  25. }
  26.  
  27. void update_lon(double lon)
  28. {
  29.     minlon = min(lon, minlon);
  30.     maxlon = max(lon, maxlon);
  31. }
  32.  
  33. template <typename Iterator>
  34. struct osm_parser : qi::grammar<Iterator>
  35. {
  36.         osm_parser() : osm_parser::base_type(start)
  37.         {
  38.             using qi::lit;
  39.             using qi::double_;
  40.             using qi::lexeme;
  41.             using ascii::char_;
  42.             using qi::lower;
  43.             p_anychar = char_('\x80','\x7F');
  44.             p_lat = "lat=\"" >> double_ [&update_lat] >> '"';
  45.             p_lon = "lon=\"" >> double_ [&update_lon] >> '"';
  46.             p_param = +lower >> "=\"" >> +(p_anychar - '"') >> '"';
  47.             p_ws = *(' ' | lit('\n') | '\t');
  48.             p_until_node_closed = "</node>" | (p_anychar >> p_until_node_closed);
  49.             p_endnode = "/>" | p_until_node_closed;
  50.             p_node_param = p_lat | p_lon | p_param;
  51.             p_node = "<node" >> *(p_ws >> p_node_param) >> p_endnode;
  52.             p_tag = '<' >> *(p_anychar - '>') >> '>';
  53.             start = *((p_node | p_tag) >> p_ws);            
  54.         }
  55.  
  56.         qi::rule<Iterator> p_lat, p_lon, p_ws, p_until_node_closed, p_endnode, p_node_param;
  57.         qi::rule<Iterator> p_param, p_node, p_tag, p_anychar, start;
  58. };
  59.  
  60. int _tmain(int argc, _TCHAR* argv[])
  61. {
  62.     if (argc < 2)
  63.     {
  64.         std::cerr << "Usage: bounds osmfile" << std::endl;
  65.         return 1;
  66.     }
  67.     std::ifstream f(argv[1]);
  68.     f.seekg(0, std::ios::end);
  69.     size_t size = f.tellg();
  70.     std::string storage(size, ' ');
  71.     f.seekg(0);
  72.     f.read(&storage[0], size);
  73.  
  74.     typedef std::string::const_iterator iterator_type;
  75.     osm_parser<iterator_type> p_osm;
  76.     std::string::const_iterator iter = storage.begin();
  77.     std::string::const_iterator end = storage.end();
  78.     LARGE_INTEGER t0, t1, fr;
  79.     QueryPerformanceCounter(&t0);
  80.     bool r = parse(iter, end, p_osm);
  81.     QueryPerformanceCounter(&t1);
  82.     QueryPerformanceFrequency(&fr);
  83.     double t = (double)(t1.QuadPart - t0.QuadPart) / (double)fr.QuadPart;
  84.  
  85.     if (r && iter == end)
  86.     {
  87.         printf("Ok. lat=%lf..%lf lon=%lf..%lf\ntime=%lf\n", minlat, maxlat, minlon, maxlon, t);
  88.     }
  89.     else
  90.     {
  91.         std::cout << "\nParsing failed:\n";
  92.         int n=30;
  93.         while(iter != end && n-->0)
  94.             std::cout << *iter++;
  95.     }
  96.     return 0;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement