From 51b7b7c448fdeffc2f1b6ee19ad21e9eac10f17a Mon Sep 17 00:00:00 2001 From: polymurph Date: Sun, 1 Aug 2021 16:56:26 +0200 Subject: [PATCH] working CRTP example for static Polymorphism --- .../pin_interface_CRTP_style/PIN_modeling.cpp | 28 ----- .../pin_modleing_with_CRTP/Makefile | 24 ++++ .../pin_modleing_with_CRTP/main.cpp | 113 ++++++++++++++++++ .../pin_modleing_with_CRTP/runtest | Bin 0 -> 17952 bytes 4 files changed, 137 insertions(+), 28 deletions(-) delete mode 100644 scribbles_and_notes/pin_interface_CRTP_style/PIN_modeling.cpp create mode 100644 scribbles_and_notes/pin_interface_CRTP_style/pin_modleing_with_CRTP/Makefile create mode 100644 scribbles_and_notes/pin_interface_CRTP_style/pin_modleing_with_CRTP/main.cpp create mode 100755 scribbles_and_notes/pin_interface_CRTP_style/pin_modleing_with_CRTP/runtest diff --git a/scribbles_and_notes/pin_interface_CRTP_style/PIN_modeling.cpp b/scribbles_and_notes/pin_interface_CRTP_style/PIN_modeling.cpp deleted file mode 100644 index 84c524a..0000000 --- a/scribbles_and_notes/pin_interface_CRTP_style/PIN_modeling.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include - -struct Pin -{ - virtual void set(bool logic); - - virtual void toggle(); - - virtual bool get(void); -}; - -// https://www.modernescpp.com/index.php/c-is-still-lazy - -// curiously recurring template pattern -template -struct PinCRTP : public Pin -{ - virtual override set(bool logic) - { - static_cast<> - } -}; - - -int main(void) -{ - return 0; -} \ No newline at end of file diff --git a/scribbles_and_notes/pin_interface_CRTP_style/pin_modleing_with_CRTP/Makefile b/scribbles_and_notes/pin_interface_CRTP_style/pin_modleing_with_CRTP/Makefile new file mode 100644 index 0000000..38e5ad5 --- /dev/null +++ b/scribbles_and_notes/pin_interface_CRTP_style/pin_modleing_with_CRTP/Makefile @@ -0,0 +1,24 @@ +cpp_src = $(wildcard *.cpp) +cpp_src += $(wildcard ./utils/*.cpp) +cpp_src += $(wildcard ./driver/*.cpp) + +cpp_obj = $(cpp_src:.cpp=.o) +c_obj = $(c_src:.c=.o) +CC = g++ +CFLAGS = -Wall -pedantic -li2c +LDFLAGS = +EXEC = runtest + + +all : $(EXEC) + +$(EXEC): $(cpp_obj) $(c_obj) + $(CC) -o $@ $^ $(LDFLAGS) + +clean: + rm -rf $(c_obj) $(cpp_obj) $(EXEC) + clear + +cleanall: + rm -rf $(c_obj) $(cpp_obj) $(EXEC) + clear diff --git a/scribbles_and_notes/pin_interface_CRTP_style/pin_modleing_with_CRTP/main.cpp b/scribbles_and_notes/pin_interface_CRTP_style/pin_modleing_with_CRTP/main.cpp new file mode 100644 index 0000000..0c05c7f --- /dev/null +++ b/scribbles_and_notes/pin_interface_CRTP_style/pin_modleing_with_CRTP/main.cpp @@ -0,0 +1,113 @@ +#include +#include + +// https://www.modernescpp.com/index.php/c-is-still-lazy + +// +// CRTP base class of pin +// + +/* + avoiding virtual call (static polymorphism) +*/ + +template +struct PinBase +{ + + void set(bool logic) + { + static_cast(this)->setImp(logic); + } + + void toggle() + { + static_cast(this)->toggleImp(); + } + + bool get(void) + { + return static_cast(this)->getImp(); + } + + private: + + // + // base implementations + // + + void setImp() + { + std::cout << "base implementation of set()!" << std::endl; + } + + void toggleImp() + { + std::cout << "base implementation of toggle()!" << std::endl; + } + + bool getImp(void) + { + std::cout << "base implementation of get()!" << std::endl; + return true; + } +}; + +// +// implementations +// + +struct STM32_Pin : PinBase +{ + void setImp(bool logic) + { + std::cout << "stm32 pin set to " << logic << std::endl; + } + + void toggleImp() + { + std::cout << "toggled stm32 pin" << std::endl; + } + + bool getImp() + { + return true; + } +}; + +struct AVR_Pin : PinBase +{ + void setImp(bool logic) + { + std::cout << "AVR pin set to " << logic << std::endl; + } + + void toggleImp() + { + std::cout << "toggled AVR pin" << std::endl; + } + + bool getImp() + { + return true; + } +}; + +template +void foo(T& base) +{ + base.set(true); + base.set(false); + base.toggle(); +} + +int main(void) +{ + STM32_Pin pin1; + AVR_Pin pin2; + + foo(pin1); + foo(pin2); + + return 0; +} \ No newline at end of file diff --git a/scribbles_and_notes/pin_interface_CRTP_style/pin_modleing_with_CRTP/runtest b/scribbles_and_notes/pin_interface_CRTP_style/pin_modleing_with_CRTP/runtest new file mode 100755 index 0000000000000000000000000000000000000000..8f3b9a12dfbb3538947be2d5148fca3bf9597a98 GIT binary patch literal 17952 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