appsystem.cpp (4127B)
1 #include "appsystem.hpp" 2 3 AppSystem::AppSystem() {errlog.fclear();} 4 5 AppSystem::~AppSystem() 6 { 7 dealloc<App>(apps); 8 dealloc<Manufacturer>(manfs); 9 } 10 11 /* 12 * Adds a new App object to the apps vector in case it doesn't already exist. 13 * If it exists, an error is written to the error log. 14 */ 15 AppSystem& 16 AppSystem::operator+= (App *app) 17 { 18 if (!exists<App>(apps, app)) apps.push_back(app); 19 else errlog.write("App: " + std::string(app->get_serialnum()) + 20 ": exists already"); 21 return *this; 22 } 23 24 /* Same as above, but for a Manufacturer object */ 25 AppSystem& 26 AppSystem::operator+= (Manufacturer *manf) 27 { 28 if (!exists<Manufacturer>(manfs, manf)) manfs.push_back(manf); 29 else errlog.write("Manufacturer: " + std::string(manf->get_serialnum()) + 30 ": exists already"); 31 return *this; 32 } 33 34 /* 35 * Parses a given file containing file extensions for an Office object 36 * which are formatted as: .ext1|.ext2|. 37 * Using STL's sstream we can extract each extension as a substring 38 * by setting the delimeter to | and then push them back to 39 * a vector which contains each extension. 40 */ 41 const std::vector<std::string> 42 AppSystem::parse_office_exts(std::ifstream& f) 43 { 44 std::vector<std::string> exts; 45 std::string ext; 46 std::getline(f, ext); 47 std::istringstream iss(ext); 48 while (std::getline(iss, ext, '|')) exts.push_back(ext); 49 return exts; 50 } 51 52 /* Writes file extensions to a file with the above format */ 53 void 54 AppSystem::write_office_exts(const Office *of, std::ofstream& f) 55 { 56 std::vector<std::string> exts = of->get_exts(); 57 for (const auto& ext : exts) 58 f << ext << '|'; 59 } 60 61 /* 62 * Searches through the apps vector to see if a given Manufacturer 63 * object exists. If it does, it deletes every single app related 64 * to that manufacturer. 65 */ 66 void 67 AppSystem::removebad(const Manufacturer *manf) 68 { 69 auto lambda = [&](App *app) -> bool 70 { 71 Manufacturer m = app->get_manf(); 72 if (!std::strcmp(m.get_serialnum(), manf->get_serialnum())) 73 delete app; 74 return !std::strcmp(m.get_serialnum(), manf->get_serialnum()); 75 }; 76 apps.erase(std::remove_if(apps.begin(), apps.end(), lambda), apps.end()); 77 } 78 79 /* 80 * Same as above but this time we only pass the 81 * manufacturer's serial number 82 */ 83 void 84 AppSystem::removebad(const char *manfsn) 85 { 86 auto lambda = [&](App *app) -> bool 87 { 88 Manufacturer m = app->get_manf(); 89 if (!std::strcmp(m.get_serialnum(), manfsn)) 90 delete app; 91 return !std::strcmp(m.get_serialnum(), manfsn); 92 }; 93 apps.erase(std::remove_if(apps.begin(), apps.end(), lambda), apps.end()); 94 } 95 96 /* 97 * Returns a vector of Office objects whose prices are 0 (free). 98 * dynamic_cast is required in order to only take Office objects 99 * into account (the vector contains App objects). 100 */ 101 const std::vector<Office *> 102 AppSystem::get_freeapps() const 103 { 104 std::vector<Office *> fapps; 105 for (const auto& app : apps) 106 if (Office *o = dynamic_cast<Office *>(app)) 107 if (o->get_price() == 0) 108 fapps.push_back(o); 109 return fapps; 110 } 111 112 /* 113 * Returns a vector with all the Game objects that have an 114 * average rating bigger than 4. dynamic_cast is required 115 * for the same reason as above. 116 */ 117 const std::vector<Game *> 118 AppSystem::get_goodgames() const 119 { 120 std::vector<Game *> ggames; 121 for (const auto& app : apps) 122 { 123 if (Game *o = dynamic_cast<Game *>(app)) 124 { 125 std::vector<Review *> revs = o->get_revs(); 126 if (!revs.empty()) 127 { 128 int sum = 0, count = 0; 129 for (const auto& rev : revs) 130 { 131 sum += rev->get_stars(); 132 count++; 133 } 134 if (sum / count > 4) ggames.push_back(o); 135 } 136 } 137 } 138 return ggames; 139 } 140 141 const std::string 142 AppSystem::err_read(const char *fpath) 143 { 144 return "Error reading file \'" + std::string(fpath) + "\'."; 145 } 146 147 const std::string 148 AppSystem::err_write(const char *fpath) 149 { 150 return "Error writing to file \'" + std::string(fpath) + "\'."; 151 }