#pragma once #include "ParseArgs.h" #include class BaseParameters; using michlib::real; template concept InfoSupported = requires(T t) { { t.Info() } -> std::convertible_to; }; template concept ParametersSupported = requires(T t, michlib_internal::ParameterListEx& pars, const CLArgs& args) { { t.Parameters(pars, args).first } -> std::convertible_to; }; template concept ReadPSupported = requires(T t, const MString& vname, const BaseParameters* ip, size_t i) { { t.Read(vname, ip, i)(0) } -> std::convertible_to; }; template concept ReadSupported = requires(T t, const MString& vname, size_t i) { { t.Read(vname, i)(0) } -> std::convertible_to; }; template concept IsUVData = requires(T t) { { t.U(0) } -> std::convertible_to; { t.V(0) } -> std::convertible_to; { t.U2(0) } -> std::convertible_to; }; namespace internal { template concept HaveXYStep = requires(T t) { { t.XStep() } -> std::convertible_to; { t.YStep() } -> std::convertible_to; }; template using void_ = void; template struct GetReadType_; template struct GetReadType_ { using p = BaseParameters*; using type = decltype(D().Read(MString(), p(), 0)); }; template struct GetReadType_ { using type = decltype(D().Read(MString(), 0)); }; template concept HaveDisable = requires(T t) { { T::disabledactions } -> std::convertible_to; }; consteval bool cmpspace(const char* s1, const char* s2) { size_t i = 0; while(true) { if(s1[i] != s2[i]) return false; i++; if(s1[i] == 0 && (s2[i] == 0 || s2[i] == ' ')) return true; if(s1[i] == 0 || s2[i] == 0 || s2[i] == ' ') return false; } return false; } } // namespace internal template consteval bool IsDisabled() { if constexpr(!internal::HaveDisable) return false; else { bool prsp = true; size_t i = 0; do { if(prsp && internal::cmpspace(Act::name, S::disabledactions + i)) return true; prsp = S::disabledactions[i] == ' '; } while(S::disabledactions[++i] != 0); return false; } } template using ReadType = internal::GetReadType_, ReadSupported>::type; template concept ReadIsGrid = requires { { ReadType().XStep() } -> std::convertible_to; { ReadType().YStep() } -> std::convertible_to; };