AoC code coverage
Current view: top level - puzzles - Puzzle.cpp (source / functions) Coverage Total Hit
Test: master Lines: 50.8 % 65 33
Test Date: 2026-05-24 23:46:10 Functions: 98.8 % 321 317

            Line data    Source code
       1              : #include "Puzzle.h"
       2              : #include "InputDir.h"
       3              : #include "PuzzleImpl.h"
       4              : #include "StringUtils.h"
       5              : 
       6              : #include <libassert/assert.hpp>
       7              : 
       8              : #include <format>
       9              : #include <map>
      10              : #include <string>
      11              : #include <string_view>
      12              : 
      13        12246 : std::string const Puzzle::name() const { return std::format("{}_{}", year(), day()); }
      14              : 
      15              : using FactoryFunction = std::unique_ptr<Puzzle> (*)();
      16              : 
      17        12403 : static std::map<Puzzle::Year, std::map<Puzzle::Day, FactoryFunction>> &getFactoryFunctions() {
      18        12403 :   static std::map<Puzzle::Year, std::map<Puzzle::Day, FactoryFunction>> factoryFunctions;
      19        12403 :   return factoryFunctions;
      20        12403 : }
      21              : 
      22              : static bool registerConcretePuzzle(Puzzle::Year const y, Puzzle::Day const d,
      23        12246 :                                    FactoryFunction const f) noexcept {
      24        12246 :   auto &factoryFunctions = getFactoryFunctions();
      25              : 
      26        12246 :   auto [it, yearInserted] = factoryFunctions.try_emplace(y);
      27        12246 :   auto [it2, dayInserted] = it->second.emplace(d, f);
      28              : 
      29        12246 :   return dayInserted;
      30        12246 : }
      31              : 
      32        12246 : Puzzle::Puzzle(Year const year_, Day const day_) : _year(year_), _day(day_) {
      33        12246 :   auto const dir = std::filesystem::path(inputDir) / std::format("{:0>4}/{:0>2}", year_, day_);
      34        12246 :   _input = readFileAsString(dir / "Input.txt");
      35        12246 :   _solutionPart1 = readFileAsString(dir / "SolutionPart1.txt");
      36        12246 :   _solutionPart2 = readFileAsString(dir / "SolutionPart2.txt");
      37        12246 : }
      38              : 
      39              : template <int YEAR, unsigned DAY> class ConcretePuzzle final : public Puzzle {
      40              : public:
      41        12246 :   ConcretePuzzle() : Puzzle(Year(YEAR), Day(DAY)) {}
      42              : 
      43           78 :   [[nodiscard]] std::string runPart1(std::string_view const input) const final {
      44           78 :     return solvePart1<YEAR, DAY>(input);
      45           78 :   }
      46           78 :   [[nodiscard]] std::string runPart2(std::string_view const input) const final {
      47           78 :     return solvePart2<YEAR, DAY>(input);
      48           78 :   }
      49              : 
      50        12246 :   static std::unique_ptr<Puzzle> create() { return std::make_unique<ConcretePuzzle>(); }
      51              :   static inline bool const registered = registerConcretePuzzle(Year(YEAR), Day(DAY), create);
      52              : };
      53              : 
      54              : template class ConcretePuzzle<2015, 1>;
      55              : template class ConcretePuzzle<2015, 2>;
      56              : template class ConcretePuzzle<2015, 3>;
      57              : template class ConcretePuzzle<2015, 4>;
      58              : template class ConcretePuzzle<2015, 5>;
      59              : template class ConcretePuzzle<2015, 6>;
      60              : 
      61              : template class ConcretePuzzle<2019, 2>;
      62              : template class ConcretePuzzle<2019, 5>;
      63              : template class ConcretePuzzle<2019, 7>;
      64              : template class ConcretePuzzle<2019, 9>;
      65              : template class ConcretePuzzle<2019, 11>;
      66              : template class ConcretePuzzle<2019, 13>;
      67              : template class ConcretePuzzle<2019, 15>;
      68              : template class ConcretePuzzle<2019, 17>;
      69              : 
      70              : template class ConcretePuzzle<2022, 1>;
      71              : template class ConcretePuzzle<2022, 2>;
      72              : template class ConcretePuzzle<2022, 3>;
      73              : template class ConcretePuzzle<2022, 4>;
      74              : template class ConcretePuzzle<2022, 8>;
      75              : 
      76              : template class ConcretePuzzle<2023, 1>;
      77              : template class ConcretePuzzle<2023, 2>;
      78              : template class ConcretePuzzle<2023, 3>;
      79              : template class ConcretePuzzle<2023, 4>;
      80              : template class ConcretePuzzle<2023, 5>;
      81              : template class ConcretePuzzle<2023, 6>;
      82              : template class ConcretePuzzle<2023, 7>;
      83              : template class ConcretePuzzle<2023, 8>;
      84              : template class ConcretePuzzle<2023, 9>;
      85              : template class ConcretePuzzle<2023, 10>;
      86              : template class ConcretePuzzle<2023, 11>;
      87              : template class ConcretePuzzle<2023, 12>;
      88              : template class ConcretePuzzle<2023, 13>;
      89              : template class ConcretePuzzle<2023, 14>;
      90              : template class ConcretePuzzle<2023, 15>;
      91              : template class ConcretePuzzle<2023, 16>;
      92              : template class ConcretePuzzle<2023, 17>;
      93              : template class ConcretePuzzle<2023, 18>;
      94              : template class ConcretePuzzle<2023, 19>;
      95              : template class ConcretePuzzle<2023, 20>;
      96              : template class ConcretePuzzle<2023, 21>;
      97              : template class ConcretePuzzle<2023, 22>;
      98              : template class ConcretePuzzle<2023, 23>;
      99              : template class ConcretePuzzle<2023, 24>;
     100              : template class ConcretePuzzle<2023, 25>;
     101              : 
     102              : template class ConcretePuzzle<2024, 1>;
     103              : template class ConcretePuzzle<2024, 2>;
     104              : template class ConcretePuzzle<2024, 3>;
     105              : template class ConcretePuzzle<2024, 4>;
     106              : template class ConcretePuzzle<2024, 5>;
     107              : template class ConcretePuzzle<2024, 6>;
     108              : template class ConcretePuzzle<2024, 7>;
     109              : template class ConcretePuzzle<2024, 8>;
     110              : template class ConcretePuzzle<2024, 9>;
     111              : template class ConcretePuzzle<2024, 10>;
     112              : template class ConcretePuzzle<2024, 11>;
     113              : template class ConcretePuzzle<2024, 12>;
     114              : template class ConcretePuzzle<2024, 13>;
     115              : template class ConcretePuzzle<2024, 14>;
     116              : template class ConcretePuzzle<2024, 15>;
     117              : template class ConcretePuzzle<2024, 16>;
     118              : template class ConcretePuzzle<2024, 17>;
     119              : template class ConcretePuzzle<2024, 18>;
     120              : template class ConcretePuzzle<2024, 19>;
     121              : template class ConcretePuzzle<2024, 20>;
     122              : template class ConcretePuzzle<2024, 22>;
     123              : template class ConcretePuzzle<2024, 23>;
     124              : template class ConcretePuzzle<2024, 25>;
     125              : 
     126              : template class ConcretePuzzle<2025, 1>;
     127              : template class ConcretePuzzle<2025, 2>;
     128              : template class ConcretePuzzle<2025, 3>;
     129              : template class ConcretePuzzle<2025, 4>;
     130              : template class ConcretePuzzle<2025, 5>;
     131              : template class ConcretePuzzle<2025, 6>;
     132              : template class ConcretePuzzle<2025, 7>;
     133              : template class ConcretePuzzle<2025, 8>;
     134              : template class ConcretePuzzle<2025, 9>;
     135              : template class ConcretePuzzle<2025, 10>;
     136              : template class ConcretePuzzle<2025, 11>;
     137              : 
     138            0 : Puzzle::Year Puzzle::latestYear() {
     139            0 :   auto const &factoryFunctions = getFactoryFunctions();
     140            0 :   ASSUME(!factoryFunctions.empty());
     141            0 :   return std::prev(factoryFunctions.end())->first;
     142            0 : }
     143              : 
     144            0 : Puzzle::Day Puzzle::latestDay(Year const year) {
     145            0 :   auto const &factoryFunctions = getFactoryFunctions();
     146            0 :   auto it = factoryFunctions.find(year);
     147            0 :   ASSUME(it != factoryFunctions.end());
     148            0 :   ASSUME(!it->second.empty());
     149            0 :   return std::prev(it->second.end())->first;
     150            0 : };
     151              : 
     152            0 : std::unique_ptr<Puzzle> Puzzle::create(Year const year, Day const day) {
     153            0 :   auto const &factoryFunctions = getFactoryFunctions();
     154            0 :   auto it = factoryFunctions.find(year);
     155            0 :   if (it == factoryFunctions.end())
     156            0 :     return nullptr;
     157            0 :   auto it2 = it->second.find(day);
     158            0 :   if (it2 == it->second.end())
     159            0 :     return nullptr;
     160            0 :   return (it2->second)();
     161            0 : }
     162              : 
     163          157 : std::vector<std::unique_ptr<Puzzle>> Puzzle::createAll() {
     164          157 :   auto const &factoryFunctions = getFactoryFunctions();
     165          157 :   std::vector<std::unique_ptr<Puzzle>> puzzles;
     166              : 
     167          157 :   for (auto const &[year, dayMap] : factoryFunctions)
     168          942 :     for (auto const &[day, func] : dayMap)
     169        12246 :       puzzles.push_back(func());
     170              : 
     171          157 :   return puzzles;
     172          157 : }
     173              : 
     174            0 : std::vector<std::unique_ptr<Puzzle>> Puzzle::createAll(Year const year) {
     175            0 :   auto const &factoryFunctions = getFactoryFunctions();
     176            0 :   std::vector<std::unique_ptr<Puzzle>> puzzles;
     177              : 
     178            0 :   auto it = factoryFunctions.find(year);
     179            0 :   if (it != factoryFunctions.end()) {
     180            0 :     for (auto [day, func] : it->second)
     181            0 :       puzzles.push_back(func());
     182            0 :   }
     183              : 
     184            0 :   return puzzles;
     185            0 : }
        

Generated by: LCOV version 2.4-0