Add caching

This commit is contained in:
Love 2025-01-24 14:04:42 +01:00
parent e91759c70d
commit 0014abc9c7
7 changed files with 109 additions and 16 deletions

View File

@ -11,6 +11,8 @@ add_executable(${PROJECT_NAME}
Tui.h
Command.h
Command.cpp
Pager.cpp
Pager.hpp
)
target_link_libraries(${PROJECT_NAME} PRIVATE LibXml2::LibXml2 cpr::cpr)

View File

@ -32,6 +32,7 @@ public:
Page &operator-=(int);
[[nodiscard]] std::string str_pretty() const;
[[nodiscard]] std::string str() const;
bool refresh();

50
src/Pager.cpp Normal file
View File

@ -0,0 +1,50 @@
// _____ _ _____
// |_ _|____ _| ||_ _|_ __
// | |/ _ \ \/ / __|| | \ \ / /
// | | __/> <| |_ | | \ V /
// |_|\___/_/\_\\__||_| \_/
// Author: Love Billenius <lovebillenius@disroot.org>
// License: GPL-3
#include "Pager.hpp"
Page &Pager::seek(const int number) {
Page &page = get_page_at(number);
m_page_number = number;
return page;
}
Pager &Pager::operator+=(const int number) {
seek(m_page_number + number);
return *this;
}
Pager &Pager::operator-=(const int number) {
seek(m_page_number - number);
return *this;
}
Page &Pager::operator*() {
return get_page_at(m_page_number);
}
Page *Pager::operator->() {
return &get_page_at(m_page_number);
}
void Pager::set(const int number) {
m_page_number = number;
}
void Pager::clear() {
m_pages.clear();
}
Page &Pager::get_page_at(const int number) {
if (!m_pages.contains(number)) {
const Page p(number);
m_pages[number] = p;
}
return m_pages.at(number);
}

41
src/Pager.hpp Normal file
View File

@ -0,0 +1,41 @@
// _____ _ _____
// |_ _|____ _| ||_ _|_ __
// | |/ _ \ \/ / __|| | \ \ / /
// | | __/> <| |_ | | \ V /
// |_|\___/_/\_\\__||_| \_/
// Author: Love Billenius <lovebillenius@disroot.org>
// License: GPL-3
#pragma once
#include <unordered_map>
#include "Page.hpp"
class Pager {
public:
Pager() = default;
Page &seek(int number);
Pager &operator+=(int number);
Pager &operator-=(int number);
Page &operator*();
Page *operator->();
void set(int number);
Page &get();
void clear();
private:
Page &get_page_at(int number);
private:
std::unordered_map<int, Page> m_pages{};
int m_page_number = 100;
};

View File

@ -14,11 +14,11 @@
#include <utility>
#include "Command.h"
#include "Pager.hpp"
Tui::Tui(Page page) : m_page(std::move(page)) {
Tui::Tui(Pager pager) : m_pager(std::move(pager)) {
}
std::optional<int> get_page_number(const std::string_view line) {
const size_t space = line.find_first_of(' ');
if (space == std::string::npos)
@ -50,7 +50,7 @@ void printHelp() {
}
void Tui::run() {
std::cout << m_page.str_pretty() << std::endl;
std::cout << m_pager->str_pretty() << std::endl;
for (;;) {
std::cout << "Enter a command: ";
std::flush(std::cout);
@ -71,23 +71,23 @@ void Tui::run() {
std::cout << "Invalid command!" << std::endl;
} else if constexpr (std::is_same_v<T, Command::Next>) {
try {
m_page += 1;
m_pager += 1;
} catch (const std::runtime_error &e) {
std::cout << e.what() << std::endl;
return;
}
std::cout << m_page.str_pretty() << std::endl;
std::cout << m_pager->str_pretty() << std::endl;
} else if constexpr (std::is_same_v<T, Command::Previous>) {
try {
m_page -= 1;
m_pager -= 1;
} catch (const std::runtime_error &e) {
std::cout << e.what() << std::endl;
return;
}
std::cout << m_page.str_pretty() << std::endl;
std::cout << m_pager->str_pretty() << std::endl;
} else if constexpr (std::is_same_v<T, Command::Refresh>) {
m_page.refresh();
std::cout << m_page.str_pretty() << std::endl;
m_pager.clear();
std::cout << m_pager->str_pretty() << std::endl;
} else if constexpr (std::is_same_v<T, Command::Exit>) {
should_exit = true;
} else if constexpr (std::is_same_v<T, Command::Help>) {
@ -96,12 +96,12 @@ void Tui::run() {
const Command::Seek &seek = arg;
const int number = seek.number;
try {
m_page = Page(number);
m_pager.seek(number);
} catch (const std::runtime_error &e) {
std::cout << e.what() << std::endl;
return;
}
std::cout << m_page.str_pretty() << std::endl;
std::cout << m_pager->str_pretty() << std::endl;
}
};
std::visit(visitor, command);

View File

@ -7,15 +7,15 @@
// License: GPL-3
#pragma once
#include "Page.hpp"
#include "Pager.hpp"
class Tui {
public:
Tui(Page page);
Tui(Pager pager);
void run();
private:
Page m_page;
Pager m_pager;
};

View File

@ -6,10 +6,9 @@
// Author: Love Billenius <lovebillenius@disroot.org>
// License: GPL-3
#include "Page.hpp"
#include "Tui.h"
int main(int argc, char *argv[]) {
Tui tui = Page();
Tui tui(Pager{});
tui.run();
}