Implement solution to ex02 trunk
authorLukas Jiriste <ljiriste@student.42prague.com>
Wed, 22 Jan 2025 15:25:15 +0000 (16:25 +0100)
committerLukas Jiriste <ljiriste@student.42prague.com>
Wed, 22 Jan 2025 15:25:15 +0000 (16:25 +0100)
ex02/Array.h [new file with mode: 0644]
ex02/Array.tpp [new file with mode: 0644]
ex02/Makefile [new file with mode: 0644]
ex02/main.cpp [new file with mode: 0644]

diff --git a/ex02/Array.h b/ex02/Array.h
new file mode 100644 (file)
index 0000000..3c63146
--- /dev/null
@@ -0,0 +1,29 @@
+#ifndef ARRAY_H
+# define ARRAY_H
+
+#include <cstddef>
+
+typedef std::size_t size_t;
+
+template<typename T>
+class Array
+{
+       private:
+               size_t  m_size;
+               T               *m_array;
+
+       public:
+               Array();
+               Array(size_t n);
+               Array(const Array &other);
+               ~Array();
+
+               Array   &operator=(const Array &other);
+
+               T               &operator[](size_t i);
+               size_t  size(void) const;
+};
+
+#include "Array.tpp"
+
+#endif // ARRAY_H
diff --git a/ex02/Array.tpp b/ex02/Array.tpp
new file mode 100644 (file)
index 0000000..ae2a2b6
--- /dev/null
@@ -0,0 +1,55 @@
+#include <exception>
+
+template<typename T>
+Array<T>::Array()
+       : m_size(0)
+       , m_array(NULL)
+{
+}
+
+template<typename T>
+Array<T>::Array(size_t n)
+       : m_size(n)
+       , m_array(new T[n])
+{
+}
+
+template<typename T>
+Array<T>::Array(const Array<T> &other)
+       : m_array(NULL)
+{
+       *this = other;
+}
+
+template<typename T>
+Array<T>::~Array()
+{
+       delete[] (m_array);
+}
+
+template<typename T>
+Array<T>       &Array<T>::operator=(const Array<T> &other)
+{
+       if (this == &other)
+               return (*this);
+       m_size = other.size();
+       delete[] (m_array);
+       m_array = new T[m_size];
+       for (size_t i(0); i < m_size; ++i)
+               m_array[i] = other.m_array[i];
+       return (*this);
+}
+
+template<typename T>
+T      &Array<T>::operator[](size_t i)
+{
+       if (i >= m_size)
+               throw (std::exception());
+       return (m_array[i]);
+}
+
+template<typename T>
+size_t Array<T>::size(void) const
+{
+       return (m_size);
+}
diff --git a/ex02/Makefile b/ex02/Makefile
new file mode 100644 (file)
index 0000000..e2cde4f
--- /dev/null
@@ -0,0 +1,52 @@
+CC := c++
+CFLAGS = -std=c++98 -Wall -Wextra -Werror -Wpedantic
+
+ifneq ("$(wildcard .debug)","")
+       CFLAGS += -g
+endif
+
+RM := rm -f
+
+INCDIR := inc
+INCDIR += $(addsuffix /inc, $(SUBPROJECTS));
+ifneq ($(INCLUDE),)
+       INCLUDE := $(addprefix -I, $(INCDIR))
+endif
+
+SRCDIR := .
+
+SOURCES :=     main.cpp                        \
+
+SOURCES := $(addprefix $(SRCDIR)/, $(SOURCES))
+
+OBJECTS := $(SOURCES:.cpp=.o)
+
+NAME := array
+
+all : $(NAME)
+
+debug : .debug
+       $(MAKE) all
+
+nodebug :
+       $(RM) .debug
+       $(MAKE) re
+
+.% :
+       $(MAKE) fclean
+       touch $@
+
+$(NAME) : $(OBJECTS)
+       $(CC) $(CFLAGS) -o $@ $^ $(LINKS)
+
+%.o : %.cpp
+       $(CC) $(CFLAGS) -o $@ -c $< $(INCLUDE)
+
+clean :
+       $(RM) $(OBJECTS)
+
+fclean : clean
+       $(RM) $(NAME)
+
+re : fclean
+       $(MAKE) all
diff --git a/ex02/main.cpp b/ex02/main.cpp
new file mode 100644 (file)
index 0000000..74e325d
--- /dev/null
@@ -0,0 +1,47 @@
+#include "Array.h"
+#include <iostream>
+
+template<typename T>
+void   print_array(Array<T> &arr)
+{
+       std::cout << "Array: ";
+       for (size_t i(0); i < arr.size() - 1; ++i)
+               std::cout << arr[i] << ", ";
+       std::cout << arr[arr.size() - 1] << '\n';
+}
+
+int    main(void)
+{
+       Array<int>                      i_arr(5);
+       Array<double>           d_arr(3);
+
+       print_array(i_arr);
+       print_array(d_arr);
+       i_arr[0] = 5;
+       i_arr[1] = 15;
+       i_arr[2] = 93;
+       i_arr[3] = 9282384;
+       i_arr[4] = 832;
+       d_arr[0] = 54.54654;
+       d_arr[1] = 0.234541;
+       try
+       {
+               d_arr[2] = 2146584.21;
+               d_arr[3] = 45.24584;
+       }
+       catch (const std::exception &exception)
+       {
+               std::cout << "Cought an invalid access\n";
+       }
+       print_array(i_arr);
+       print_array(d_arr);
+       try
+       {
+               std::cout << i_arr[6];
+       }
+       catch (const std::exception &exception)
+       {
+               std::cout << "Cought an invalid access\n";
+       }
+       return (0);
+}