diff --git a/PenetrateBasic/cmds_basic.h b/PenetrateBasic/cmds_basic.h index 448b059..257fedb 100644 --- a/PenetrateBasic/cmds_basic.h +++ b/PenetrateBasic/cmds_basic.h @@ -134,7 +134,6 @@ namespace Inlet { }; template CmdsImpl* CmdsImpl::_unique_inst = nullptr; - template struct EventsImpl : public IRunbase { private: Callable _func = (Callable)addr; @@ -168,7 +167,5 @@ namespace Inlet { _args_value.loadFrom(0, object); } }; - template EventsImpl* EventsImpl::_unique_inst = nullptr; - } diff --git a/PenetrateBasic/main.cpp b/PenetrateBasic/main.cpp index fa1381e..8438f97 100644 --- a/PenetrateBasic/main.cpp +++ b/PenetrateBasic/main.cpp @@ -5,13 +5,15 @@ #include "dispatch.h" #include "cmds.h" #include "validation.h" +#include "validate_impl.h" int vp(int c) { qDebug() << c; return c; } - verify::T::Validation vp_check; +auto args0 = vp_check.pos<0>() & new impls::Int32Limit(QString(u8"Hello World"), 0, 3); + namespace xproc { int xmp(int arg) { @@ -19,7 +21,6 @@ namespace xproc { return 3; } } - cmds::T::Cmd entry("hello"); cmds::T::Cmd xvv("sfaf"); @@ -37,6 +38,9 @@ int main(int argc, char* argv[]) { exec.execute(5); entry(50); + entry(2); + entry(0); + entry(3); xvv(2); return a.exec(); diff --git a/PenetrateBasic/validate_impl.h b/PenetrateBasic/validate_impl.h index c07840d..aa7d923 100644 --- a/PenetrateBasic/validate_impl.h +++ b/PenetrateBasic/validate_impl.h @@ -37,14 +37,46 @@ namespace impls { }; template - class IntegerLimit : public validate::Validator { + class Int32Limit : public validate::Validator { + private: + QString _name_store; + int32_t _limit_max, _limit_min; + int32_t _limit_max_times = 0, _limit_min_times = 0; + + public: + Int32Limit(const QString& name, int32_t min, int32_t max) + : _name_store(name), _limit_min(min), _limit_max(max) { + _limit_max_times = _limit_max + max_equal; + _limit_min_times = _limit_min - min_equal; + } + + + virtual bool check(int32_t value) const { + return _limit_min_times < value && value < _limit_max_times; + } + + virtual void getDepict(datas::IDataObject& self_description) { + self_description.setString(u8"ValidatorName", _name_store); + self_description.setString(u8"ValueType", u8"Integer"); + self_description.setInt32(u8"MinValue", _limit_min); + self_description.setInt32(u8"MaxValue", _limit_max); + + auto description = QString(u8"%1 %3 value %4 %2").arg(_limit_min).arg(_limit_max); + description = description.arg(min_equal ? u8"<=" : u8"<", max_equal ? u8"<=" : u8"<"); + self_description.setString(u8"Description", description); + } + }; + + + template + class Int64Limit : public validate::Validator { private: QString _name_store; int64_t _limit_max, _limit_min; int64_t _limit_max_times = 0, _limit_min_times = 0; public: - IntegerLimit(const QString& name, int64_t min, int64_t max) + Int64Limit(const QString& name, int64_t min, int64_t max) : _name_store(name), _limit_min(min), _limit_max(max) { _limit_max_times = _limit_max + max_equal; _limit_min_times = _limit_min - min_equal; @@ -67,6 +99,7 @@ namespace impls { } }; + class EnumsValidator : public validate::Validator { private: QString _name_store; diff --git a/PenetrateBasic/validation_basic.h b/PenetrateBasic/validation_basic.h index ef412c2..dd2eb89 100644 --- a/PenetrateBasic/validation_basic.h +++ b/PenetrateBasic/validation_basic.h @@ -15,7 +15,7 @@ namespace validate { }; template class ValidatorReceiver { public: - virtual void append(Validator inst) { } + virtual void append(Validator* inst) { } }; @@ -32,15 +32,15 @@ namespace validate { template struct ValidateTemplet : public ValidateTemplet { private: - QList> validator_list; + QList*> validator_list; public: - void add(Validator vinst) { + void add(Validator* vinst) { validator_list << vinst; } bool check(head_type value) const { for (auto u : validator_list) - if (!u.check(value)) + if (!u->check(value)) return false; return true; } @@ -72,7 +72,7 @@ namespace validate { template void __validator_insert_helper(ValidateTemplet& target, - Validator>::value_type> inst) { + Validator>::value_type>* inst) { using templet_type = typename ElmPos>::templet_type; target.templet_type::add(inst); } @@ -103,7 +103,7 @@ namespace validate { ArgsPosition(ValidateTemplet& target) :_templet_bind(target) { } - ArgsPosition& operator&(Validator vinst) { + ArgsPosition& operator&(Validator* vinst) { append(vinst); return *this; } @@ -115,7 +115,7 @@ namespace validate { } // ValidatorReceiver - virtual void append(Validator inst) { + virtual void append(Validator* inst) { __validator_insert_helper(_templet_bind, inst); } @@ -128,7 +128,7 @@ namespace validate { SlicePosition(ValidatorReceiver& host, std::function func) :_conv_func(func), _prev_bind(host) { } - SlicePosition>& operator&(Validator vinst) { + SlicePosition>& operator&(Validator* vinst) { append(vinst); return *this; } @@ -140,7 +140,7 @@ namespace validate { } // ValidatorReceiver - virtual void append(Validator inst) { + virtual void append(Validator* inst) { SliceValidator mid_validator(_conv_func, inst); _prev_bind.append(mid_validator); }