Mercurial > minori
view dep/animia/src/strategist.cc @ 139:478f3b366199
dep/animia: separate lots of things, use base class for OS stuff
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Sun, 12 Nov 2023 16:43:07 -0500 |
parents | 28842a8d0c6b |
children | 1e696863b54c |
line wrap: on
line source
#include "animia/strategies.h" #include "animia/util.h" #include "animia/fd.h" #include "animia.h" #include <iostream> namespace animia::internal { class Strategist { public: Strategist(Result& result) : result_(result) {} bool ApplyStrategies(); private: bool AddMedia(const MediaInfo media_information); bool ApplyOpenFilesStrategy(); Result& result_; }; bool Strategist::ApplyStrategies() { bool success = false; for (const auto strategy : result_.player.strategies) { switch (strategy) { case Strategy::OpenFiles: success |= ApplyOpenFilesStrategy(); break; } } return success; } bool ApplyStrategies(std::vector<Result>& results) { bool success = false; for (auto& result : results) { Strategist strategist(result); success |= strategist.ApplyStrategies(); } return success; } //////////////////////////////////////////////////////////////////////////////// bool Strategist::ApplyOpenFilesStrategy() { bool success = false; const std::set<pid_t> pids{result_.process.pid}; std::vector<std::tuple<pid_t, std::string>> files; fd.EnumerateOpenFiles(pids, files); for (const auto& [pid, file] : files) { success |= AddMedia({MediaInfoType::File, file}); } return success; } //////////////////////////////////////////////////////////////////////////////// bool Strategist::AddMedia(const MediaInfo media_information) { if (media_information.value.empty()) return false; Media media; media.information.push_back(media_information); result_.media.push_back(std::move(media)); return true; } }