#define SETTINGS_CONTAINER_IMPLEMENTATION #include #include namespace scwx { namespace qt { namespace settings { static const std::string logPrefix_ = "scwx::qt::settings::settings_container"; template class SettingsContainer::Impl { public: explicit Impl() {} ~Impl() {} T elementDefault_ {}; std::optional elementMinimum_ {}; std::optional elementMaximum_ {}; std::function elementValidator_ {nullptr}; }; template SettingsContainer::SettingsContainer(const std::string& name) : SettingsVariable(name), p(std::make_unique()) { } template SettingsContainer::~SettingsContainer() = default; template SettingsContainer::SettingsContainer(SettingsContainer&&) noexcept = default; template SettingsContainer& SettingsContainer::operator=(SettingsContainer&&) noexcept = default; template bool SettingsContainer::SetValueOrDefault(const Container& c) { bool validated = true; Container validatedValues; validatedValues.reserve(c.size()); std::transform( c.cbegin(), c.cend(), std::back_inserter(validatedValues), [&](auto& value) { if (ValidateElement(value)) { return value; } else if (p->elementMinimum_.has_value() && value < p->elementMinimum_) { validated = false; return *p->elementMinimum_; } else if (p->elementMaximum_.has_value() && value > p->elementMaximum_) { validated = false; return *p->elementMaximum_; } else { validated = false; return p->elementDefault_; } }); return SettingsVariable::SetValueOrDefault(validatedValues) && validated; } template SettingsContainer::T SettingsContainer::GetElementDefault() const { return p->elementDefault_; } template void SettingsContainer::SetElementDefault(const T& value) { p->elementDefault_ = value; } template void SettingsContainer::SetElementMinimum(const T& value) { p->elementMinimum_ = value; } template void SettingsContainer::SetElementMaximum(const T& value) { p->elementMaximum_ = value; } template void SettingsContainer::SetElementValidator( std::function validator) { p->elementValidator_ = validator; } template bool SettingsContainer::Validate(const Container& c) const { if (!SettingsVariable::Validate(c)) { return false; } for (auto& element : c) { if (!ValidateElement(element)) { return false; } } return true; } template bool SettingsContainer::ValidateElement(const T& value) const { return ( // Validate minimum (!p->elementMinimum_.has_value() || value >= p->elementMinimum_) && // Validate maximum (!p->elementMaximum_.has_value() || value <= p->elementMaximum_) && // User-validation (p->elementValidator_ == nullptr || p->elementValidator_(value))); } } // namespace settings } // namespace qt } // namespace scwx