From c8203d4308ec7bbd8d12f17227c16daa1d9d0d84 Mon Sep 17 00:00:00 2001 From: quentin Date: Wed, 7 Feb 2024 09:39:57 -0600 Subject: [PATCH] Rewrite initial commit --- .idea/dataSources.xml | 12 +++ .idea/discord.xml | 6 ++ CMakeLists.txt | 16 +--- src/data/accountData.cpp | 99 ------------------------- src/data/accountData.h | 36 --------- src/data/data.h | 43 ----------- src/data/data.tpp | 85 --------------------- src/data/dateMoney.cpp | 38 ---------- src/data/dateMoney.h | 36 --------- src/main.cpp | 103 -------------------------- src/main.h | 8 -- src/money/account.cpp | 44 ----------- src/money/account.h | 35 --------- src/money/earning.cpp | 7 -- src/money/earning.h | 17 ----- src/money/payment.cpp | 19 ----- src/money/payment.h | 27 ------- src/money/recept.cpp | 9 --- src/money/recept.h | 21 ------ src/money/transaction.cpp | 11 --- src/money/transaction.h | 23 ------ src/optHandlers/accountOptHandler.cpp | 70 ----------------- src/optHandlers/accountOptHandler.h | 41 ---------- src/optHandlers/mainOptHandler.cpp | 51 ------------- src/optHandlers/mainOptHandler.h | 33 --------- src/optHandlers/optHandler.cpp | 20 ----- src/optHandlers/optHandler.h | 33 --------- utilities/math.cpp | 97 ------------------------ utilities/math.h | 19 ----- utilities/polynomialFunction.cpp | 21 ------ utilities/polynomialFunction.h | 25 ------- 31 files changed, 21 insertions(+), 1084 deletions(-) create mode 100644 .idea/dataSources.xml create mode 100644 .idea/discord.xml delete mode 100644 src/data/accountData.cpp delete mode 100644 src/data/accountData.h delete mode 100644 src/data/data.h delete mode 100644 src/data/data.tpp delete mode 100644 src/data/dateMoney.cpp delete mode 100644 src/data/dateMoney.h delete mode 100644 src/main.h delete mode 100644 src/money/account.cpp delete mode 100644 src/money/account.h delete mode 100644 src/money/earning.cpp delete mode 100644 src/money/earning.h delete mode 100644 src/money/payment.cpp delete mode 100644 src/money/payment.h delete mode 100644 src/money/recept.cpp delete mode 100644 src/money/recept.h delete mode 100644 src/money/transaction.cpp delete mode 100644 src/money/transaction.h delete mode 100644 src/optHandlers/accountOptHandler.cpp delete mode 100644 src/optHandlers/accountOptHandler.h delete mode 100644 src/optHandlers/mainOptHandler.cpp delete mode 100644 src/optHandlers/mainOptHandler.h delete mode 100644 src/optHandlers/optHandler.cpp delete mode 100644 src/optHandlers/optHandler.h delete mode 100644 utilities/math.cpp delete mode 100644 utilities/math.h delete mode 100644 utilities/polynomialFunction.cpp delete mode 100644 utilities/polynomialFunction.h diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 0000000..fc9a5f1 --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,12 @@ + + + + + sqlite.xerial + true + org.sqlite.JDBC + jdbc:sqlite:$USER_HOME$/.local/share/budget/accounts.sqlite + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/discord.xml b/.idea/discord.xml new file mode 100644 index 0000000..cd711a0 --- /dev/null +++ b/.idea/discord.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 93c5c66..9f11c0d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,16 +3,6 @@ project(budget) set(CMAKE_CXX_STANDARD 20) -add_executable(${PROJECT_NAME} src/main.cpp src/main.h - src/money/account.cpp src/money/account.h - src/money/payment.cpp src/money/payment.h - src/money/recept.cpp src/money/recept.h - src/data/data.tpp src/data/data.h - src/data/accountData.cpp src/data/accountData.h - src/money/earning.cpp src/money/earning.h - src/data/dateMoney.cpp src/data/dateMoney.h - src/optHandlers/optHandler.cpp src/optHandlers/optHandler.h - src/optHandlers/accountOptHandler.cpp src/optHandlers/accountOptHandler.h - src/optHandlers/mainOptHandler.cpp src/optHandlers/mainOptHandler.h - utilities/math.cpp utilities/math.h - utilities/polynomialFunction.cpp utilities/polynomialFunction.h src/money/transaction.cpp src/money/transaction.h) +add_executable(${PROJECT_NAME} src/main.cpp) + +target_link_libraries(${PROJECT_NAME} sqlite3) \ No newline at end of file diff --git a/src/data/accountData.cpp b/src/data/accountData.cpp deleted file mode 100644 index 890d2c3..0000000 --- a/src/data/accountData.cpp +++ /dev/null @@ -1,99 +0,0 @@ -// -// Created by quentin on 8/4/22. -// - -#include "accountData.h" -#include - -AccountData::AccountData(const std::string &file) : Data(file) { - account = AccountData::createObject(); -} - -AccountData::AccountData(const std::string &file, const std::string &name) : Data(file) { - std::string json = R"({"name":")" + name + R"(","payments":[],"earnings":[]})"; - document.Parse(json.c_str()); - account = AccountData::createObject(); - std::cout << "Created account " << name << std::endl; -} - -Account AccountData::createObject() { - if (isJsonCorrect()) { - std::string name = document["name"].GetString(); - - std::list payments; - for (auto &domPayment : document["payments"].GetArray()) { - Receipt receipt(domPayment["receipt"]["file"].GetString()); - double value = domPayment["value"].GetDouble(); - std::time_t date = domPayment["date"].GetInt64(); - std::tm tmTime{}; - std::memcpy(&tmTime, std::localtime(&date), sizeof(struct tm)); - - payments.emplace_back(value, receipt, tmTime); - } - - std::list earnings; - for (auto &domEarning : document["earnings"].GetArray()) { - double value = domEarning["value"].GetDouble(); - std::time_t date = domEarning["date"].GetInt64(); - std::tm tmTime{}; - std::memcpy(&tmTime, std::localtime(&date), sizeof(struct tm)); - - earnings.emplace_back(value, tmTime); - } - - return Account(payments, earnings, name); - } - - std::string strAnswer; - bool answer; - while (true) { - std::cout << "Account " + getFilePath() + " Is malformed, would you like to remove it? (Y/n): "; - std::cin >> strAnswer; - std::transform(strAnswer.begin(), strAnswer.end(), strAnswer.begin(), ::toupper); - if (strAnswer == "Y" || strAnswer == "YES") { - answer = true; - break; - } - if (strAnswer == "N" || strAnswer == "NO") { - answer = false; - break; - } - std::cout << "Sorry, answer " + strAnswer + " not understood." << std::endl; - } - - return Account(); -} - -bool AccountData::isJsonCorrect() { - if (document.IsObject() && - document.HasMember("name") && document["name"].IsString() && - document.HasMember("payments") && document["payments"].IsArray() && - document.HasMember("earnings") && document["earnings"].IsArray()) { - for (auto &domPayment : document["payments"].GetArray()) { - if (!(domPayment.IsObject() && - domPayment.HasMember("receipt") && domPayment["receipt"].IsObject() && - domPayment["receipt"].HasMember("file") && domPayment["receipt"]["file"].IsString() && - domPayment.HasMember("value") && domPayment["value"].IsDouble() && - domPayment.HasMember("date") && domPayment["date"].IsInt64())) { - return false; - } - } - for (auto &domEarning : document["earnings"].GetArray()) { - if (!(domEarning.IsObject() && - domEarning.HasMember("value") && domEarning["value"].IsDouble() && - domEarning.HasMember("date") && domEarning["date"].IsInt64())) { - return false; - } - } - - return true; - } - - return false; -} - -Account *AccountData::getAccount() { - return &account; -} - -AccountData::AccountData() : Data("/dev/null") {} diff --git a/src/data/accountData.h b/src/data/accountData.h deleted file mode 100644 index 8cfee15..0000000 --- a/src/data/accountData.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// Created by quentin on 8/4/22. -// - -#ifndef BUDGET_ACCOUNTDATA_H -#define BUDGET_ACCOUNTDATA_H - - -#include "data.h" -#include "../money/account.h" - -static const char *jsonTemplate = ""; - -class AccountData : private Data { -public: - AccountData(); - - AccountData(const AccountData &) = default; - - explicit AccountData(const std::string &file); - - explicit AccountData(const std::string &file, const std::string &name); - - Account *getAccount(); - - using Data::deleteObject; -private: - Account account; - - Account createObject() override; - - bool isJsonCorrect() override; -}; - - -#endif //BUDGET_ACCOUNTDATA_H diff --git a/src/data/data.h b/src/data/data.h deleted file mode 100644 index 6670a16..0000000 --- a/src/data/data.h +++ /dev/null @@ -1,43 +0,0 @@ -// -// Created by quentin on 8/4/22. -// - -#ifndef BUDGET_DATA_H -#define BUDGET_DATA_H - -#include -#include -#include -#include - -template -class Data { -public: - rapidjson::Document document; - - virtual ~Data(); - - Data(const Data &data); - - explicit Data(std::string file); - - virtual T createObject() = 0; - - std::string getFilePath(); - - void flushToFile(); - - void deleteObject(); - -private: - const std::string fileName; - const std::string homeDirectory = getpwuid(getuid())->pw_dir; - std::string fileDirectory; - bool flush = true; - - virtual bool isJsonCorrect() = 0; -}; - -#include "data.tpp" - -#endif //BUDGET_DATA_H \ No newline at end of file diff --git a/src/data/data.tpp b/src/data/data.tpp deleted file mode 100644 index aa4d8ea..0000000 --- a/src/data/data.tpp +++ /dev/null @@ -1,85 +0,0 @@ -// -// Created by quentin on 8/4/22. -// - - -#include "data.h" - -#include -#include -#include -#include -#include -#include - - -template -Data::Data(std::string file) : fileName(std::move(file)) { - // Create file if it doesnt exist - std::ifstream chkExistIfs(getFilePath(), std::ios::in | std::ios::binary | std::ios::ate); - if (chkExistIfs) { - // File exists, were not creating one - std::ifstream::pos_type fileSize = chkExistIfs.tellg(); - chkExistIfs.seekg(0, std::ios::beg); - - std::vector bytes(fileSize); - chkExistIfs.read(bytes.data(), fileSize); - - document.Parse(std::string(bytes.data(), fileSize).c_str()); - chkExistIfs.close(); - } else { - // File doesnt exist we need to create one - // This is the job of the derives constructor. - chkExistIfs.close(); - }; -} - -template -std::string Data::getFilePath() { - return fileName; -} - -template -void Data::flushToFile() { - rapidjson::StringBuffer buffer; - rapidjson::Writer writer(buffer); - document.Accept(writer); - - std::ofstream file(getFilePath()); - file << buffer.GetString(); - file.close(); -} - -template -Data::~Data() { - if (flush) { - flushToFile(); - } -} - -template -void Data::deleteObject() { - remove(getFilePath().c_str()); - flush = false; -} - -template -Data::Data(const Data &data) : fileName(data.fileName) { - // Create file if it doesnt exist - std::ifstream chkExistIfs(getFilePath(), std::ios::in | std::ios::binary | std::ios::ate); - if (chkExistIfs) { - // File exists, were not creating one - std::ifstream::pos_type fileSize = chkExistIfs.tellg(); - chkExistIfs.seekg(0, std::ios::beg); - - std::vector bytes(fileSize); - chkExistIfs.read(bytes.data(), fileSize); - - document.Parse(std::string(bytes.data(), fileSize).c_str()); - chkExistIfs.close(); - } else { - // File doesnt exist we need to create one - // This is the job of the derives constructor. - chkExistIfs.close(); - }; -} diff --git a/src/data/dateMoney.cpp b/src/data/dateMoney.cpp deleted file mode 100644 index 479e06b..0000000 --- a/src/data/dateMoney.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// -// Created by quentin on 8/12/22. -// - -#include "dateMoney.h" - - -DateMoney::DateMoney(const double *value, tm *date) : value(value), date(date) {} - -bool DateMoney::operator<(const DateMoney &rhs) const { - return mktime(date) < mktime(rhs.date); -} - -bool DateMoney::operator>(const DateMoney &rhs) const { - return rhs < *this; -} - -bool DateMoney::operator<=(const DateMoney &rhs) const { - return !(rhs < *this); -} - -bool DateMoney::operator>=(const DateMoney &rhs) const { - return !(*this < rhs); -} - -std::ostream &operator<<(std::ostream &os, const DateMoney &money) { - os << "Value: " << *money.value << " Date: " << money.date->tm_mon + 1 << "/" << money.date->tm_mday << "/" - << money.date->tm_year+1900; - return os; -} - -const double *DateMoney::getValue() const { - return value; -} - -tm *DateMoney::getDate() const { - return date; -} diff --git a/src/data/dateMoney.h b/src/data/dateMoney.h deleted file mode 100644 index 1738127..0000000 --- a/src/data/dateMoney.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// Created by quentin on 8/12/22. -// - -#ifndef BUDGET_DATEMONEY_H -#define BUDGET_DATEMONEY_H - - -#include -#include - -class DateMoney { -public: - DateMoney(const double *value, tm *date); - - [[nodiscard]] const double *getValue() const; - - [[nodiscard]] tm *getDate() const; - - bool operator<(const DateMoney &rhs) const; - - bool operator>(const DateMoney &rhs) const; - - bool operator<=(const DateMoney &rhs) const; - - bool operator>=(const DateMoney &rhs) const; - - friend std::ostream &operator<<(std::ostream &os, const DateMoney &money); - -private: - const double *value; - tm *date; -}; - - -#endif //BUDGET_DATEMONEY_H diff --git a/src/main.cpp b/src/main.cpp index 94ae7a7..51da77e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,110 +2,7 @@ // Created by quentin on 8/3/22. // -#include "main.h" -#include "data/accountData.h" -#include "optHandlers/accountOptHandler.h" -#include "optHandlers/mainOptHandler.h" -#include "../utilities/math.h" - -#include -#include -#include -#include -#include -#include - -using namespace Budget; - -const std::string homeDirectory = getpwuid(getuid())->pw_dir; -const std::string configD = homeDirectory + "/.config/budget/"; -const std::string storageD = homeDirectory + "/.local/share/budget/"; - -void createRequiredFolders() { - std::filesystem::create_directory(configD); - std::filesystem::create_directories(storageD); - std::filesystem::create_directories(storageD + "accounts"); - std::filesystem::create_directories(storageD + "receipts"); -} int main(int argc, char *argv[]) { - std::vector args(argv, argv + argc); - - // Parse main options (-ah) - OptHandlers::MainOptHandler mainOptHandler(args); - mainOptHandler.parse(); - if (mainOptHandler.getSetOpts()->help) - mainOptHandler.help(); - - createRequiredFolders(); - // Read all accounts saved and store them in accounts - std::unordered_map accounts; - for (const auto &file : std::filesystem::directory_iterator( - homeDirectory + "/.local/share/budget/accounts")) { - AccountData account(file.path()); - accounts.insert(std::pair(account.getAccount()->getName(), account)); - } - - // Parse account options if main options tells us to. - if (mainOptHandler.getSetOpts()->account) { - std::vector vec{argv[0]}; - vec.insert(vec.end(), args.begin() + mainOptHandler.getSetOpts()->accountArgStart, args.end()); - OptHandlers::AccountOptHandler accountOptHandler(vec); - accountOptHandler.parse(); - - // Do what we need to do for parsed options - if (accountOptHandler.getSetOpts()->help) { - accountOptHandler.help(); - } - if (accountOptHandler.getSetOpts()->create) { - auto a = accounts.find(accountOptHandler.getSetOpts()->delAccount); - if (a == accounts.end()) { - accounts.emplace(std::piecewise_construct, - std::make_tuple(accountOptHandler.getSetOpts()->createAccount), std::make_tuple( - storageD + "accounts/" + accountOptHandler.getSetOpts()->createAccount + ".json", - accountOptHandler.getSetOpts()->createAccount)); - } else { - std::cout << "Account " << accountOptHandler.getSetOpts()->delAccount << " already exists." - << std::endl; - } - } - if (accountOptHandler.getSetOpts()->value) { - auto a = accounts.find(accountOptHandler.getSetOpts()->valueAccount); - if (a != accounts.end()) { - int value = a->second.getAccount()->getValue(); - std::vector timeline = a->second.getAccount()->getTimeline(); - printf("Account value: %d\n", value); - printf("Last 10 transactions:\n"); - for (int i = 0; i < timeline.size() && i < 10; i++) { - const double *amount = timeline[i].getValue(); - const tm *date = timeline[i].getDate(); - if (*amount <= 0) { - // Red - printf("Value: \033[31m%.2f\033[0m, ", *amount); - } - else { - // Green - printf("Value: \033[32m%.2f\033[0m, ", *amount); - } - printf("Date: %d/%d/%d\n", date->tm_mon+1, date->tm_mday, date->tm_year+1900); - } - std::cout << std::endl; - } - } - if (accountOptHandler.getSetOpts()->del) { - auto a = accounts.find(accountOptHandler.getSetOpts()->delAccount); - if (a != accounts.end()) { - accounts.erase(a); - std::cout << "Deleted account: " << accountOptHandler.getSetOpts()->delAccount << std::endl; - } - } - if (accountOptHandler.getSetOpts()->list) { - std::cout << "Accounts: " << std::endl; - for (auto &accountPair : accounts) { - std::cout << accountPair.second.getAccount()->getName() << ": " << std::endl; - std::cout << " Value: " << accountPair.second.getAccount()->getValue() << std::endl; - } - } - } return 0; } diff --git a/src/main.h b/src/main.h deleted file mode 100644 index 7f6116b..0000000 --- a/src/main.h +++ /dev/null @@ -1,8 +0,0 @@ -// -// Created by quentin on 8/12/22. -// - -#ifndef BUDGET_MAIN_H -#define BUDGET_MAIN_H - -#endif //BUDGET_MAIN_H diff --git a/src/money/account.cpp b/src/money/account.cpp deleted file mode 100644 index eed8726..0000000 --- a/src/money/account.cpp +++ /dev/null @@ -1,44 +0,0 @@ -// -// Created by quentin on 8/4/22. -// - -#include "account.h" - -#include - -Account::Account(std::list payments, std::list earnings, - std::string name) : payments(std::move(payments)), earnings(std::move(earnings)), - name(std::move(name)) {} - -Account::Account() { - name = ""; -} - -int Account::getValue() { - int total = 0; - for (auto &payment : payments) { - total -= payment.value; - } - for (auto &earning : earnings) { - total += earning.value; - } - - return total; -} - -std::vector Account::getTimeline() { - std::vector timeline; - for (auto &payment : payments) { - timeline.emplace_back(payment.getValue(), payment.getDate()); - } - for (auto &earning : earnings) { - timeline.emplace_back(&earning.value, earning.getDate()); - } - std::sort(timeline.begin(), timeline.end(), std::greater<>()); - - return timeline; -} - -const std::string &Account::getName() const { - return name; -} diff --git a/src/money/account.h b/src/money/account.h deleted file mode 100644 index d79ecf6..0000000 --- a/src/money/account.h +++ /dev/null @@ -1,35 +0,0 @@ -// -// Created by quentin on 8/4/22. -// - -#ifndef BUDGET_ACCOUNT_H -#define BUDGET_ACCOUNT_H - - -#include "payment.h" -#include "earning.h" -#include "../data/dateMoney.h" -#include -#include -#include - -class Account { -public: - Account(std::list payments, std::list earnings, std::string name); - - Account(); - - int getValue(); - - std::vector getTimeline(); - - [[nodiscard]] const std::string &getName() const; - -private: - std::list payments; - std::list earnings; - std::string name; -}; - - -#endif //BUDGET_ACCOUNT_H diff --git a/src/money/earning.cpp b/src/money/earning.cpp deleted file mode 100644 index 16b56f8..0000000 --- a/src/money/earning.cpp +++ /dev/null @@ -1,7 +0,0 @@ -// -// Created by quentin on 8/11/22. -// - -#include "earning.h" - -Earning::Earning(const double value, std::tm date) : Transaction(value, date) {} diff --git a/src/money/earning.h b/src/money/earning.h deleted file mode 100644 index 6c8ed07..0000000 --- a/src/money/earning.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// Created by quentin on 8/11/22. -// - -#ifndef BUDGET_EARNING_H -#define BUDGET_EARNING_H - -#include -#include "transaction.h" - -class Earning : public Transaction { -public: - explicit Earning(double value, std::tm date); -}; - - -#endif //BUDGET_EARNING_H diff --git a/src/money/payment.cpp b/src/money/payment.cpp deleted file mode 100644 index a012659..0000000 --- a/src/money/payment.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// -// Created by quentin on 8/4/22. -// - -#include "payment.h" - -#include - -Payment::Payment(const double value, Receipt receipt, std::tm date) : Transaction(value, date), receipt(std::move(receipt)) { - negativeValue = -value; -} - -Receipt &Payment::getReceipt() { - return receipt; -} - -const double *Payment::getValue() { - return &negativeValue; -} diff --git a/src/money/payment.h b/src/money/payment.h deleted file mode 100644 index f21080a..0000000 --- a/src/money/payment.h +++ /dev/null @@ -1,27 +0,0 @@ -// -// Created by quentin on 8/4/22. -// - -#ifndef BUDGET_PAYMENT_H -#define BUDGET_PAYMENT_H - - -#include "recept.h" -#include "transaction.h" - -class Payment : public Transaction { -public: - Payment(double value, Receipt receipt, std::tm date); - - Receipt &getReceipt(); - - const double *getValue(); - -private: - Receipt receipt; - - double negativeValue; -}; - - -#endif //BUDGET_PAYMENT_H diff --git a/src/money/recept.cpp b/src/money/recept.cpp deleted file mode 100644 index 69e4fe6..0000000 --- a/src/money/recept.cpp +++ /dev/null @@ -1,9 +0,0 @@ -// -// Created by quentin on 8/4/22. -// - -#include "recept.h" - -#include - -Receipt::Receipt(std::string file) : file(std::move(file)) {} diff --git a/src/money/recept.h b/src/money/recept.h deleted file mode 100644 index 61fe008..0000000 --- a/src/money/recept.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// Created by quentin on 8/4/22. -// - -#ifndef BUDGET_RECEPT_H -#define BUDGET_RECEPT_H - - -#include - -class Receipt { -private: -public: - explicit Receipt(std::string file); - -private: - std::string file; -}; - - -#endif //BUDGET_RECEPT_H diff --git a/src/money/transaction.cpp b/src/money/transaction.cpp deleted file mode 100644 index de461bc..0000000 --- a/src/money/transaction.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// -// Created by quentin on 9/16/22. -// - -#include "transaction.h" - -Transaction::Transaction(const double value, const tm &date) : value(value), date(date) {} - -tm *Transaction::getDate() { - return &date; -} diff --git a/src/money/transaction.h b/src/money/transaction.h deleted file mode 100644 index 9064adf..0000000 --- a/src/money/transaction.h +++ /dev/null @@ -1,23 +0,0 @@ -// -// Created by quentin on 9/16/22. -// - -#ifndef BUDGET_TRANSACTION_H -#define BUDGET_TRANSACTION_H - -#include - -class Transaction { -public: - Transaction(double value, const tm &date); - - const double value; - - tm *getDate(); - -private: - std::tm date; -}; - - -#endif //BUDGET_TRANSACTION_H diff --git a/src/optHandlers/accountOptHandler.cpp b/src/optHandlers/accountOptHandler.cpp deleted file mode 100644 index 6ea6bca..0000000 --- a/src/optHandlers/accountOptHandler.cpp +++ /dev/null @@ -1,70 +0,0 @@ -// -// Created by quentin on 8/13/22. -// - -#include -#include "accountOptHandler.h" - -using namespace Budget::OptHandlers; - - -void AccountOptHandler::parse() { - struct option longOpts[] = { - {"help", no_argument, nullptr, 'h'}, - {"list", no_argument, nullptr, 'l'}, - {"delete", required_argument, nullptr, 'd'}, - {"create", required_argument, nullptr, 'c'}, - {"value", required_argument, nullptr, 'v'}, - }; - - while (true) { - int opt = getopt_long(getArgc(), getArgv(), "hld:c:v:", longOpts, nullptr); - - if (opt == -1) { - break; - } - - switch (opt) { - case 'h': - setOpts.help = true; - break; - case 'l': - setOpts.list = true; - break; - case 'd': - setOpts.del = true; - setOpts.delAccount = optarg; - break; - case 'c': - setOpts.create = true; - setOpts.createAccount = optarg; - break; - case 'v': - setOpts.value = true; - setOpts.valueAccount = optarg; - break; - case '?': - setOpts.help = true; - setOpts.helpOut = stderr; - break; - default: - break; - } - } -} - -void AccountOptHandler::help() { - fprintf(setOpts.helpOut, "Help budget -a {-cvd account|-hl}\n"); - fprintf(setOpts.helpOut, " -h --help Output this message.\n"); - fprintf(setOpts.helpOut, " -l --list List available accounts.\n"); - fprintf(setOpts.helpOut, " -d --delete account Delete the specified account.\n"); - fprintf(setOpts.helpOut, " -c --create account Create a new account.\n"); - fprintf(setOpts.helpOut, " -v --value account Print the current value of account.\n"); -} - -const AccountOptHandler::SetOpts *AccountOptHandler::getSetOpts() const { - return &setOpts; -} - -AccountOptHandler::AccountOptHandler(const std::vector &argv) : OptHandler(argv) {} - diff --git a/src/optHandlers/accountOptHandler.h b/src/optHandlers/accountOptHandler.h deleted file mode 100644 index 5eb631d..0000000 --- a/src/optHandlers/accountOptHandler.h +++ /dev/null @@ -1,41 +0,0 @@ -// -// Created by quentin on 8/13/22. -// - -#ifndef BUDGET_ACCOUNTOPTHANDLER_H -#define BUDGET_ACCOUNTOPTHANDLER_H - - -#include "optHandler.h" - -namespace Budget::OptHandlers { - class AccountOptHandler : public OptHandler { - struct SetOpts { - FILE *helpOut = stdout; - bool help = false; - bool list = false; - bool del = false; - char *delAccount{}; - bool create = false; - char *createAccount{}; - bool value = false; - char *valueAccount{}; - }; - - public: - explicit AccountOptHandler(const std::vector &argv); - - void parse() override; - - void help() override; - - [[nodiscard]] const SetOpts *getSetOpts() const; - - private: - SetOpts setOpts; - }; - -} - - -#endif //BUDGET_ACCOUNTOPTHANDLER_H diff --git a/src/optHandlers/mainOptHandler.cpp b/src/optHandlers/mainOptHandler.cpp deleted file mode 100644 index 5dc7fdc..0000000 --- a/src/optHandlers/mainOptHandler.cpp +++ /dev/null @@ -1,51 +0,0 @@ -// -// Created by quentin on 8/13/22. -// - -#include -#include "mainOptHandler.h" - -using namespace Budget::OptHandlers; - - -MainOptHandler::MainOptHandler(const std::vector &argv) : OptHandler(argv) {} - -void MainOptHandler::parse() { - struct option longOpts[] = { - {"help", no_argument, nullptr, 'h'}, - {"account", no_argument, nullptr, 'a'}, - }; - - while (true) { - int opt = getopt_long(getArgc(), getArgv(), "ha", longOpts, nullptr); - if (opt == -1) { - break; - } - - switch (opt) { - case 'h': - setOpts.help = true; - break; - case 'a': - setOpts.account = true; - setOpts.accountArgStart = optind - 1; - return; - case '?': - setOpts.help = true; - setOpts.helpOut = stderr; - break; - default: - break; - } - } -} - -void MainOptHandler::help() { - fprintf(setOpts.helpOut, "Help budget {-ha}\n"); - fprintf(setOpts.helpOut, " -h --help Output this message.\n"); - fprintf(setOpts.helpOut, " -a --account Do budget -a -h for more info.\n"); -} - -const MainOptHandler::SetOpts *MainOptHandler::getSetOpts() const { - return &setOpts; -} diff --git a/src/optHandlers/mainOptHandler.h b/src/optHandlers/mainOptHandler.h deleted file mode 100644 index aa2c784..0000000 --- a/src/optHandlers/mainOptHandler.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// Created by quentin on 8/13/22. -// - -#ifndef BUDGET_MAINOPTHANDLER_H -#define BUDGET_MAINOPTHANDLER_H - -#include "optHandler.h" - -namespace Budget::OptHandlers { - class MainOptHandler : public OptHandler { - struct SetOpts { - FILE *helpOut = stdout; - bool help = false; - bool account = false; - int accountArgStart = -1; - }; - - public: - explicit MainOptHandler(const std::vector &argv); - - void parse() override; - - void help() override; - - [[nodiscard]] const SetOpts *getSetOpts() const; - - private: - SetOpts setOpts; - }; -} - -#endif //BUDGET_MAINOPTHANDLER_H diff --git a/src/optHandlers/optHandler.cpp b/src/optHandlers/optHandler.cpp deleted file mode 100644 index 75752a4..0000000 --- a/src/optHandlers/optHandler.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// -// Created by quentin on 8/13/22. -// - -#include "optHandler.h" - -#include - -using namespace Budget::OptHandlers; - - -OptHandler::OptHandler(std::vector argv) : argv(std::move(argv)) {} - -int OptHandler::getArgc() { - return argv.size(); -} - -char **OptHandler::getArgv() { - return argv.data(); -} diff --git a/src/optHandlers/optHandler.h b/src/optHandlers/optHandler.h deleted file mode 100644 index c9cd392..0000000 --- a/src/optHandlers/optHandler.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// Created by quentin on 8/13/22. -// - -#ifndef BUDGET_OPTHANDLER_H -#define BUDGET_OPTHANDLER_H - -#include -#include -#include -#include - -namespace Budget::OptHandlers { - class OptHandler { - public: - explicit OptHandler(std::vector argv); - - virtual void parse() = 0; - - int getArgc(); - - char **getArgv(); - - private: - - std::vector argv; - - virtual void help() = 0; - }; -} - - -#endif //BUDGET_OPTHANDLER_H diff --git a/utilities/math.cpp b/utilities/math.cpp deleted file mode 100644 index 4d43269..0000000 --- a/utilities/math.cpp +++ /dev/null @@ -1,97 +0,0 @@ -// -// Created by quentin on 9/13/22. -// - -#include "math.h" - -//Polynomial Fit -#include -#include - -using namespace Budget::Utilities; - -PolynomialFunction Math::polynomialFit(int degree, int numberOfPoints, const double x[], const double y[]) { - //Array that will store the values of sigma(xi),sigma(xi^2),sigma(xi^3)....sigma(xi^2numberOfPoints) - double X[2 * degree + 1]; - for (int i = 0; i < 2 * degree + 1; i++) { - X[i] = 0; - for (int j = 0; j < numberOfPoints; j++) { - //consecutive positions of the array will store numberOfPoints,sigma(xi),sigma(xi^2),sigma(xi^3)....sigma(xi^2n) - X[i] = X[i] + pow(x[j], i); - } - } - //B is the Normal matrix(augmented) that will store the equations, 'a' is for value of the final coefficients - double B[degree + 1][degree + 2], a[degree + 1]; - for (int i = 0; i <= degree; i++) { - for (int j = 0; j <= degree; j++) { - //Build the Normal matrix by storing the corresponding coefficients at the right positions except the last column of the matrix - B[i][j] = X[i + j]; - } - } - - //Array to store the values of sigma(yi),sigma(xi*yi),sigma(xi^2*yi)...sigma(xi^degree*yi) - double Y[degree + 1]; - for (int i = 0; i < degree + 1; i++) { - Y[i] = 0; - for (int j = 0; j < numberOfPoints; j++) { - //consecutive positions will store sigma(yi),sigma(xi*yi),sigma(xi^2*yi)...sigma(xi^degree*yi) - Y[i] = Y[i] + pow(x[j], i) * y[j]; - } - } - for (int i = 0; i <= degree; i++) { - //load the values of Y as the last column of B(Normal Matrix but augmented) - B[i][degree + 1] = Y[i]; - } - - //degree is made degree+1 because the Gaussian Elimination part below was for degree equations, but here degree is the degree of polynomial and for degree degree we get degree+1 equations - degree = degree + 1; - //From now Gaussian Elimination starts(can be ignored) to solve the set of linear equations (Pivotisation) - for (int i = 0; i < degree; i++) { - for (int k = i + 1; k < degree; k++) { - if (B[i][i] < B[k][i]) { - for (int j = 0; j <= degree; j++) { - double temp = B[i][j]; - B[i][j] = B[k][j]; - B[k][j] = temp; - } - } - } - } - - //loop to perform the gauss elimination - for (int i = 0; i < degree - 1; i++) { - for (int k = i + 1; k < degree; k++) { - double t = B[k][i] / B[i][i]; - for (int j = 0; j <= degree; j++) { - //make the elements below the pivot elements equal to zero or elimnate the variables - B[k][j] = B[k][j] - t * B[i][j]; - } - } - } - - //back-substitution - for (int i = degree - 1; i >= 0; i--) { - //x is an array whose values correspond to the values of x,y,z.. - //make the variable to be calculated equal to the rhs of the last equation - a[i] = B[i][degree]; - for (int j = 0; j < degree; j++) { - //then subtract all the lhs values except the coefficient of the variable whose value is being calculated - if (j != i) { - a[i] = a[i] - B[i][j] * a[j]; - } - } - //now finally divide the rhs by the coefficient of the variable to be calculated - a[i] = a[i] / B[i][i]; - } - std::cout << "\nThe values of the coefficients are as follows:\n"; - for (int i = 0; i < degree; i++) - std::cout << "x^" << i << "=" << a[i] << std::endl; // Print the values of x^0,x^1,x^2,x^3,.... - std::cout << "\nHence the fitted Polynomial is given by:\ny="; - for (int i = 0; i < degree; i++) - std::cout << " + (" << a[i] << ")" << "x^" << i; - std::cout << "\n"; - - std::vector va(a, a + degree); - return PolynomialFunction(va); -} - diff --git a/utilities/math.h b/utilities/math.h deleted file mode 100644 index 8a2d164..0000000 --- a/utilities/math.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// Created by quentin on 9/13/22. -// - -#ifndef BUDGET_MATH_H -#define BUDGET_MATH_H - - -#include "polynomialFunction.h" - -namespace Budget::Utilities { - class Math { - public: - static PolynomialFunction polynomialFit(int degree, int numberOfPoints, const double x[], const double y[]); - }; -} - - -#endif //BUDGET_MATH_H diff --git a/utilities/polynomialFunction.cpp b/utilities/polynomialFunction.cpp deleted file mode 100644 index 5247f62..0000000 --- a/utilities/polynomialFunction.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// -// Created by quentin on 9/13/22. -// - -#include "polynomialFunction.h" - -#include -#include - -using namespace Budget::Utilities; - -PolynomialFunction::PolynomialFunction(std::vector a) : a(std::move(a)) {} - -double PolynomialFunction::get(double x) { - double ret = 0; - for (int i = 0; i < a.size(); ++i) { - ret += a[i] * std::pow(x, i); - } - - return ret; -} diff --git a/utilities/polynomialFunction.h b/utilities/polynomialFunction.h deleted file mode 100644 index 116d046..0000000 --- a/utilities/polynomialFunction.h +++ /dev/null @@ -1,25 +0,0 @@ -// -// Created by quentin on 9/13/22. -// - -#ifndef BUDGET_POLYNOMIALFUNCTION_H -#define BUDGET_POLYNOMIALFUNCTION_H - - -#include - -namespace Budget::Utilities { - class PolynomialFunction { - private: - public: - explicit PolynomialFunction(std::vector a); - - double get(double x); - - private: - std::vector a; - }; -} - - -#endif //BUDGET_POLYNOMIALFUNCTION_H