Advertisement
Guest User

Untitled

a guest
May 22nd, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.48 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <chrono>
  4. #include <memory>
  5. #include <string>
  6. #include <sstream>
  7. #include <algorithm>
  8.  
  9. #include <pugixml.hpp>
  10.  
  11. using namespace std;
  12. using namespace chrono;
  13. using namespace pugi;
  14.  
  15. struct Date {
  16.     int D, M, Y;
  17.     int h, m, s;
  18. };
  19.  
  20. void ParseDate(const char *sdate, Date &date) {
  21.     stringstream tmp(sdate);
  22.     tmp >> date.D;
  23.     tmp.get();
  24.     tmp >> date.M;
  25.     tmp.get();
  26.     tmp >> date.Y;
  27.     tmp.get();
  28.     tmp >> date.h;
  29.     tmp.get();
  30.     tmp >> date.m;
  31.     tmp.get();
  32.     tmp >> date.s;
  33. }
  34.  
  35. bool Compare(const Date &d1, const Date &d2) {
  36.     if (d1.Y < d2.Y)
  37.         return true;
  38.     if (d1.Y > d2.Y)
  39.         return false;
  40.     if (d1.M < d2.M)
  41.         return true;
  42.     if (d1.M > d2.M)
  43.         return false;
  44.     if (d1.D < d2.D)
  45.         return true;
  46.     if (d1.D > d2.D)
  47.         return false;
  48.     if (d1.h < d2.h)
  49.         return true;
  50.     if (d1.h > d2.h)
  51.         return false;
  52.     if (d1.m < d2.m)
  53.         return true;
  54.     if (d1.m > d2.m)
  55.         return false;
  56.     return d1.s <= d2.s;
  57. }
  58.  
  59. int main() {
  60.     xml_document doc;
  61.     auto result = doc.load_file("RequestsDB.xml");
  62.     if (!result) {
  63.         cout << "Cannot load xml\n";
  64.         return 1;
  65.     }
  66.     vector<pair<Date, xpath_node>> reqs;
  67.     {
  68.         auto tmpReqs = doc.child("DBModel").select_nodes("Requests");
  69.         reqs.reserve(tmpReqs.size());
  70.  
  71.         auto start = system_clock::now();
  72.  
  73.         for (auto &req : tmpReqs) {
  74.             auto sdate = req.node().child("Creation_Date").text().as_string();
  75.             Date date;
  76.             ParseDate(sdate, date);
  77.             reqs.emplace_back(pair{date, req});
  78.         }
  79.  
  80.         auto end = system_clock::now();
  81.         auto duration = duration_cast<milliseconds>(end - start).count();
  82.         auto secs = duration / 1000;
  83.         auto millis = duration % 1000;
  84.         cout << "Reqs count: " << reqs.size() << endl;
  85.         cout << "Fill reqs takes " << secs << "s" << millis << "ms" << endl;
  86.     }
  87.     {
  88.         auto start = system_clock::now();
  89.  
  90.         sort(reqs.begin(), reqs.end(), [](auto &r1, auto &r2) {
  91.             return Compare(r1.first, r2.first);
  92.         });
  93.  
  94.         auto end = system_clock::now();
  95.         auto duration = duration_cast<milliseconds>(end - start).count();
  96.         auto secs = duration / 1000;
  97.         auto millis = duration % 1000;
  98.         cout << "Sort reqs takes " << secs << "s" << millis << "ms" << endl;
  99.     }
  100.  
  101.     {
  102.         auto start = system_clock::now();
  103.  
  104.         xml_document newDoc;
  105.         //<DBModel xmlns="http://tempuri.org/DBModel.xsd">
  106.         auto parentNode = newDoc.append_child("DBModel");
  107.         auto attribute = parentNode.append_attribute("xmlns");
  108.         attribute.set_value("http://tempuri.org/DBModel.xsd");
  109.         size_t position{1};
  110.         for (auto &req : reqs) {
  111.             auto newNode = parentNode.append_copy(req.second.node());
  112.             newNode.child("Id").text() = to_string(position++).c_str();
  113.         }
  114.         newDoc.save_file("RequestsDB_new.xml");
  115.  
  116.         auto end = system_clock::now();
  117.         auto duration = duration_cast<milliseconds>(end - start).count();
  118.         auto secs = duration / 1000;
  119.         auto millis = duration % 1000;
  120.         cout << "Create doc takes " << secs << "s" << millis << "ms" << endl;
  121.     }
  122.  
  123.     vector<size_t> ids;
  124.     ids.reserve(reqs.size());
  125.     for (auto &req : reqs)
  126.         ids.emplace_back(req.second.node().child("Id").text().as_int());
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement