Digitalisierte Elektroverteilung zur permanenten Verbraucherüberwachung
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DataModel.cpp 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include "DataModel.h"
  2. #include "instreamOperator.h"
  3. #include <fstream>
  4. #include <filesystem>
  5. #include <charconv>
  6. #include <ranges>
  7. #include <mutex>
  8. //Initialization of static member
  9. std::unique_ptr<DataModel> DataModel::instance = nullptr;
  10. //Read file locker
  11. std::timed_mutex accessFilesMTX;
  12. inline void DataModel::Create() {
  13. instance = std::make_unique<DataModel>();
  14. }
  15. std::unique_ptr<DataModel>& DataModel::Instance() {
  16. if (!instance)
  17. Create();
  18. return instance;
  19. }
  20. inline void DataModel::Destroy() {
  21. if (instance)
  22. instance.reset();
  23. }
  24. std::ostream& operator<<(std::ostream& os, const PublisherType type) {
  25. switch (type) {
  26. case PublisherType::RCMS_BENDER:
  27. os << "Bender RCMS";
  28. break;
  29. case PublisherType::POWERCENTER:
  30. os << "Siemens Powercenter";
  31. break;
  32. default:
  33. os << "<Unknown Publisher Type>";
  34. break;
  35. }
  36. return os;
  37. }
  38. void DataModel::savePublishedData(PublisherData data)
  39. {
  40. auto iter = savedPublishedData.find(data.getID());
  41. if (iter != savedPublishedData.end()) {
  42. iter->second.push_back(data);
  43. }
  44. else {
  45. std::vector<PublisherData> test{ data };
  46. savedPublishedData.emplace(data.getID(), test);
  47. }
  48. }
  49. std::istream& operator>>(std::istream& is, char const* pat);
  50. //Deserialize dataModel object
  51. std::istream& operator>>(std::istream& is, DataModel& dataModel) {
  52. char a;
  53. //Prase header
  54. unsigned long long startTime;
  55. unsigned int interval;
  56. is >> startTime >> "," >> interval;
  57. //remove return
  58. is.get();
  59. //Parse Body
  60. while (( a = is.peek()) != EOF) {
  61. unsigned int id;
  62. is >> id >> ":";
  63. try {
  64. std::vector<PublisherData> values;
  65. while (is.peek() != '\n') {
  66. PublisherData data;
  67. is >> data;
  68. data.setID(id);
  69. values.push_back(data);
  70. }
  71. is.get();
  72. auto iter = dataModel.savedPublishedData.find(id);
  73. if (iter == dataModel.savedPublishedData.end()) {
  74. dataModel.savedPublishedData.emplace(id, values);
  75. }
  76. else {
  77. for (auto& v : values)
  78. {
  79. iter->second.push_back(v);
  80. }
  81. }
  82. }
  83. catch (std::exception& e) { std::cout << e.what(); }
  84. }
  85. return is;
  86. }