From e72927e52cb3ed34b0fc7416882a6c05ea91dc92 Mon Sep 17 00:00:00 2001 From: yosyo Date: Fri, 15 Aug 2025 14:48:31 +0200 Subject: [PATCH] =?UTF-8?q?=E3=80=8C=F0=9F=8E=89=E3=80=8D=20init:=20hello?= =?UTF-8?q?=20world=20!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ex00/Makefile | 61 +++++++++++++++++++ ex00/PrintValue.hpp | 128 +++++++++++++++++++++++++++++++++++++++ ex00/ScalarConverter.cpp | 71 ++++++++++++++++++++++ ex00/ScalarConverter.hpp | 29 +++++++++ ex00/main.cpp | 10 +++ ex01/Makefile | 60 ++++++++++++++++++ ex01/Serializer.cpp | 30 +++++++++ ex01/Serializer.hpp | 20 ++++++ ex01/main.cpp | 28 +++++++++ ex02/Base.cpp | 78 ++++++++++++++++++++++++ ex02/Base.hpp | 30 +++++++++ ex02/Makefile | 61 +++++++++++++++++++ ex02/main.cpp | 12 ++++ 13 files changed, 618 insertions(+) create mode 100644 ex00/Makefile create mode 100644 ex00/PrintValue.hpp create mode 100644 ex00/ScalarConverter.cpp create mode 100644 ex00/ScalarConverter.hpp create mode 100644 ex00/main.cpp create mode 100644 ex01/Makefile create mode 100644 ex01/Serializer.cpp create mode 100644 ex01/Serializer.hpp create mode 100644 ex01/main.cpp create mode 100644 ex02/Base.cpp create mode 100644 ex02/Base.hpp create mode 100644 ex02/Makefile create mode 100644 ex02/main.cpp diff --git a/ex00/Makefile b/ex00/Makefile new file mode 100644 index 0000000..2971044 --- /dev/null +++ b/ex00/Makefile @@ -0,0 +1,61 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: adjoly +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/10/25 16:09:27 by adjoly #+# #+# # +# Updated: 2025/08/11 14:15:17 by mmoussou ### ########.fr # +# # +# **************************************************************************** # + +SHELL = bash + +NAME = ScalarConverter + +CC = c++ + +OBJSDIR = obj/ + +SRCS = $(shell find . -name '*.cpp') + +OBJS = $(addprefix $(OBJSDIR), $(SRCS:.cpp=.o)) + +FLAGS = -Wall -Werror -Wextra -std=c++98 -MMD -MP + +RED = \033[0;31m +GREEN = \033[0;32m +YELLOW = \033[1;33m +PURPLE = \e[0;35m +NC = \033[0m +DELETE = \x1B[2K\r + +ifeq ($(VERBOSE),true) + FLAGS += -D VERBOSE +endif + +all: $(NAME) + +$(NAME): $(OBJS) + @$(CC) $(FLAGS) -I . $(OBJS) -o $(NAME) + @printf "$(YELLOW)「✨」($(NAME)) Program compiled\n" + +$(OBJSDIR)%.o: %.cpp + @mkdir -p $(@D) + @$(CC) $(FLAGS) -I . -c $< -o $@ + @printf "$(DELETE)$(GREEN)「🔨」($<) Object compiled\n" + +clean: + @rm -f $(OBJS) + @printf "$(DELETE)$(RED)「🗑️」($(OBJS)) Object deleted\n" + +fclean: clean + @rm -f $(NAME) + @rm -Rf $(OBJSDIR) + @printf "$(RED)「🗑️」($(NAME)) Program deleted\n" + +re: fclean + @$(MAKE) -s all + +.PHONY: clean fclean all re diff --git a/ex00/PrintValue.hpp b/ex00/PrintValue.hpp new file mode 100644 index 0000000..37ffb72 --- /dev/null +++ b/ex00/PrintValue.hpp @@ -0,0 +1,128 @@ +#pragma once + +#include "ScalarConverter.hpp" + +void _printChar(const std::string &s) +{ + std::cout << "char: "; + if (!std::isprint(s[0])) + std::cout << "Non displayable" << std::endl; + else + std::cout << "'" << static_cast(s[0]) << "'" << std::endl; + + std::cout << "int: " << static_cast(s[0]) << std::endl; + std::cout << "float: " << std::fixed << static_cast(s[0]) << "f" << std::endl; + std::cout << "double: " << std::fixed << static_cast(s[0]) << std::endl; +} + +void _printInt(const std::string &s) +{ + long int nb = std::strtol(s.c_str(), NULL, 10); + + std::cout << "char: "; + if (nb < std::numeric_limits::min() || + nb > std::numeric_limits::max()) + std::cout << "impossible" << std::endl; + else if (!std::isprint(nb)) + std::cout << "Non displayable" << std::endl; + else + std::cout << "'" << static_cast(nb) << "'" << std::endl; + + std::cout << "int: "; + if (nb < std::numeric_limits::min() || + nb > std::numeric_limits::max()) + std::cout << "impossible" << std::endl; + else + std::cout << static_cast(nb) << std::endl; + + std::cout << "float: " << std::fixed << static_cast(nb) << "f" << std::endl; + std::cout << "double: " << std::fixed << static_cast(nb) << std::endl; +} + +void _printFloat(const std::string &s) +{ + long int nb = std::strtod(s.c_str(), NULL); + + std::cout << "char: "; + if (nb < std::numeric_limits::min() || + nb > std::numeric_limits::max()) + std::cout << "impossible" << std::endl; + else if (!std::isprint(nb)) + std::cout << "Non displayable" << std::endl; + else + std::cout << "'" << static_cast(nb) << "'" << std::endl; + + std::cout << "int: "; + if (nb < std::numeric_limits::min() || + nb > std::numeric_limits::max()) + std::cout << "impossible" << std::endl; + else + std::cout << static_cast(nb) << std::endl; + + std::cout << "float: "; + if (nb < std::numeric_limits::min() || + nb > std::numeric_limits::max()) + std::cout << "impossible" << std::endl; + else + std::cout << std::fixed << static_cast(nb) << "f" << std::endl; + std::cout << "double: " << std::fixed << static_cast(nb) << std::endl; +} + +void _printDouble(const std::string &s) +{ + long int nb = std::strtod(s.c_str(), NULL); + + std::cout << "char: "; + if (nb < std::numeric_limits::min() || + nb > std::numeric_limits::max()) + std::cout << "impossible" << std::endl; + else if (!std::isprint(nb)) + std::cout << "Non displayable" << std::endl; + else + std::cout << "'" << static_cast(nb) << "'" << std::endl; + + std::cout << "int: "; + if (nb < std::numeric_limits::min() || + nb > std::numeric_limits::max()) + std::cout << "impossible" << std::endl; + else + std::cout << static_cast(nb) << std::endl; + + std::cout << "float: "; + if (nb < std::numeric_limits::min() || + nb > std::numeric_limits::max()) + std::cout << "impossible" << std::endl; + else + std::cout << std::fixed << static_cast(nb) << "f" << std::endl; + std::cout << "double: " << std::fixed << static_cast(nb) << std::endl; +} + +void _printNan(const std::string &s) +{ + std::string input = s; + if (input == "inf" || input == "inff") + input = "+inf"; + if (input == "nan" || input == "-inf" || input == "+inf") + { + std::cout << "char: impossible\n"; + std::cout << "int: impossible\n"; + std::cout << "float: " << input << "f" << std::endl; + std::cout << "double: " << input << std::endl; + return; + } + if (input == "nanf" || input == "-inff" || input == "+inff") + { + std::cout << "char: impossible\n"; + std::cout << "int: impossible\n"; + std::cout << "float: " << input << std::endl; + std::cout << "double: "; + if (input == "nanf") + std::cout << "nan"; + else if (input == "-inff") + std::cout << "-inf"; + else + std::cout << "+inf"; + std::cout << std::endl; + } +} + diff --git a/ex00/ScalarConverter.cpp b/ex00/ScalarConverter.cpp new file mode 100644 index 0000000..765cd3d --- /dev/null +++ b/ex00/ScalarConverter.cpp @@ -0,0 +1,71 @@ +#include "ScalarConverter.hpp" +#include "PrintValue.hpp" + +ScalarConverter::ScalarConverter(void) { +} + +ScalarConverter::ScalarConverter(const ScalarConverter &cpy) { + if (this != &cpy) { + *this = cpy; + } +} + +ScalarConverter::~ScalarConverter(void) { +} + +ScalarConverter &ScalarConverter::operator=(const ScalarConverter &) { + return *this; +} + +bool _isNan(const std::string &str) { + if (str == "nan" || str == "nanf" || str == "-inf" || str == "-inff" || + str == "+inf" || str == "+inff" || str == "inf" || str == "inff") + return true; + return false; +} + +e_type _getType(const std::string &s) +{ + if (_isNan(s)) + return NAN; + + if (s.length() == 1 && !isdigit(s[0])) + return CHAR; + + char *err; + + (void)strtol(s.c_str(), &err, 10); + if (*err == 0) + return INT; + (void)strtod(s.c_str(), &err); + if (*err == 0) + return DOUBLE; + if (*err == 'f' && *(err + 1) == 0) + return FLOAT; + return NONE; + +} + +void ScalarConverter::convert(const std::string &s) +{ + switch (_getType(s)) + { + case CHAR: + _printChar(s); + break; + case INT: + _printInt(s); + break; + case FLOAT: + _printFloat(s); + break; + case DOUBLE: + _printDouble(s); + break; + case NAN: + _printNan(s); + break; + default: + std::cerr << "'" << s << "' does not convert to any of the availables types" << std::endl; + } +} diff --git a/ex00/ScalarConverter.hpp b/ex00/ScalarConverter.hpp new file mode 100644 index 0000000..acf8893 --- /dev/null +++ b/ex00/ScalarConverter.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +enum e_type { + CHAR, + INT, + FLOAT, + DOUBLE, + NAN, + NONE +}; + +class ScalarConverter { + public: + static void convert(const std::string &); + + private: + ScalarConverter(void); + ScalarConverter(const ScalarConverter &); + ~ScalarConverter(void); + + ScalarConverter &operator=(const ScalarConverter &); +}; diff --git a/ex00/main.cpp b/ex00/main.cpp new file mode 100644 index 0000000..d14d9de --- /dev/null +++ b/ex00/main.cpp @@ -0,0 +1,10 @@ +#include "ScalarConverter.hpp" +#include + +int main(int ac, char **av) { + if (ac < 2) { + std::cout << "needs an input ! D:" << std::endl; + return 1; + } + ScalarConverter::convert(av[1]); +} diff --git a/ex01/Makefile b/ex01/Makefile new file mode 100644 index 0000000..ebc85e3 --- /dev/null +++ b/ex01/Makefile @@ -0,0 +1,60 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: adjoly +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/10/25 16:09:27 by adjoly #+# #+# # +# Updated: 2025/04/09 12:23:41 by adjoly ### ########.fr # +# # +# **************************************************************************** # + +SHELL = bash + +NAME = Serializer + +CC = c++ + +OBJSDIR = obj/ + +SRCS = $(shell find . -name '*.cpp') + +OBJS = $(addprefix $(OBJSDIR), $(SRCS:.cpp=.o)) + +FLAGS = -Wall -Werror -Wextra -std=c++98 -MMD -MP + +RED = \033[0;31m +GREEN = \033[0;32m +YELLOW = \033[1;33m +PURPLE = \e[0;35m +NC = \033[0m +DELETE = \x1B[2K\r + +ifeq ($(VERBOSE),true) + FLAGS += -D VERBOSE +endif + +all: $(NAME) + +$(NAME): $(OBJS) + @$(CC) $(FLAGS) -I . $(OBJS) -o $(NAME) + @printf "$(YELLOW)「✨」($(NAME)) Program compiled\n" + +$(OBJSDIR)%.o: %.cpp + @mkdir -p $(@D) + @$(CC) $(FLAGS) -I . -c $< -o $@ + @printf "$(DELETE)$(GREEN)「🔨」($<) Object compiled\n" + +clean: + @rm -f $(OBJS) + @printf "$(DELETE)$(RED)「🗑️」($(OBJS)) Object deleted\n" + +fclean: clean + @rm -f $(NAME) + @rm -Rf $(OBJSDIR) + @printf "$(RED)「🗑️」($(NAME)) Program deleted\n" + +re: fclean all + +.PHONY: clean fclean all re diff --git a/ex01/Serializer.cpp b/ex01/Serializer.cpp new file mode 100644 index 0000000..a84f709 --- /dev/null +++ b/ex01/Serializer.cpp @@ -0,0 +1,30 @@ +#include "Serializer.hpp" +#include + +uintptr_t Serializer::serialize(Data *ptr) +{ + return reinterpret_cast(ptr); +} + +Data *Serializer::deserialize(uintptr_t raw) +{ + return reinterpret_cast(raw); +} + +Serializer::Serializer(void) +{ +} + +Serializer::Serializer(const Serializer &cpy) +{ + if (this != &cpy) + *this = cpy; +} + +Serializer::~Serializer(void) { +} + +Serializer &Serializer::operator=(const Serializer &) +{ + return *this; +} diff --git a/ex01/Serializer.hpp b/ex01/Serializer.hpp new file mode 100644 index 0000000..885b0cc --- /dev/null +++ b/ex01/Serializer.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include + +struct Data { + uintptr_t value; +}; + +class Serializer { + public: + static uintptr_t serialize(Data *ptr); + static Data *deserialize(uintptr_t raw); + + private: + Serializer(void); + ~Serializer(void); + Serializer(const Serializer &); + + Serializer &operator=(const Serializer &); +}; diff --git a/ex01/main.cpp b/ex01/main.cpp new file mode 100644 index 0000000..ebf7f1b --- /dev/null +++ b/ex01/main.cpp @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/09 12:16:46 by adjoly #+# #+# */ +/* Updated: 2025/08/15 13:59:26 by mmoussou ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "Serializer.hpp" +#include + +int main() +{ + Data data; + + data.value = 727; + std::cout << "data : (" << &data<< ") value = " << data.value << std::endl; + + uintptr_t serialized = Serializer::serialize(&data); + std::cout << "serialize : (" << std::hex << serialized << std::dec << ")\n"; + + Data *deserialized = Serializer::deserialize(serialized); + std::cout << "deserialize : (" << deserialized << ") value = " << deserialized->value << std::endl; +} diff --git a/ex02/Base.cpp b/ex02/Base.cpp new file mode 100644 index 0000000..7172ec8 --- /dev/null +++ b/ex02/Base.cpp @@ -0,0 +1,78 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* Base.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/09 13:23:31 by adjoly #+# #+# */ +/* Updated: 2025/08/15 14:47:35 by mmoussou ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "Base.hpp" +#include +#include + +Base *generate(void) +{ + std::srand(time(0)); + + switch (std::rand() % 3) { + case 0: + std::cout << "A class generated :D" << std::endl; + return new A; + case 1: + std::cout << "B class generated :D" << std::endl; + return new B; + case 2: + std::cout << "C class generated :D" << std::endl; + return new C; + }; + return new A; +} + +void identify(Base *p) +{ + if (dynamic_cast(p)) + { + std::cout << "omg it's an A object !" << std::endl; + return; + } + if (dynamic_cast(p)) + { + std::cout << "omg it's a B object !" << std::endl; + return; + } + if (dynamic_cast(p)) + { + std::cout << "omg it's a C object !" << std::endl; + return; + } + std::cout << "what is this D:" << std::endl; +} + +void identify(Base &p) +{ + try { + (void)dynamic_cast(p); + std::cout << "omg it's an A object !" << std::endl; + return; + } + catch (...) {} + try { + (void)dynamic_cast(p); + std::cout << "omg it's an B object !" << std::endl; + return; + } + catch (...) {} + try { + (void)dynamic_cast(p); + std::cout << "omg it's an C object !" << std::endl; + return; + } + catch (...) {} + std::cout << "what is this D:" << std::endl; +} + +Base::~Base(void) {} diff --git a/ex02/Base.hpp b/ex02/Base.hpp new file mode 100644 index 0000000..65df5f5 --- /dev/null +++ b/ex02/Base.hpp @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* Base.hpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/09 13:19:32 by adjoly #+# #+# */ +/* Updated: 2025/08/15 14:40:23 by mmoussou ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#pragma once + +class Base { + public: + virtual ~Base(void); + + private: +}; + + +class A : public Base {}; +class B : public Base {}; +class C : public Base {}; + +Base *generate(); + +void identify(Base *p); +void identify(Base &p); diff --git a/ex02/Makefile b/ex02/Makefile new file mode 100644 index 0000000..063886a --- /dev/null +++ b/ex02/Makefile @@ -0,0 +1,61 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: adjoly +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/10/25 16:09:27 by adjoly #+# #+# # +# Updated: 2025/08/11 14:44:12 by mmoussou ### ########.fr # +# # +# **************************************************************************** # + +SHELL = bash + +NAME = Base + +CC = c++ + +OBJSDIR = obj/ + +SRCS = $(shell find . -name '*.cpp') + +OBJS = $(addprefix $(OBJSDIR), $(SRCS:.cpp=.o)) + +FLAGS = -Wall -Werror -Wextra -std=c++98 -MMD -MP + +RED = \033[0;31m +GREEN = \033[0;32m +YELLOW = \033[1;33m +PURPLE = \e[0;35m +NC = \033[0m +DELETE = \x1B[2K\r + +ifeq ($(VERBOSE),true) + FLAGS += -D VERBOSE +endif + +all: $(NAME) + +$(NAME): $(OBJS) + @$(CC) $(FLAGS) -I . $(OBJS) -o $(NAME) + @printf "$(YELLOW)「✨」($(NAME)) Program compiled\n" + +$(OBJSDIR)%.o: %.cpp + @mkdir -p $(@D) + @$(CC) $(FLAGS) -I . -c $< -o $@ + @printf "$(DELETE)$(GREEN)「🔨」($<) Object compiled\n" + +clean: + @rm -f $(OBJS) + @printf "$(DELETE)$(RED)「🗑️」($(OBJS)) Object deleted\n" + +fclean: clean + @rm -f $(NAME) + @rm -Rf $(OBJSDIR) + @printf "$(RED)「🗑️」($(NAME)) Program deleted\n" + +re: fclean + $(MAKE) all + +.PHONY: clean fclean all re diff --git a/ex02/main.cpp b/ex02/main.cpp new file mode 100644 index 0000000..afb4977 --- /dev/null +++ b/ex02/main.cpp @@ -0,0 +1,12 @@ +#include "Base.hpp" +#include + +int main() +{ + Base *base = generate(); + std::cout << "pointer idendifer : "; + identify(base); + std::cout << "ref idendifer : "; + identify(*base); + delete base; +}