#pragma once #include "validate_basic.h" namespace impls { template class DoubleLimit : public validate::Validator { private: QString _name_store; double _limit_max, _limit_min; int64_t _limit_max_times = 0, _limit_min_times = 0; public: DoubleLimit(const QString& name, double min, double max) : _name_store(name), _limit_max(max), _limit_min(min) { _limit_min_times = static_cast(min * precision) - min_equal; _limit_max_times = static_cast(max * precision) + max_equal; } virtual bool check(double value) const { auto value_times = static_cast(value * precision); return _limit_min_times < value_times && value_times < _limit_max_times; } virtual void getDepict(datas::IDataObject& self_description) { self_description.setString(u8"ValidatorName", _name_store); self_description.setString(u8"ValueType", u8"Double"); self_description.setInt64(u8"Precision", precision); self_description.setDouble(u8"MinValue", _limit_min); self_description.setDouble(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 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: 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; } virtual bool check(int64_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.setInt64(u8"MinValue", _limit_min); self_description.setInt64(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); } }; class EnumsValidator : public validate::Validator { private: QString _name_store; QList _enum_options; public: EnumsValidator(const QString& name, const QList& list) :_name_store(name), _enum_options(list) { } virtual bool check(int32_t value) const { return _enum_options.contains(value); } virtual void getDepict(datas::IDataObject& self_description) { self_description.setString(u8"ValidatorName", _name_store); self_description.setString(u8"ValueType", u8"Enum"); QStringList options; std::transform(_enum_options.begin(), _enum_options.end(), std::back_inserter(options), [](int32_t v) {return QString::number(v); }); self_description.setString(u8"Values", options.join(u8",")); self_description.setString(u8"Description", QString("value กส { %1 }").arg(options.join(u8","))); } }; }