From b811fb48a52cae5d64b2c2063ce9b9276850f751 Mon Sep 17 00:00:00 2001 From: tmalkoc Date: Wed, 14 Nov 2018 16:36:01 +0100 Subject: [PATCH 1/4] Tvrtko Malkoc - day3 - exercise 01 --- exercise/01/animal.cpp | 49 +++++++ exercise/01/animal.h | 54 ++++++++ exercise/01/animals.sln | 25 ++++ exercise/01/animals.vcxproj | 190 ++++++++++++++-------------- exercise/01/animals.vcxproj.filters | 52 ++++---- exercise/01/leg_counter.cpp | 23 ++++ exercise/01/leg_counter.h | 19 +++ exercise/01/test.cpp | 2 + 8 files changed, 297 insertions(+), 117 deletions(-) create mode 100644 exercise/01/animal.cpp create mode 100644 exercise/01/animal.h create mode 100644 exercise/01/animals.sln create mode 100644 exercise/01/leg_counter.cpp create mode 100644 exercise/01/leg_counter.h diff --git a/exercise/01/animal.cpp b/exercise/01/animal.cpp new file mode 100644 index 0000000..926e451 --- /dev/null +++ b/exercise/01/animal.cpp @@ -0,0 +1,49 @@ +#include "animal.h" + +animal::animal(unsigned int legs, const wchar_t species[]) : + legs_(legs), + species_(species) +{} + +std::wstring animal::species() const +{ + return species_; +} + +unsigned animal::legs() const +{ + return legs_; +} + +spider::spider(const wchar_t species[]) : + animal(8, species) +{} + +insect::insect(const wchar_t species[]) : + animal(6, species) +{} + +bird::bird(const wchar_t species[]) : + animal(2, species) +{} + +tarantula::tarantula() : + spider(L"tarantula") +{} + +cockroach::cockroach() : + insect(L"cockroach") +{} + +sparrow::sparrow() : bird(L"sparrow") +{} + +animal* animal_factory(int id) +{ + switch (id) { + case 1: return new cockroach; + case 2: return new sparrow; + case 3: return new tarantula; + default: return nullptr; + } +} diff --git a/exercise/01/animal.h b/exercise/01/animal.h new file mode 100644 index 0000000..5d27b67 --- /dev/null +++ b/exercise/01/animal.h @@ -0,0 +1,54 @@ +#pragma once +#include + +class animal +{ +public: + animal(unsigned int legs, const wchar_t species[]); + virtual ~animal() = default; + + std::wstring species() const; + unsigned int legs() const; + +private: + unsigned int legs_; + const wchar_t * const species_; +}; + +class spider : public animal +{ +public: + spider(const wchar_t species[]); +}; + +class insect : public animal +{ +public: + insect(const wchar_t species[]); +}; + +class bird : public animal +{ +public: + bird(const wchar_t species[]); +}; + +class tarantula : public spider +{ +public: + tarantula(); +}; + +class cockroach : public insect +{ +public: + cockroach(); +}; + +class sparrow : public bird +{ +public: + sparrow(); +}; + +animal* animal_factory(int id); \ No newline at end of file diff --git a/exercise/01/animals.sln b/exercise/01/animals.sln new file mode 100644 index 0000000..4e0307e --- /dev/null +++ b/exercise/01/animals.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28010.2036 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "animals", "animals.vcxproj", "{BB15329E-10D8-4740-94BC-64C50BA4EE12}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BB15329E-10D8-4740-94BC-64C50BA4EE12}.Debug|x86.ActiveCfg = Debug|Win32 + {BB15329E-10D8-4740-94BC-64C50BA4EE12}.Debug|x86.Build.0 = Debug|Win32 + {BB15329E-10D8-4740-94BC-64C50BA4EE12}.Release|x86.ActiveCfg = Release|Win32 + {BB15329E-10D8-4740-94BC-64C50BA4EE12}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {B60A737A-D29C-4A65-8FE9-3B9B772F7ED6} + EndGlobalSection +EndGlobal diff --git a/exercise/01/animals.vcxproj b/exercise/01/animals.vcxproj index 0c14cbf..47ff178 100644 --- a/exercise/01/animals.vcxproj +++ b/exercise/01/animals.vcxproj @@ -1,95 +1,97 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {BB15329E-10D8-4740-94BC-64C50BA4EE12} - Win32Proj - array - 10.0.17134.0 - - - - DynamicLibrary - true - v141 - Unicode - false - - - DynamicLibrary - false - v141 - true - Unicode - false - - - - - - - - - - - - - true - - - true - - - - NotUsing - Level3 - Disabled - $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;%(PreprocessorDefinitions) - true - - - Windows - true - $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories) - - - - - Level3 - NotUsing - MaxSpeed - true - true - $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;%(PreprocessorDefinitions) - true - - - Windows - true - true - true - $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories) - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {BB15329E-10D8-4740-94BC-64C50BA4EE12} + Win32Proj + array + 10.0.17134.0 + + + + DynamicLibrary + true + v141 + Unicode + false + + + DynamicLibrary + false + v141 + true + Unicode + false + + + + + + + + + + + + + true + + + true + + + + NotUsing + Level3 + Disabled + $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;%(PreprocessorDefinitions) + true + + + Windows + true + $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories) + + + + + Level3 + NotUsing + MaxSpeed + true + true + $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories) + + + + + + + + + + + + + + \ No newline at end of file diff --git a/exercise/01/animals.vcxproj.filters b/exercise/01/animals.vcxproj.filters index ad4d9ab..232a3ad 100644 --- a/exercise/01/animals.vcxproj.filters +++ b/exercise/01/animals.vcxproj.filters @@ -1,24 +1,30 @@ - - - - - {f2ada0ee-91e7-4bbd-b33d-837567340243} - - - {3cc0fd48-6585-4969-94bd-406daa5f786b} - - - - - test - - - src - - - - - src - - + + + + + {f2ada0ee-91e7-4bbd-b33d-837567340243} + + + {3cc0fd48-6585-4969-94bd-406daa5f786b} + + + + + test + + + src + + + src + + + + + src + + + src + + \ No newline at end of file diff --git a/exercise/01/leg_counter.cpp b/exercise/01/leg_counter.cpp new file mode 100644 index 0000000..77d76cb --- /dev/null +++ b/exercise/01/leg_counter.cpp @@ -0,0 +1,23 @@ +#include "leg_counter.h" + +leg_counter::~leg_counter() +{ + for (auto animal : anima_vector_) + delete animal; +} + +std::wstring leg_counter::add_animal(const animal* animal) +{ + if (animal == nullptr) + return L""; + anima_vector_.push_back(animal); + return animal->species(); +} + +unsigned leg_counter::legs() const +{ + unsigned sum = 0; + for (auto animal : anima_vector_) + sum += animal->legs(); + return sum; +} diff --git a/exercise/01/leg_counter.h b/exercise/01/leg_counter.h new file mode 100644 index 0000000..1c3bf62 --- /dev/null +++ b/exercise/01/leg_counter.h @@ -0,0 +1,19 @@ +#pragma once +#include "animal.h" +#include + +class leg_counter +{ +public: + leg_counter() = default; + leg_counter(const leg_counter&) = delete; + leg_counter(leg_counter&&) = delete; + ~leg_counter(); + leg_counter& operator=(const leg_counter&) = delete; + + std::wstring add_animal(const animal* animal); + unsigned int legs() const; + +private: + std::vector anima_vector_; +}; diff --git a/exercise/01/test.cpp b/exercise/01/test.cpp index f7f2c1f..935ccf4 100644 --- a/exercise/01/test.cpp +++ b/exercise/01/test.cpp @@ -1,4 +1,5 @@ #include "CppUnitTest.h" +#include "leg_counter.h" using namespace Microsoft::VisualStudio::CppUnitTestFramework; #include "animal.h" @@ -40,6 +41,7 @@ TEST_CLASS(test_animal_hierarchy) Assert::AreEqual(L"tarantula", lc.add_animal(animal_factory(3)).c_str()); Assert::AreEqual(16u, lc.legs()); } + TEST_METHOD(legg_counter_same_animal) { leg_counter lc; From 04abaaee649d05b3a90fac35f648b2d62eac4db4 Mon Sep 17 00:00:00 2001 From: tmalkoc Date: Fri, 16 Nov 2018 11:02:36 +0100 Subject: [PATCH 2/4] code improvements --- exercise/01/animal.cpp | 42 ++++++++++++++++++----------------- exercise/01/animal.h | 44 ++++++++++++++++++++++++++----------- exercise/01/leg_counter.cpp | 15 +++---------- exercise/01/leg_counter.h | 13 ++++------- exercise/01/test.cpp | 11 +++++----- 5 files changed, 65 insertions(+), 60 deletions(-) diff --git a/exercise/01/animal.cpp b/exercise/01/animal.cpp index 926e451..a71db07 100644 --- a/exercise/01/animal.cpp +++ b/exercise/01/animal.cpp @@ -1,30 +1,42 @@ #include "animal.h" -animal::animal(unsigned int legs, const wchar_t species[]) : +std::unique_ptr animal_factory(const anuanimal_enum id) +{ + switch (id) + { + case cockroach_id: return std::make_unique(); + case sparrow_id: return std::make_unique(); + case tarantula_id: return std::make_unique(); + } + return {}; +} + +animal_base::animal_base(unsigned int legs, const std::wstring& species) : legs_(legs), species_(species) -{} +{ +} -std::wstring animal::species() const +std::wstring animal_base::species() const { return species_; } -unsigned animal::legs() const +unsigned animal_base::legs() const { return legs_; } -spider::spider(const wchar_t species[]) : - animal(8, species) +spider::spider(const std::wstring& species) : + animal_base(8, species) {} -insect::insect(const wchar_t species[]) : - animal(6, species) +insect::insect(const std::wstring& species) : + animal_base(6, species) {} -bird::bird(const wchar_t species[]) : - animal(2, species) +bird::bird(const std::wstring& species) : + animal_base(2, species) {} tarantula::tarantula() : @@ -37,13 +49,3 @@ cockroach::cockroach() : sparrow::sparrow() : bird(L"sparrow") {} - -animal* animal_factory(int id) -{ - switch (id) { - case 1: return new cockroach; - case 2: return new sparrow; - case 3: return new tarantula; - default: return nullptr; - } -} diff --git a/exercise/01/animal.h b/exercise/01/animal.h index 5d27b67..f99a4cb 100644 --- a/exercise/01/animal.h +++ b/exercise/01/animal.h @@ -1,54 +1,72 @@ #pragma once #include +#include + +enum anuanimal_enum +{ + cockroach_id = 1, + sparrow_id = 2, + tarantula_id = 3 +}; class animal { public: - animal(unsigned int legs, const wchar_t species[]); + virtual std::wstring species() const = 0; + virtual unsigned int legs() const = 0; virtual ~animal() = default; +}; + +std::unique_ptr animal_factory(anuanimal_enum id); - std::wstring species() const; - unsigned int legs() const; +class animal_base : public animal +{ +public: + animal_base(unsigned int legs, const std::wstring& species); + + std::wstring species() const override; + unsigned int legs() const override; private: unsigned int legs_; - const wchar_t * const species_; + std::wstring species_; }; -class spider : public animal +class spider : public animal_base { public: - spider(const wchar_t species[]); + spider(const std::wstring& species); }; -class insect : public animal +class insect : public animal_base { public: - insect(const wchar_t species[]); + insect(const std::wstring& species); }; -class bird : public animal +class bird : public animal_base { public: - bird(const wchar_t species[]); + bird(const std::wstring& species); }; class tarantula : public spider { public: + static const anuanimal_enum id = tarantula_id; tarantula(); }; class cockroach : public insect { public: + static const anuanimal_enum id = cockroach_id; cockroach(); }; class sparrow : public bird { public: + static const int anuanimal_enum = sparrow_id; sparrow(); -}; - -animal* animal_factory(int id); \ No newline at end of file +}; \ No newline at end of file diff --git a/exercise/01/leg_counter.cpp b/exercise/01/leg_counter.cpp index 77d76cb..15666e7 100644 --- a/exercise/01/leg_counter.cpp +++ b/exercise/01/leg_counter.cpp @@ -1,23 +1,14 @@ #include "leg_counter.h" -leg_counter::~leg_counter() -{ - for (auto animal : anima_vector_) - delete animal; -} - -std::wstring leg_counter::add_animal(const animal* animal) +std::wstring leg_counter::add_animal(std::unique_ptr animal) { if (animal == nullptr) return L""; - anima_vector_.push_back(animal); + sum_ += animal->legs(); return animal->species(); } unsigned leg_counter::legs() const { - unsigned sum = 0; - for (auto animal : anima_vector_) - sum += animal->legs(); - return sum; + return sum_; } diff --git a/exercise/01/leg_counter.h b/exercise/01/leg_counter.h index 1c3bf62..4cc6d47 100644 --- a/exercise/01/leg_counter.h +++ b/exercise/01/leg_counter.h @@ -2,18 +2,13 @@ #include "animal.h" #include -class leg_counter +class leg_counter final { public: - leg_counter() = default; - leg_counter(const leg_counter&) = delete; - leg_counter(leg_counter&&) = delete; - ~leg_counter(); - leg_counter& operator=(const leg_counter&) = delete; - - std::wstring add_animal(const animal* animal); + leg_counter() : sum_(0) {} + std::wstring add_animal(std::unique_ptr animal); unsigned int legs() const; private: - std::vector anima_vector_; + int sum_; }; diff --git a/exercise/01/test.cpp b/exercise/01/test.cpp index 935ccf4..edb7fad 100644 --- a/exercise/01/test.cpp +++ b/exercise/01/test.cpp @@ -36,18 +36,17 @@ TEST_CLASS(test_animal_hierarchy) TEST_METHOD(legg_counter_different_animals) { leg_counter lc; - Assert::AreEqual(L"cockroach", lc.add_animal(animal_factory(1)).c_str()); - Assert::AreEqual(L"sparrow", lc.add_animal(animal_factory(2)).c_str()); - Assert::AreEqual(L"tarantula", lc.add_animal(animal_factory(3)).c_str()); + Assert::AreEqual(L"cockroach", lc.add_animal(animal_factory(cockroach_id)).c_str()); + Assert::AreEqual(L"sparrow", lc.add_animal(animal_factory(sparrow_id)).c_str()); + Assert::AreEqual(L"tarantula", lc.add_animal(animal_factory(tarantula_id)).c_str()); Assert::AreEqual(16u, lc.legs()); } TEST_METHOD(legg_counter_same_animal) { leg_counter lc; - lc.add_animal(animal_factory(2)); - lc.add_animal(animal_factory(2)); + lc.add_animal(animal_factory(sparrow_id)); + lc.add_animal(animal_factory(sparrow_id)); Assert::AreEqual(4u, lc.legs()); } - }; From 8ad02a9160248a44ceac00b32f15a2cfde2d7e72 Mon Sep 17 00:00:00 2001 From: tmalkoc Date: Fri, 16 Nov 2018 11:19:46 +0100 Subject: [PATCH 3/4] add_animal accepts const std::unique_ptr& --- exercise/01/leg_counter.cpp | 8 ++++---- exercise/01/leg_counter.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/exercise/01/leg_counter.cpp b/exercise/01/leg_counter.cpp index 15666e7..0ac4e7f 100644 --- a/exercise/01/leg_counter.cpp +++ b/exercise/01/leg_counter.cpp @@ -1,11 +1,11 @@ #include "leg_counter.h" -std::wstring leg_counter::add_animal(std::unique_ptr animal) +std::wstring leg_counter::add_animal(const std::unique_ptr& animal_ptr) { - if (animal == nullptr) + if (animal_ptr == nullptr) return L""; - sum_ += animal->legs(); - return animal->species(); + sum_ += animal_ptr->legs(); + return animal_ptr->species(); } unsigned leg_counter::legs() const diff --git a/exercise/01/leg_counter.h b/exercise/01/leg_counter.h index 4cc6d47..b009d45 100644 --- a/exercise/01/leg_counter.h +++ b/exercise/01/leg_counter.h @@ -6,7 +6,7 @@ class leg_counter final { public: leg_counter() : sum_(0) {} - std::wstring add_animal(std::unique_ptr animal); + std::wstring add_animal(const std::unique_ptr&); unsigned int legs() const; private: From 3fbfe01d93e8981670083b6f8823399a3fffae11 Mon Sep 17 00:00:00 2001 From: tmalkoc Date: Fri, 16 Nov 2018 13:33:37 +0100 Subject: [PATCH 4/4] enum -> enum class --- exercise/01/animal.cpp | 6 +++--- exercise/01/animal.h | 8 ++++---- exercise/01/test.cpp | 10 +++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/exercise/01/animal.cpp b/exercise/01/animal.cpp index a71db07..8d576da 100644 --- a/exercise/01/animal.cpp +++ b/exercise/01/animal.cpp @@ -4,9 +4,9 @@ std::unique_ptr animal_factory(const anuanimal_enum id) { switch (id) { - case cockroach_id: return std::make_unique(); - case sparrow_id: return std::make_unique(); - case tarantula_id: return std::make_unique(); + case anuanimal_enum::cockroach_id: return std::make_unique(); + case anuanimal_enum::sparrow_id: return std::make_unique(); + case anuanimal_enum::tarantula_id: return std::make_unique(); } return {}; } diff --git a/exercise/01/animal.h b/exercise/01/animal.h index f99a4cb..b62504b 100644 --- a/exercise/01/animal.h +++ b/exercise/01/animal.h @@ -2,7 +2,7 @@ #include #include -enum anuanimal_enum +enum class anuanimal_enum { cockroach_id = 1, sparrow_id = 2, @@ -53,20 +53,20 @@ class bird : public animal_base class tarantula : public spider { public: - static const anuanimal_enum id = tarantula_id; + static const anuanimal_enum id = anuanimal_enum::tarantula_id; tarantula(); }; class cockroach : public insect { public: - static const anuanimal_enum id = cockroach_id; + static const anuanimal_enum id = anuanimal_enum::cockroach_id; cockroach(); }; class sparrow : public bird { public: - static const int anuanimal_enum = sparrow_id; + static const anuanimal_enum id = anuanimal_enum::sparrow_id; sparrow(); }; \ No newline at end of file diff --git a/exercise/01/test.cpp b/exercise/01/test.cpp index edb7fad..d1693a9 100644 --- a/exercise/01/test.cpp +++ b/exercise/01/test.cpp @@ -36,17 +36,17 @@ TEST_CLASS(test_animal_hierarchy) TEST_METHOD(legg_counter_different_animals) { leg_counter lc; - Assert::AreEqual(L"cockroach", lc.add_animal(animal_factory(cockroach_id)).c_str()); - Assert::AreEqual(L"sparrow", lc.add_animal(animal_factory(sparrow_id)).c_str()); - Assert::AreEqual(L"tarantula", lc.add_animal(animal_factory(tarantula_id)).c_str()); + Assert::AreEqual(L"cockroach", lc.add_animal(animal_factory(anuanimal_enum::cockroach_id)).c_str()); + Assert::AreEqual(L"sparrow", lc.add_animal(animal_factory(anuanimal_enum::sparrow_id)).c_str()); + Assert::AreEqual(L"tarantula", lc.add_animal(animal_factory(anuanimal_enum::tarantula_id)).c_str()); Assert::AreEqual(16u, lc.legs()); } TEST_METHOD(legg_counter_same_animal) { leg_counter lc; - lc.add_animal(animal_factory(sparrow_id)); - lc.add_animal(animal_factory(sparrow_id)); + lc.add_animal(animal_factory(anuanimal_enum::sparrow_id)); + lc.add_animal(animal_factory(anuanimal_enum::sparrow_id)); Assert::AreEqual(4u, lc.legs()); } };