diff --git a/exercise/01/animal.cpp b/exercise/01/animal.cpp new file mode 100644 index 0000000..716b659 --- /dev/null +++ b/exercise/01/animal.cpp @@ -0,0 +1,56 @@ +#include "animal.h" +#include + +animal::~animal() = default; + +std::size_t insect::legs() const noexcept +{ + return 6u; +} + +std::wstring cockroach::species() const +{ + return L"cockroach"; +} + +std::size_t bird::legs() const noexcept +{ + return 2u; +} + +std::wstring sparrow::species() const +{ + return L"sparrow"; +} + +std::size_t spider::legs() const noexcept +{ + return 8u; +} + +std::wstring tarantula::species() const +{ + return L"tarantula"; +} + +std::unique_ptr animal_factory(const std::size_t animal_id) +{ + switch(animal_id) + { + case 1u: + return std::make_unique(); + case 2u: + return std::make_unique(); + case 3u: + return std::make_unique(); + default: + throw std::invalid_argument("invalid animal id"); + } +} + +leg_counter::leg_counter() : num_legs(0) {} + +std::size_t leg_counter::legs() const noexcept +{ + return num_legs; +} diff --git a/exercise/01/animal.h b/exercise/01/animal.h new file mode 100644 index 0000000..2b4b532 --- /dev/null +++ b/exercise/01/animal.h @@ -0,0 +1,66 @@ +#pragma once +#include +#include + +struct animal +{ + virtual ~animal(); + virtual std::wstring species() const = 0; + virtual std::size_t legs() const noexcept = 0; +}; + +struct insect : animal +{ + std::size_t legs() const noexcept override; +}; + +struct cockroach final : insect +{ + std::wstring species() const override; +}; + +struct bird : animal +{ + std::size_t legs() const noexcept override; +}; + +struct sparrow final : bird +{ + std::wstring species() const override; +}; + +struct spider : animal +{ + std::size_t legs() const noexcept override; +}; + +struct tarantula final : spider +{ + std::wstring species() const override; +}; + + +std::unique_ptr animal_factory(std::size_t animal_id); + +struct leg_counter final +{ + leg_counter(); + template + std::wstring add_animal(AnimalPtrT animal); + std::size_t legs() const noexcept; + +private: + std::size_t num_legs; +}; + +template +std::wstring leg_counter::add_animal(AnimalPtrT animal) +{ + if (animal) + { + num_legs += animal->legs(); + return animal->species(); + } + throw std::invalid_argument("invalid pointer type"); +} + diff --git a/exercise/01/animals.vcxproj b/exercise/01/animals.vcxproj index 0c14cbf..22e7248 100644 --- a/exercise/01/animals.vcxproj +++ b/exercise/01/animals.vcxproj @@ -1,95 +1,95 @@ - - - - - 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..07fc409 100644 --- a/exercise/01/animals.vcxproj.filters +++ b/exercise/01/animals.vcxproj.filters @@ -1,24 +1,24 @@ - - - - - {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 + + \ No newline at end of file