|
|
|
@ -216,9 +216,14 @@ C2SupportedFlags<T> C2SupportedFlags<T>::limitedTo(const C2SupportedFlags<T> &li
|
|
|
|
|
if (limit.contains(minMask) && contains(minMask)) {
|
|
|
|
|
values[0] = minMask;
|
|
|
|
|
// keep only flags that are covered by limit
|
|
|
|
|
std::remove_if(values.begin(), values.end(), [&limit, minMask](const C2Value::Primitive &v) -> bool {
|
|
|
|
|
T value = v.ref<ValueType>() | minMask;
|
|
|
|
|
return value == minMask || !limit.contains(value); });
|
|
|
|
|
values.erase(std::remove_if(values.begin(), values.end(),
|
|
|
|
|
[&limit, minMask](
|
|
|
|
|
const C2Value::Primitive &v) -> bool {
|
|
|
|
|
T value = v.ref<ValueType>() | minMask;
|
|
|
|
|
return value == minMask ||
|
|
|
|
|
!limit.contains(value);
|
|
|
|
|
}),
|
|
|
|
|
values.end());
|
|
|
|
|
// we also need to do it vice versa
|
|
|
|
|
for (const C2Value::Primitive &v : _mValues) {
|
|
|
|
|
T value = v.ref<ValueType>() | minMask;
|
|
|
|
@ -264,24 +269,33 @@ bool C2SupportedValueSet<T>::contains(T value) const {
|
|
|
|
|
template<typename T>
|
|
|
|
|
C2SupportedValueSet<T> C2SupportedValueSet<T>::limitedTo(const C2SupportedValueSet<T> &limit) const {
|
|
|
|
|
std::vector<C2Value::Primitive> values = _mValues; // make a copy
|
|
|
|
|
std::remove_if(values.begin(), values.end(), [&limit](const C2Value::Primitive &v) -> bool {
|
|
|
|
|
return !limit.contains(v.ref<ValueType>()); });
|
|
|
|
|
values.erase(std::remove_if(values.begin(), values.end(),
|
|
|
|
|
[&limit](const C2Value::Primitive &v) -> bool {
|
|
|
|
|
return !limit.contains(v.ref<ValueType>());
|
|
|
|
|
}),
|
|
|
|
|
values.end());
|
|
|
|
|
return C2SupportedValueSet(std::move(values));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
|
C2SupportedValueSet<T> C2SupportedValueSet<T>::limitedTo(const C2SupportedRange<T> &limit) const {
|
|
|
|
|
std::vector<C2Value::Primitive> values = _mValues; // make a copy
|
|
|
|
|
std::remove_if(values.begin(), values.end(), [&limit](const C2Value::Primitive &v) -> bool {
|
|
|
|
|
return !limit.contains(v.ref<ValueType>()); });
|
|
|
|
|
values.erase(std::remove_if(values.begin(), values.end(),
|
|
|
|
|
[&limit](const C2Value::Primitive &v) -> bool {
|
|
|
|
|
return !limit.contains(v.ref<ValueType>());
|
|
|
|
|
}),
|
|
|
|
|
values.end());
|
|
|
|
|
return C2SupportedValueSet(std::move(values));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
|
C2SupportedValueSet<T> C2SupportedValueSet<T>::limitedTo(const C2SupportedFlags<T> &limit) const {
|
|
|
|
|
std::vector<C2Value::Primitive> values = _mValues; // make a copy
|
|
|
|
|
std::remove_if(values.begin(), values.end(), [&limit](const C2Value::Primitive &v) -> bool {
|
|
|
|
|
return !limit.contains(v.ref<ValueType>()); });
|
|
|
|
|
values.erase(std::remove_if(values.begin(), values.end(),
|
|
|
|
|
[&limit](const C2Value::Primitive &v) -> bool {
|
|
|
|
|
return !limit.contains(v.ref<ValueType>());
|
|
|
|
|
}),
|
|
|
|
|
values.end());
|
|
|
|
|
return C2SupportedValueSet(std::move(values));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|