From d69cd947f328f87ac1e986c4fcab0c5807e3bd35 Mon Sep 17 00:00:00 2001 From: Mislav Date: Wed, 14 Nov 2018 16:28:08 +0100 Subject: [PATCH 1/2] Solution for day 3 exercise 1 --- exercise/01/animal.cpp | 64 ++++++++++++++++++++++++++ exercise/01/animal.h | 55 ++++++++++++++++++++++ exercise/01/animals.sln | 25 ++++++++++ exercise/01/animals.vcxproj | 6 +-- exercise/01/animals.vcxproj.user | 4 ++ exercise/01/test.cpp | 79 ++++++++++++++++---------------- 6 files changed, 191 insertions(+), 42 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/animals.vcxproj.user diff --git a/exercise/01/animal.cpp b/exercise/01/animal.cpp new file mode 100644 index 0000000..25baf81 --- /dev/null +++ b/exercise/01/animal.cpp @@ -0,0 +1,64 @@ +#include "animal.h" +#include + +animal::~animal() = default; + +namespace species +{ + enum { cockroach = 1, sparrow, tarantula }; +} + +unsigned insect::legs() const noexcept +{ + return 6; +} + +unsigned bird::legs() const noexcept +{ + return 2; +} + +unsigned spider::legs() const noexcept +{ + return 8; +} + +std::wstring cockroach::species() const noexcept +{ + return L"cockroach"; +} + +std::wstring sparrow::species() const noexcept +{ + return L"sparrow"; +} + +std::wstring tarantula::species() const noexcept +{ + return L"tarantula"; +} + +std::wstring leg_counter::add_animal(std::unique_ptr animal) +{ + std::wstring species{animal->species()}; + animals_.push_back(std::move(animal)); + return species; +} + +unsigned leg_counter::legs() const +{ + int sum{}; + std::for_each(animals_.cbegin(), animals_.cend(), [&sum](const std::unique_ptr& a) { sum += a->legs(); }); + return sum; +} + +std::unique_ptr animal_factory(const int animal) +{ + switch (animal) + { + case species::cockroach: return std::make_unique(cockroach{}); + case species::sparrow: return std::make_unique(sparrow{}); + case species::tarantula: return std::make_unique(tarantula{}); + default: throw std::invalid_argument{"Unknown animal species"}; + } +} diff --git a/exercise/01/animal.h b/exercise/01/animal.h new file mode 100644 index 0000000..7038d08 --- /dev/null +++ b/exercise/01/animal.h @@ -0,0 +1,55 @@ +#pragma once +#include +#include + +class animal +{ +public: + virtual std::wstring species() const noexcept = 0; + virtual unsigned int legs() const noexcept = 0; + virtual ~animal() = 0; +}; + +class insect : public animal +{ + unsigned legs() const noexcept override; +}; + +class bird : public animal +{ + unsigned legs() const noexcept override; +}; + +class spider : public animal +{ + unsigned legs() const noexcept override; +}; + +class cockroach : public insect +{ + std::wstring species() const noexcept override; +}; + + +class sparrow : public bird +{ + std::wstring species() const noexcept override; +}; + + +class tarantula : public spider +{ + std::wstring species() const noexcept override; +}; + + +class leg_counter +{ +private: + std::vector> animals_; +public: + std::wstring add_animal(std::unique_ptr animal); + unsigned legs() const; +}; + +std::unique_ptr animal_factory(int animal); diff --git a/exercise/01/animals.sln b/exercise/01/animals.sln new file mode 100644 index 0000000..29cc82f --- /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.2050 +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 = {DBE656B2-233A-4E04-B832-CD3736F5233D} + EndGlobalSection +EndGlobal diff --git a/exercise/01/animals.vcxproj b/exercise/01/animals.vcxproj index 0c14cbf..42f52e7 100644 --- a/exercise/01/animals.vcxproj +++ b/exercise/01/animals.vcxproj @@ -82,13 +82,13 @@ $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories) - - - + + + diff --git a/exercise/01/animals.vcxproj.user b/exercise/01/animals.vcxproj.user new file mode 100644 index 0000000..be25078 --- /dev/null +++ b/exercise/01/animals.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/exercise/01/test.cpp b/exercise/01/test.cpp index f7f2c1f..dbeb798 100644 --- a/exercise/01/test.cpp +++ b/exercise/01/test.cpp @@ -6,46 +6,47 @@ using namespace Microsoft::VisualStudio::CppUnitTestFramework; TEST_CLASS(test_animal_hierarchy) { public: - TEST_METHOD(concrete_insect) - { - cockroach c; - insect& i = c; - animal& a = c; - Assert::AreEqual(L"cockroach", a.species().c_str()); - Assert::AreEqual(6u, a.legs()); - } - TEST_METHOD(concrete_bird) - { - sparrow s; - bird& b = s; - animal& a = s; - Assert::AreEqual(L"sparrow", a.species().c_str()); - Assert::AreEqual(2u, a.legs()); - } + TEST_METHOD(concrete_insect) + { + cockroach c; + insect& i = c; + animal& a = c; + Assert::AreEqual(L"cockroach", a.species().c_str()); + Assert::AreEqual(6u, a.legs()); + } - TEST_METHOD(concrete_spider) - { - tarantula t; - spider& s = t; - animal& a = t; - Assert::AreEqual(L"tarantula", a.species().c_str()); - Assert::AreEqual(8u, a.legs()); - } + TEST_METHOD(concrete_bird) + { + sparrow s; + bird& b = s; + animal& a = s; + Assert::AreEqual(L"sparrow", a.species().c_str()); + Assert::AreEqual(2u, a.legs()); + } - 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(16u, lc.legs()); - } - TEST_METHOD(legg_counter_same_animal) - { - leg_counter lc; - lc.add_animal(animal_factory(2)); - lc.add_animal(animal_factory(2)); - Assert::AreEqual(4u, lc.legs()); - } + TEST_METHOD(concrete_spider) + { + tarantula t; + spider& s = t; + animal& a = t; + Assert::AreEqual(L"tarantula", a.species().c_str()); + Assert::AreEqual(8u, a.legs()); + } + 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(16u, lc.legs()); + } + + TEST_METHOD(legg_counter_same_animal) + { + leg_counter lc; + lc.add_animal(animal_factory(2)); + lc.add_animal(animal_factory(2)); + Assert::AreEqual(4u, lc.legs()); + } }; From dfebe344c1c0dd3a654df283848b1ec7318089ea Mon Sep 17 00:00:00 2001 From: Mislav Date: Wed, 14 Nov 2018 21:16:35 +0100 Subject: [PATCH 2/2] for_each -> accumulate --- exercise/01/animal.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/exercise/01/animal.cpp b/exercise/01/animal.cpp index 25baf81..d1390c0 100644 --- a/exercise/01/animal.cpp +++ b/exercise/01/animal.cpp @@ -1,5 +1,6 @@ #include "animal.h" #include +#include animal::~animal() = default; @@ -47,9 +48,7 @@ std::wstring leg_counter::add_animal(std::unique_ptr animal) unsigned leg_counter::legs() const { - int sum{}; - std::for_each(animals_.cbegin(), animals_.cend(), [&sum](const std::unique_ptr& a) { sum += a->legs(); }); - return sum; + return std::accumulate(animals_.cbegin(), animals_.cend(), 0, [](int acc, auto& animal) { return acc + animal->legs(); }); } std::unique_ptr animal_factory(const int animal)