From d0a1b09d9affe042a4a85dc754fd64dd28af62e7 Mon Sep 17 00:00:00 2001 From: whaffman Date: Sun, 24 Aug 2025 20:51:08 +0200 Subject: [PATCH] initial --- .gitignore | 4 ++ Makefile | 45 ++++++++++++++++++++++ common.mk | 41 ++++++++++++++++++++ ex02/Makefile | 2 + ex02/compile_commands.json | 36 +++++++++++++++++ ex02/inc/Jacobstahl.hpp | 20 ++++++++++ ex02/inc/PmergeMe.hpp | 29 ++++++++++++++ ex02/src/Jacobstahl.cpp | 79 ++++++++++++++++++++++++++++++++++++++ ex02/src/PmergeMe.cpp | 0 ex02/src/main.cpp | 27 +++++++++++++ 10 files changed, 283 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 common.mk create mode 100644 ex02/Makefile create mode 100644 ex02/compile_commands.json create mode 100644 ex02/inc/Jacobstahl.hpp create mode 100644 ex02/inc/PmergeMe.hpp create mode 100644 ex02/src/Jacobstahl.cpp create mode 100644 ex02/src/PmergeMe.cpp create mode 100644 ex02/src/main.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..10e3026 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.cache +*.d +*.o +PmergeMe \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b532113 --- /dev/null +++ b/Makefile @@ -0,0 +1,45 @@ +# **************************************************************************** # +# # +# :::::::: # +# Makefile :+: :+: # +# +:+ # +# By: whaffman +#+ # +# +#+ # +# Created: 2025/03/21 14:50:00 by whaffman #+# #+# # +# Updated: 2025/03/21 14:58:40 by whaffman ######## odam.nl # +# # +# **************************************************************************** # + +EX = $(shell find . -maxdepth 1 -type d -name 'ex*' -exec basename {} \;) + +all: + for ex in $(EX); do \ + $(MAKE) -C $$ex; \ + done + +clean: + for ex in $(EX); do \ + $(MAKE) -C $$ex clean; \ + done + +fclean: + for ex in $(EX); do \ + $(MAKE) -C $$ex fclean; \ + done + +re: + for ex in $(EX); do \ + $(MAKE) -C $$ex re; \ + done + +run: + @for ex in $(EX); do \ + echo "Running tests in $$ex:"; \ + $(MAKE) -sC $$ex fclean; \ + $(MAKE) -sC $$ex run; \ + $(MAKE) -sC $$ex fclean; \ + echo "Finished tests in $$ex"; \ + echo ""; \ + done + +.PHONY: all clean fclean re run \ No newline at end of file diff --git a/common.mk b/common.mk new file mode 100644 index 0000000..e1f8179 --- /dev/null +++ b/common.mk @@ -0,0 +1,41 @@ +# **************************************************************************** # +# # +# :::::::: # +# common.mk :+: :+: # +# +:+ # +# By: whaffman +#+ # +# +#+ # +# Created: 2025/03/21 15:00:16 by whaffman #+# #+# # +# Updated: 2025/03/21 15:04:44 by whaffman ######## odam.nl # +# # +# **************************************************************************** # + +INC = -I./inc +VPATH = src +SRC = $(notdir $(wildcard src/*.cpp)) +OBJ = $(SRC:.cpp=.o) +CC = c++ +CFLAGS = -Wall -Wextra -Werror -std=c++23 -MMD + +all: $(NAME) + +-include $(OBJ:.o=.d) + +run: all + ./$(NAME) + +$(NAME): $(OBJ) + $(CC) $(CFLAGS) $(OBJ) -o $(NAME) + +%.o: %.cpp + $(CC) $(CFLAGS) $(INC) -c $< -o $@ + +clean: + rm -f $(OBJ) + +fclean: clean + rm -f $(NAME) + +re: fclean all + +.PHONY: all clean fclean re run diff --git a/ex02/Makefile b/ex02/Makefile new file mode 100644 index 0000000..274982f --- /dev/null +++ b/ex02/Makefile @@ -0,0 +1,2 @@ +NAME = PmergeMe +include ../common.mk \ No newline at end of file diff --git a/ex02/compile_commands.json b/ex02/compile_commands.json new file mode 100644 index 0000000..4640426 --- /dev/null +++ b/ex02/compile_commands.json @@ -0,0 +1,36 @@ +[ + { + "arguments": [ + "/usr/bin/c++", + "-Wall", + "-Wextra", + "-Werror", + "-std=c++23", + "-I./inc", + "-c", + "-o", + "Jacobstahl.o", + "src/Jacobstahl.cpp" + ], + "directory": "/home/willem/projects/CPP09/ex02", + "file": "/home/willem/projects/CPP09/ex02/src/Jacobstahl.cpp", + "output": "/home/willem/projects/CPP09/ex02/Jacobstahl.o" + }, + { + "arguments": [ + "/usr/bin/c++", + "-Wall", + "-Wextra", + "-Werror", + "-std=c++23", + "-I./inc", + "-c", + "-o", + "main.o", + "src/main.cpp" + ], + "directory": "/home/willem/projects/CPP09/ex02", + "file": "/home/willem/projects/CPP09/ex02/src/main.cpp", + "output": "/home/willem/projects/CPP09/ex02/main.o" + } +] diff --git a/ex02/inc/Jacobstahl.hpp b/ex02/inc/Jacobstahl.hpp new file mode 100644 index 0000000..65ad3f3 --- /dev/null +++ b/ex02/inc/Jacobstahl.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include + +class Jacobstahl +{ + public: + Jacobstahl(); + Jacobstahl(const Jacobstahl &other); + Jacobstahl &operator=(const Jacobstahl &other); + ~Jacobstahl(); + + int get(int n); + std::vector getUpTo(int n); + int getAfter(int n); + + private: + int getRecursive(int n); + std::vector _jacobstahl_numbers; +}; diff --git a/ex02/inc/PmergeMe.hpp b/ex02/inc/PmergeMe.hpp new file mode 100644 index 0000000..7b51bbc --- /dev/null +++ b/ex02/inc/PmergeMe.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include +#include + +template +class PmergeMe +{ +public: + PmergeMe() = delete; + PmergeMe(const Container &container); + PmergeMe(const PmergeMe &other); + ~PmergeMe(); + + PmergeMe &operator=(const PmergeMe &other); + + void sort(); + +private: + std::vector _data_vector; + std::deque _data_deque; + std::vector _jacobstahl_numbers; + + int getJacobstahlNumber(int n); + int getJacobstahlNumberRecursive(int n); + + + +}; diff --git a/ex02/src/Jacobstahl.cpp b/ex02/src/Jacobstahl.cpp new file mode 100644 index 0000000..48f57f6 --- /dev/null +++ b/ex02/src/Jacobstahl.cpp @@ -0,0 +1,79 @@ +#include "Jacobstahl.hpp" + +#include + +Jacobstahl::Jacobstahl() : _jacobstahl_numbers() +{ + _jacobstahl_numbers.resize(2, -1); + _jacobstahl_numbers[0] = 0; + _jacobstahl_numbers[1] = 1; +} + +Jacobstahl::Jacobstahl(const Jacobstahl &other) : _jacobstahl_numbers(other._jacobstahl_numbers) {} + +Jacobstahl &Jacobstahl::operator=(const Jacobstahl &other) +{ + if (this != &other) + { + _jacobstahl_numbers = other._jacobstahl_numbers; + } + return *this; +} + +Jacobstahl::~Jacobstahl() {} + +int Jacobstahl::get(int n) +{ + if (n < 0) + throw std::invalid_argument("n must be non-negative"); + + if (n >= static_cast(_jacobstahl_numbers.size())) + _jacobstahl_numbers.resize(n + 1, -1); + + return getRecursive(n); +} + +int Jacobstahl::getRecursive(int n) +{ + if (n == 0) + return 0; + if (n == 1) + return 1; + + if (_jacobstahl_numbers.size() > static_cast(n) && _jacobstahl_numbers[n] != -1) + return _jacobstahl_numbers[n]; + + _jacobstahl_numbers[n] = getRecursive(n - 1) + 2 * getRecursive(n - 2); + return _jacobstahl_numbers[n]; +} + +std::vector Jacobstahl::getUpTo(int n) +{ + if (n < 0) + throw std::invalid_argument("n must be non-negative"); + + std::vector result; + while (true) + { + int number = get(result.size()); + if (number > n) + break; + result.push_back(number); + } + return result; +} + +int Jacobstahl::getAfter(int n) +{ + if (n < 0) + throw std::invalid_argument("n must be non-negative"); + + int index = 0; + while (true) + { + int number = get(index); + if (number > n) + return number; + index++; + } +} \ No newline at end of file diff --git a/ex02/src/PmergeMe.cpp b/ex02/src/PmergeMe.cpp new file mode 100644 index 0000000..e69de29 diff --git a/ex02/src/main.cpp b/ex02/src/main.cpp new file mode 100644 index 0000000..9359fde --- /dev/null +++ b/ex02/src/main.cpp @@ -0,0 +1,27 @@ +#include "Jacobstahl.hpp" +#include + +int main() +{ + Jacobstahl jacobstahl; + + std::cout << "First 10 Jacobstahl numbers:" << std::endl; + + for (int i = 0; i < 10; ++i) + { + std::cout << "Jacobstahl(" << i << ") = " << jacobstahl.get(i) << std::endl; + } + + + std::vector jacobstahl_numbers = jacobstahl.getUpTo(100); + std::cout << "Jacobstahl numbers up to 100:" << std::endl; + for (int num : jacobstahl_numbers) + { + std::cout << num << " "; + } + std::cout << std::endl; + + std::cout << "Jacobstahl number after 100: " << jacobstahl.getAfter(100) << std::endl; + + return 0; +}