Compare commits

..

5 Commits

Author SHA1 Message Date
lyrgb ccd216591a updated naming 2026-07-17 12:06:22 +02:00
lyrgb 8ff0e89bb1 added compiler warnings/flags for cmake 2026-07-17 12:03:13 +02:00
lyrgb 37c919df90 interval was being ignored because of type error
size_t interval should've been a double, but was being implicitly
converted, so it worked, compiled. but not like I intended.
2026-07-17 00:41:46 +02:00
lyrgb 9dbc24efc1 visualization of bsort, manager now responsible for updates and time
split timeractions from timers into seperate header
integrated the experiments into an improved displaynumbers, which
includes the vector as well as bars above them
outsourced the calculation of delta time to the manager to clean up main()
2026-07-17 00:04:28 +02:00
lyrgb db8fc15560 time keeping / deltatime now handled by timermanager instead of main 2026-07-16 18:49:11 +02:00
6 changed files with 182 additions and 109 deletions
+11
View File
@@ -7,4 +7,15 @@ find_package(Curses REQUIRED)
include_directories(${CURSES_INCLUDE_DIR}) include_directories(${CURSES_INCLUDE_DIR})
add_executable(${PROJECT_NAME} ${SOURCE_FILES}) add_executable(${PROJECT_NAME} ${SOURCE_FILES})
if(MSVC)
target_compile_option(${PROJECT_NAME} PRIVATE /W4)
else()
target_compile_options(${PROJECT_NAME} PRIVATE
-Wall
-Wextra
-Wpedantic
)
endif()
target_link_libraries(${PROJECT_NAME} ${CURSES_LIBRARIES}) target_link_libraries(${PROJECT_NAME} ${CURSES_LIBRARIES})
+42 -48
View File
@@ -1,14 +1,11 @@
#include "timer.hpp" #include "timer.hpp"
#include <algorithm> #include "timeractions.hpp"
#include <chrono> #include <chrono>
#include <clocale> #include <clocale>
#include <cstdio> #include <cstdio>
#include <ctime> #include <ctime>
#include <functional>
#include <iostream>
#include <memory> #include <memory>
#include <ncurses.h> #include <ncurses.h>
#include <string>
#include <thread> #include <thread>
#include <unistd.h> #include <unistd.h>
#include <utility> #include <utility>
@@ -17,76 +14,73 @@
/* /*
todo todo
figure out namespaces, using, and auto figure out namespaces, using, and auto
formalize timer struct
read about std function and std bind read about std function and std bind
try to do with objects / classes instead try to do with objects / classes instead
centralize into event sender and subscriber centralize into event sender and subscriber
*/ */
void myupdatedisplay(const timer &timer_input) { void myupdatedisplay(const Timer &timer_input) {
int x_offset = COLS / 4; int x_offset = COLS / 4;
mvprintw(timer_input.triggercounter, timer_input.triggercounter + x_offset, mvprintw(timer_input.trigger_counter, timer_input.trigger_counter + x_offset,
"test: █"); "test: █");
} }
std::vector<int> mynumbers = {1, 2, 3, 4, 5, 6, 7, 8, 9}; std::vector<int> my_numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::vector<int> my_other_numbers = {4, 9, 8, 6, 2, 1, 10, 3, 5, 7};
void swapnumbers(std::vector<int> &input_numbers) { void displaynumbers(int start_x, int start_y, std::vector<int> &input_numbers, cchar_t &input_char) {
for (size_t i = 0; i < input_numbers.size() / 2; ++i) {
int temp = input_numbers[i];
input_numbers[i] = input_numbers[input_numbers.size() -1 - i];
input_numbers[input_numbers.size() -1 - i] = temp;
}
}
void displaynumbers(int myy, std::vector<int> &input_numbers){
for (size_t i = 0; i < input_numbers.size(); i++) { for (size_t i = 0; i < input_numbers.size(); i++) {
mvprintw(myy, 10+i, "%d,", input_numbers[i]); /**
I make a horizontal line of i chars, which are supposed to represent mynumbers
above that, I want a line of bars.
_all_ bars stretch from LINES-1 to LINES-1-numbervalue
**/
mvprintw(LINES -1 - start_y, i + start_x, "%d,", input_numbers[i]);
mvwvline_set(stdscr, LINES-1-input_numbers[i]-start_y, i+start_x, &input_char, input_numbers[i]);
} }
}
void createbalk(const timer &timer_input, cchar_t &input_char) {
int ticnt = timer_input.triggercounter;
mvwvline_set(stdscr, LINES - ticnt, ticnt, &input_char, ticnt);
} }
void myinitialize(){ void myinitialize() {
setlocale(LC_ALL, ""); setlocale(LC_ALL, "");
initscr(); initscr();
nodelay(stdscr, FALSE); nodelay(stdscr, FALSE);
refresh(); refresh();
start_color(); start_color();
init_pair(1, COLOR_BLUE, COLOR_WHITE); init_pair(1, COLOR_RED, COLOR_GREEN);
attron(COLOR_PAIR(1)); attron(COLOR_PAIR(1));
printw("Hello World! 🌍 テスト 测试"); printw("Hello World! 🌍 テスト 测试");
} }
int main() { int main() {
myinitialize(); myinitialize();
const wchar_t mywch = L''; cchar_t my_c_char = {.attr= A_NORMAL, .chars={L''}, .ext_color = 0};
cchar_t myc_char;
setcchar(&myc_char, &mywch, A_NORMAL, 0, NULL); //create actions, then put them in timers, then put them into the timermanager
// printf("verification\n");
auto starttime = std::chrono::steady_clock::now(); // initial starttime auto my_action = std::make_unique<SwapAction>(my_numbers);
auto clock_timer =
std::make_unique<Timer>("secondsprinter", 1, 10, std::move(my_action));
auto my_other_sort = std::make_unique<SortAction>(my_other_numbers);
auto sort_timer =
std::make_unique<Timer>("sorttimer", 0.5, std::move(my_other_sort));
TimerManager my_timer_manager;
my_timer_manager.addtimer(std::move(clock_timer));
my_timer_manager.addtimer(std::move(sort_timer));
auto myaction = std::make_unique<swapaction>(mynumbers);
auto clocktimer = std::make_unique<timer>(
"secondsprinter", 1, 10,
std::move(myaction));
timermanager mytimermanager;
mytimermanager.addtimer(std::move(clocktimer));
//swapnumbers(mynumbers);
displaynumbers(2,mynumbers);
mvprintw(5, 5, "timer added");
// calculate delta between current and previous time
while (true) { while (true) {
auto currenttime = std::chrono::steady_clock::now(); erase();
std::chrono::duration<double> myDeltaTime = currenttime - starttime;
double dtime = myDeltaTime.count(); my_timer_manager.updatetimers();
mytimermanager.updatetimers(dtime);
displaynumbers(3,mynumbers); displaynumbers(0,0,my_numbers, my_c_char);
starttime = currenttime; displaynumbers(10, 10, my_other_numbers, my_c_char);
std::this_thread::sleep_for(std::chrono::milliseconds(500));
refresh();
std::this_thread::sleep_for(std::chrono::milliseconds(50));
} }
getch(); getch();
+24 -26
View File
@@ -1,49 +1,56 @@
// calls callbackfunc on specified interval based on accumulated deltatime // calls callbackfunc on specified interval based on accumulated deltatime
#include "timer.hpp" #include "timer.hpp"
#include <algorithm> #include <algorithm>
#include <cstddef> #include <chrono>
#include <functional>
#include <memory> #include <memory>
#include <ncurses.h> #include <ncurses.h>
#include <string> #include <string>
#include <vector> #include <vector>
// infinite timer // infinite timer
timer::timer(std::string name_input, size_t interval_input, Timer::Timer(std::string name_input, double interval_input,
std::unique_ptr<timeraction> action_input) std::unique_ptr<TimerAction> action_input)
: time_interval(interval_input), name(name_input), is_infinite(true), : time_interval(interval_input), name(name_input), is_infinite(true),
action(std::move(action_input)) {} action(std::move(action_input)) {}
// limited timer // limited timer
timer::timer(std::string name, size_t interval_input, int triggeramount, Timer::Timer(std::string name, double interval_input, int trigger_amount,
std::unique_ptr<timeraction> action_input) std::unique_ptr<TimerAction> action_input)
: triggeramount(triggeramount), time_interval(interval_input), name(name), : trigger_amount(trigger_amount), time_interval(interval_input), name(name),
action(std::move(action_input)) {} action(std::move(action_input)) {}
// callbackfunc once enough time has accumulated // callbackfunc once enough time has accumulated
void timer::updatetime(double DeltaTime) { void Timer::updatetime(double delta_time) {
accumulator += DeltaTime; accumulator += delta_time;
if (!is_expired) { if (!is_expired) {
if (accumulator >= time_interval) { if (accumulator >= time_interval) {
action->update(*this); action->update(*this);
accumulator -= time_interval; accumulator -= time_interval;
triggercounter++; trigger_counter++;
if (!is_infinite && triggercounter >= triggeramount) { if (!is_infinite && trigger_counter >= trigger_amount) {
is_expired = true; is_expired = true;
} }
} }
} }
} }
void timermanager::addtimer(std::unique_ptr<timer> input_timer) { void TimerManager::addtimer(std::unique_ptr<Timer> input_timer) {
timers.push_back(std::move(input_timer)); timers.push_back(std::move(input_timer));
} }
void timermanager::updatetimers(double dtime) { void TimerManager::updatetimers() {
//get dtime
auto current_time = std::chrono::steady_clock::now();
std::chrono::duration<double> myDeltaTime = current_time - prev_time;
double dtime = myDeltaTime.count();
//update timers with dtime
for (auto &mytimer : timers) { for (auto &mytimer : timers) {
mytimer->updatetime(dtime); mytimer->updatetime(dtime);
mvprintw(12, 0, "updated timer %s", mytimer->name.c_str()); mvprintw(12, 0, "updated timer %s", mytimer->name.c_str());
} }
//reset for next tick
prev_time = current_time;
timers.erase(std::remove_if(timers.begin(), timers.end(), timers.erase(std::remove_if(timers.begin(), timers.end(),
[](auto &timer) { return timer->is_expired; }), [](auto &timer) { return timer->is_expired; }),
timers.end()); timers.end());
@@ -51,14 +58,5 @@ void timermanager::updatetimers(double dtime) {
refresh(); refresh();
} }
swapaction::swapaction(std::vector<int> &input_vector): input_vector(input_vector){} TimerManager::TimerManager(): prev_time(std::chrono::steady_clock::now()){}
void swapaction::update(const timer &input_timer){
if (!iscomplete) {
int temp = input_vector[it_i];
input_vector[it_i] = input_vector[input_vector.size() -1 - it_i];
input_vector[input_vector.size() - 1 - it_i] = temp;
it_i++;
if(it_i>=input_vector.size() / 2){iscomplete=true;}
}
}
+20 -31
View File
@@ -1,69 +1,58 @@
#ifndef TIMER_HPP #ifndef TIMER_HPP
#define TIMER_HPP #define TIMER_HPP
#include <cstddef> #include <chrono>
#include <functional>
#include <memory> #include <memory>
#include <ncurses.h> #include <ncurses.h>
#include <string> #include <string>
#include <vector> #include <vector>
class timer; class Timer;
class timeraction { class TimerAction {
public: public:
virtual ~timeraction() = default; virtual ~TimerAction() = default;
virtual void update(const timer &t) = 0; virtual void update(const Timer &t) = 0;
}; };
class timer { class Timer {
private: private:
double accumulator = 0; double accumulator = 0;
int triggeramount = 0; int trigger_amount = 0;
double time_interval = 1; // only display every 1 seconds double time_interval = 1; // only display every 1 seconds
public: public:
std::string name; std::string name;
int triggercounter = 0; int trigger_counter = 0;
bool is_infinite = false; bool is_infinite = false;
std::unique_ptr<timeraction> action; std::unique_ptr<TimerAction> action;
bool is_expired = false; bool is_expired = false;
//infinite timer //infinite timer
timer(std::string name_input, size_t interval_input, Timer(std::string name_input, double interval_input,
std::unique_ptr<timeraction> action_input std::unique_ptr<TimerAction> action_input
); );
//limited timer //limited timer
timer(std::string name, size_t interval_input, int triggeramount, Timer(std::string name, double interval_input, int trigger_amount,
std::unique_ptr<timeraction> action std::unique_ptr<TimerAction> action
); );
// callbackfunc once enough time has accumulated // callbackfunc once enough time has accumulated
void updatetime(double DeltaTime); void updatetime(double delta_time);
}; };
// manage collection of timers // manage collection of timers
class timermanager { class TimerManager {
std::vector<std::unique_ptr<timer>> timers; std::vector<std::unique_ptr<Timer>> timers;
std::chrono::steady_clock::time_point prev_time; // initial starttime
public: public:
void addtimer(std::unique_ptr<timer> input_timer); TimerManager();
void addtimer(std::unique_ptr<Timer> input_timer);
void updatetimers(double dtime); void updatetimers();
}; };
class swapaction : public timeraction {
public:
size_t it_i = 0;
bool iscomplete = false;
std::vector<int> &input_vector;
swapaction(std::vector<int> &input_vector);
void update(const timer &t);
};
#endif #endif
+49
View File
@@ -0,0 +1,49 @@
#include <vector>
#include "timer.hpp"
#include "timeractions.hpp"
#include <algorithm>
#include <ncurses.h>
#include <vector>
SwapAction::SwapAction(std::vector<int> &input_vector): input_vector(input_vector){}
void SwapAction::update(const Timer &input_timer){
if (!is_complete) {
int temp = input_vector[it_i];
input_vector[it_i] = input_vector[input_vector.size() -1 - it_i];
input_vector[input_vector.size() - 1 - it_i] = temp;
it_i++;
if(it_i>=input_vector.size() / 2){is_complete=true;}
}
}
SortAction::SortAction(std::vector<int> &input_vector): input_vector(input_vector) {}
//sorts the included array using bsort and external iterators rather than for loops
void SortAction::update(const Timer &input_timer) {
if (!is_complete) {
/**
we take a number, it_i loop
compare it with its neighbour, it_j loop
if it's larger swap it
keep going until it_i == length - sorted numbers
once that is true, reset it_j and advance it_i
**/
if (input_vector[it_j]>input_vector[it_j+1]) {
// int temp = input_vector[it_j + 1];
// input_vector[it_j + 1] = input_vector[it_j];
// input_vector[it_j] = temp;
std::swap(input_vector[it_j], input_vector[it_j+1]);
}
it_j++;
if (it_j >= input_vector.size() - 1 - it_i) {
it_j = 0;
it_i++;
}
if (it_i>=input_vector.size()) {
is_complete=true;
}
}
}
+32
View File
@@ -0,0 +1,32 @@
#ifndef TIMERACTIONS_HPP
#define TIMERACTIONS_HPP
#include "timer.hpp"
#include <chrono>
#include <cstddef>
#include <functional>
#include <memory>
#include <ncurses.h>
#include <string>
#include <vector>
class SwapAction : public TimerAction {
public:
size_t it_i = 0;
bool is_complete = false;
std::vector<int> &input_vector;
SwapAction(std::vector<int> &input_vector);
void update(const Timer &t);
};
class SortAction : public TimerAction {
public:
size_t it_i = 0;
size_t it_j = 0;
bool is_complete = false;
std::vector<int> &input_vector;
SortAction(std::vector<int> &input_vector);
void update(const Timer &t);
};
#endif