10 #ifndef __NODAMUSHI_SVD_NORMALIZED_DERIVED_FROM_HELPER_HPP__ 11 #define __NODAMUSHI_SVD_NORMALIZED_DERIVED_FROM_HELPER_HPP__ 13 # include <type_traits> 15 # if __cplusplus >= 201703 16 # include <string_view> 30 #define __NORMALIZED_DERIVED_FROM(name)\ 31 ___NORMALIZED_DERIVED_FROM(n,name) 35 #define __NORMALIZED_DERIVED_FROM_MEMBER(name)\ 36 ___NORMALIZED_DERIVED_FROM_MEMBER(name,n) 38 #define __NORMALIZED_DERIVED_FROM_HELPER(name)\ 39 ___NORMALIZED_DERIVED_FROM_HELPER(name,n) 49 template<
typename VALUE>
52 if(ptr)
return static_cast<TO>(ptr->get());
56 template<
typename VALUE,
typename D>
59 if(ptr)
return static_cast<TO>(ptr->get());
60 return static_cast<TO>(d);
67 template<
typename VALUE>
70 if(ptr)
return {static_cast<TO>(ptr->get())};
73 template<
typename VALUE,
typename D>
76 if(ptr)
return {static_cast<TO>(ptr->get())};
77 else return {static_cast<TO>(d)};
82 template<
typename SVD,
typename VALUE,VALUE SVD::* MEMBER>
85 using type =
typename std::remove_const<typename VALUE::type>::type;
93 const auto& v = o.svd.*MEMBER;
96 }
else if(o.derivedFrom){
97 const O *df = o.derivedFrom;
99 const auto& s= df->svd;
100 const auto& dv = s.*MEMBER;
105 df = df->derivedFrom;
109 operator bool()const noexcept{
return ptr!=
nullptr;}
111 ->decltype(
ptr->get())
118 template<
typename T,
typename SVD,
typename VALUE,VALUE SVD::* MEMBER>
126 using unref =
typename std::remove_reference<T>::type;
127 using type =
typename std::remove_const<unref>::type;
130 #define ___NORMALIZED_DERIVED_FROM(o,name) \ 131 name(cast_df_helper<___NORMALIZED_DERIVED_FROM_FIELD_TYPE(name)>( \ 132 ___NORMALIZED_DERIVED_FROM_TYPE(name,o){o})) \ 134 #define ___NORMALIZED_DERIVED_FROM_FIELD_TYPE(name) \ 135 typename unwrap_decltype<decltype(this->name)>::type 138 #define ___NORMALIZED_DERIVED_FROM_TYPE(name,o) \ 139 derived_from_helper< \ 140 typename unwrap_decltype<decltype(o.svd)>::type,\ 141 typename unwrap_decltype<decltype(o.svd.name)>::type,\ 142 & unwrap_decltype<decltype(o.svd)>::type::name> 144 #define ___NORMALIZED_DERIVED_FROM_MEMBER(name,o) \ 145 name(derived_from_helper< \ 146 typename unwrap_decltype<decltype(o.svd)>::type,\ 147 typename unwrap_decltype<decltype(o.svd.name)>::type,\ 148 & unwrap_decltype<decltype(o.svd)>::type::name>\ 150 #define ___NORMALIZED_DERIVED_FROM_HELPER(name,o) \ 151 derived_from_helper< \ 152 typename unwrap_decltype<decltype(o.svd)>::type,\ 153 typename unwrap_decltype<decltype(o.svd.name)>::type,\ 154 & unwrap_decltype<decltype(o.svd)>::type::name>\ 159 #endif // __NODAMUSHI_SVD_NORMALIZED_DERIVED_FROM_HELPER_HPP__
typename std::remove_const< unref >::type type
typename std::remove_reference< T >::type unref
static TO cast_to(const VALUE *ptr)
static nullable< TO > cast_to(const VALUE *ptr)
a data container like optional type.
derived_from_helper(const O &o)
auto cast_df_helper(derived_from_helper< SVD, VALUE, MEMBER > &&h)
static TO cast_to(const VALUE *ptr, D d)
typename std::remove_const< typename VALUE::type >::type type
auto operator *() const noexcept -> decltype(ptr->get())
static nullable< TO > cast_to(const VALUE *ptr, D d)