From 5fbf41e967ed8e413ecf1e6abb72e8d285169df4 Mon Sep 17 00:00:00 2001 From: Alexey Gavrilov Date: Fri, 24 May 2024 14:07:47 +0700 Subject: Pic + Tuple + refactor PrimaryInitialization class --- include/containers/Tuple.h | 98 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 include/containers/Tuple.h (limited to 'include/containers/Tuple.h') diff --git a/include/containers/Tuple.h b/include/containers/Tuple.h new file mode 100644 index 0000000..cf870d1 --- /dev/null +++ b/include/containers/Tuple.h @@ -0,0 +1,98 @@ +#ifndef CONTAINERSTUPLE_H +#define CONTAINERSTUPLE_H + + +#include + +template +class Tuple : public Tuple +{ + private: + using valueType = Head; + valueType value; + public: + using baseType = Tuple; + Tuple(Head val_, Tail ... args) : baseType(args ...), value(val_) {}; + + static constexpr unsigned int length() {return sizeof...(Tail) + 1;} + valueType getValue() {return value;}; + + template + auto get() + { + using returnType = cut::process::result; + return static_cast(*this); + }; + + /* + Create the class/struct before using the method + F is this class/struct to pass in method trought template argument. + F must contain a static method/s named "perform" + that will perform something action for every value in tuple object. + F must contain as many implementations + as there are different types in the template + F::perform() for the first argument accept tuple value, + next arguments optional + */ + template + void foreach(T ... arg) + { + if constexpr(If != NULL) + { + foreach(arg ...); + } + else + { + (F::perform(get().getValue(), arg ...)); + (F::perform(get().getValue(), arg ...), ...); + } + }; +}; + +template<> +class Tuple<> +{ + public: + static constexpr unsigned int length() {return 0;} +}; + +template +class Tuple +{ + private: + using valueType = Head; + valueType value; + public: + using baseType = Tuple<>; + Tuple(Head val_) : value(val_) {}; + Tuple() : value(valueType()) {}; + + static constexpr unsigned int length() {return 1;} + valueType getValue() {return value;}; + + template + auto get() + { + if constexpr (indx == NULL) return *this; + else static_assert(!indx, "Tuple::get: Out of bounds"); + }; + + /* + Create the class/struct before using the method + F is this class/struct to pass in method trought template argument. + F must contain a static method/s named "perform" + that will perform something action for every value in tuple object. + F must contain as many implementations + as there are different types in the template + F::perform() for the first argument accept tuple value, + next arguments optional + */ + template + void foreach(T ... arg) + { + F::perform(value, arg ...); + }; +}; + +#endif -- cgit v1.2.3