-
Notifications
You must be signed in to change notification settings - Fork 82
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
IS-11 support #271
base: master
Are you sure you want to change the base?
IS-11 support #271
Changes from 1 commit
d5e46c1
487818e
79d2024
634967d
6d2a212
ca8c804
4b8f590
fff7420
3de8159
142f765
7ba0287
b11402e
ae50dd1
d230c3a
2bcaba0
16941f7
f2b8918
6604027
583969d
b3cf776
3755db2
986820e
c8f111b
278a802
4836364
b48f40f
8141286
c5d2000
2bac1b6
e94eddf
0812d6f
8eabb3f
7df92e9
376d616
5c8ab03
0dcdd31
a538f15
8801298
b62883e
e83e7d9
8084118
e0756a2
7d799c5
8ba4b46
0444c02
6574cd7
402fa7d
f5216f3
cd890ad
6f46f53
8fc7591
8680a8f
d24eb37
2e08ff5
f5106ca
fb0e20e
c5f2834
15a27a9
c07645b
fdaac5c
e31e434
48b3c2c
29bc35b
16af3ee
9a4d99f
8e22199
0195a9e
389bcd2
1d1f878
56d9555
abd69b1
9bc3c91
fd69423
6b75505
e0b29e1
9e9ac54
1631623
dff5591
3d71441
e5efb1d
ecf6aaf
e1f707c
c0c479f
4edcf0c
4a37cd8
bd128a3
ca0b38a
c17013f
04f1fc9
bda591e
dbfc11d
60fa835
3c01117
17f9721
28241d0
b24f84d
b98dab7
2e033b5
146beed
74e20cc
8f3301c
c778adc
4c446ba
0d8f8e4
20b8a7d
290c745
a21a413
effaa6f
726f18f
373ffa9
a522324
fbb4470
d33fdfa
3fa4720
7bce8b5
7d47286
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
…nstraints_put_handler
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,7 +1,12 @@ | ||||||||||||||||||||||||||||
#include "nmos/constraints.h" | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
#include <algorithm> | ||||||||||||||||||||||||||||
#include <map> | ||||||||||||||||||||||||||||
#include <boost/algorithm/string/predicate.hpp> | ||||||||||||||||||||||||||||
#include <boost/range/adaptor/filtered.hpp> | ||||||||||||||||||||||||||||
#include <boost/range/adaptor/transformed.hpp> | ||||||||||||||||||||||||||||
#include "cpprest/basic_utils.h" // for utility::us2s | ||||||||||||||||||||||||||||
#include "cpprest/json_utils.h" | ||||||||||||||||||||||||||||
#include "nmos/capabilities.h" | ||||||||||||||||||||||||||||
#include "nmos/json_fields.h" | ||||||||||||||||||||||||||||
#include "nmos/rational.h" | ||||||||||||||||||||||||||||
|
@@ -10,6 +15,189 @@ namespace nmos | |||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
namespace experimental | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
bool constraint_comp(const web::json::value& lhs, const web::json::value& rhs) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
if (nmos::is_rational(lhs) && nmos::is_rational(rhs)) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
if (nmos::parse_rational(lhs) < nmos::parse_rational(rhs)) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
return true; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
else if (lhs.is_integer() && rhs.is_integer()) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
if (lhs.as_number().to_int64() < rhs.as_number().to_int64()) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
return true; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
else if (lhs.is_double() && rhs.is_double()) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
if (lhs.as_double() < rhs.as_double()) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
return true; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
else if (lhs.is_string() && rhs.is_string()) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
if (lhs.as_string() < rhs.as_string()) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
return true; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
return false; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
web::json::value get_intersection(const web::json::array& lhs, const web::json::array& rhs) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
std::vector<web::json::value> v(std::min(lhs.size(), rhs.size())); | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
// "Arrays are used for ordered elements." | ||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Unfortunately this doesn't mean that the elements must be in some sorted order, it just means that order is significant, i.e. However, BCP-004-01 doesn't specify that the |
||||||||||||||||||||||||||||
// https://json-schema.org/understanding-json-schema/reference/array.html | ||||||||||||||||||||||||||||
const auto it = std::set_intersection(lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), v.begin(), constraint_comp); | ||||||||||||||||||||||||||||
v.resize(it - v.begin()); | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
return web::json::value_from_elements(v); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
web::json::value get_intersection(const web::json::array& enumeration, const web::json::value& constraint) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
return web::json::value_from_elements(enumeration | boost::adaptors::filtered([&constraint](const web::json::value& enum_value) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
return match_constraint(enum_value, constraint); | ||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I like reuse but I'm not sure about this, seems weird to check every enum value against all the enum values... There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There is an overload Or I didn't understand what you mean here? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hmm... it seemed like all of the result[nmos::fields::constraint_enum] = get_intersection(nmos::fields::constraint_enum(result).as_array(), result); |
||||||||||||||||||||||||||||
})); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
web::json::value get_constraint_intersection(const web::json::value& lhs, const web::json::value& rhs) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
web::json::value result; | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
// "enum" | ||||||||||||||||||||||||||||
if (lhs.has_field(nmos::fields::constraint_enum) && rhs.has_field(nmos::fields::constraint_enum)) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
result[nmos::fields::constraint_enum] = get_intersection(nmos::fields::constraint_enum(lhs).as_array(), nmos::fields::constraint_enum(rhs).as_array()); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
else if (lhs.has_field(nmos::fields::constraint_enum)) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
result[nmos::fields::constraint_enum] = nmos::fields::constraint_enum(lhs); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
else if (rhs.has_field(nmos::fields::constraint_enum)) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
result[nmos::fields::constraint_enum] = nmos::fields::constraint_enum(rhs); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
// "minimum" | ||||||||||||||||||||||||||||
if (lhs.has_field(nmos::fields::constraint_minimum) && rhs.has_field(nmos::fields::constraint_minimum)) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
result[nmos::fields::constraint_minimum] = std::max(nmos::fields::constraint_minimum(lhs), nmos::fields::constraint_minimum(rhs), constraint_comp); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
else if (lhs.has_field(nmos::fields::constraint_minimum)) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
result[nmos::fields::constraint_minimum] = nmos::fields::constraint_minimum(lhs); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
else if (rhs.has_field(nmos::fields::constraint_minimum)) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
result[nmos::fields::constraint_minimum] = nmos::fields::constraint_minimum(rhs); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
// "maximum" | ||||||||||||||||||||||||||||
if (lhs.has_field(nmos::fields::constraint_maximum) && rhs.has_field(nmos::fields::constraint_maximum)) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
result[nmos::fields::constraint_maximum] = std::min(nmos::fields::constraint_maximum(lhs), nmos::fields::constraint_maximum(rhs), constraint_comp); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
else if (lhs.has_field(nmos::fields::constraint_maximum)) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
result[nmos::fields::constraint_maximum] = nmos::fields::constraint_maximum(lhs); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
else if (rhs.has_field(nmos::fields::constraint_maximum)) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
result[nmos::fields::constraint_maximum] = nmos::fields::constraint_maximum(rhs); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
// "min" > "max" | ||||||||||||||||||||||||||||
if (result.has_field(nmos::fields::constraint_minimum) && result.has_field(nmos::fields::constraint_maximum)) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
if (!constraint_comp(nmos::fields::constraint_minimum(result), nmos::fields::constraint_maximum(result))) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
return web::json::value::null(); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
// "enum" matches "min"/"max" | ||||||||||||||||||||||||||||
if (result.has_field(nmos::fields::constraint_enum) && (result.has_field(nmos::fields::constraint_minimum) || result.has_field(nmos::fields::constraint_maximum))) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
result[nmos::fields::constraint_enum] = get_intersection(nmos::fields::constraint_enum(result).as_array(), result); | ||||||||||||||||||||||||||||
for (const auto& keyword : { nmos::fields::constraint_minimum, nmos::fields::constraint_maximum }) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
if (result.has_field(keyword)) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
result.erase(keyword); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
// no "min"/"max" and "enum" is empty | ||||||||||||||||||||||||||||
if (result.has_field(nmos::fields::constraint_enum) && (!result.has_field(nmos::fields::constraint_minimum) && !result.has_field(nmos::fields::constraint_maximum))) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
if (0 == nmos::fields::constraint_enum(result).as_array().size()) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
return web::json::value::null(); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. if
Suggested change
|
||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
return result; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
web::json::value get_constraint_set_intersection(const web::json::value& lhs, const web::json::value& rhs, bool merge_left_to_right) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
using web::json::value; | ||||||||||||||||||||||||||||
using web::json::value_from_elements; | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
const auto& lhs_param_constraints = lhs.as_object(); | ||||||||||||||||||||||||||||
auto rhs_param_constraints = rhs.as_object(); | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
if (merge_left_to_right) | ||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I still think it would be better to make this function general purpose and therefore to always 'merge' from both sides (no bool parameter), otherwise it's not an intersection. I think objects are sorted by their keys so it should be possible to do a kind of merge sort and not treat the parameter constraints that are only in one or other differently, maybe inspired by the (I was surprised There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I may be completely wrong here, but my logic was that calculating the intersection is picking common items from two sets into a new set. Thus, if we consider two objects with different sets of keys, the intersection should have only the common keys by default. Does it make sense? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We discussed so just noting for other readers, the answer is no, because parameter constraints are and-ed together so the intersection of two constraint sets needs all the parameter constraints from both sets. This is different than calculating the intersection for the arrays of values under the enum constraint keyword because those values are or-ed. |
||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
rhs_param_constraints = lhs_param_constraints; | ||||||||||||||||||||||||||||
std::for_each(rhs.as_object().begin(), rhs.as_object().end(), [&rhs_param_constraints](const std::pair<utility::string_t, value>& rhs_constraint) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
rhs_param_constraints[rhs_constraint.first] = rhs_constraint.second; | ||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
const auto common_param_constraints = get_intersection( | ||||||||||||||||||||||||||||
value_from_elements(lhs_param_constraints | boost::adaptors::filtered([](const std::pair<utility::string_t, value>& constraint) { return !boost::algorithm::starts_with(constraint.first, U("urn:x-nmos:cap:meta:")); }) | boost::adaptors::transformed([](const std::pair<utility::string_t, value>& constraint) { return constraint.first; })).as_array(), | ||||||||||||||||||||||||||||
value_from_elements(rhs_param_constraints | boost::adaptors::filtered([](const std::pair<utility::string_t, value>& constraint) { return !boost::algorithm::starts_with(constraint.first, U("urn:x-nmos:cap:meta:")); }) | boost::adaptors::transformed([](const std::pair<utility::string_t, value>& constraint) { return constraint.first; })).as_array() | ||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We should filter out I wonder how we should handle There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. lhs enabled && rhs enabled or ignoring |
||||||||||||||||||||||||||||
).as_array(); | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
if (0 == common_param_constraints.size()) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
return value::null(); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
try | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
value result; | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
std::for_each(common_param_constraints.begin(), common_param_constraints.end(), [&result, &lhs_param_constraints, &rhs_param_constraints](const web::json::value& constraint_name_) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
const auto& constraint_name = constraint_name_.as_string(); | ||||||||||||||||||||||||||||
const web::json::value intersection = get_constraint_intersection(lhs_param_constraints.at(constraint_name), rhs_param_constraints.at(constraint_name)); | ||||||||||||||||||||||||||||
if (intersection.is_null()) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
throw std::runtime_error(utility::us2s(constraint_name) + " gives empty intersection"); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
result[constraint_name] = intersection; | ||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
return result; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
catch (const std::runtime_error& e) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
return value::null(); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
// Constraint B is a subconstraint of Constraint A if: | ||||||||||||||||||||||||||||
// 1. Constraint B has enum keyword when Constraint A has it and enumerated values of Constraint B are a subset of enumerated values of Constraint A | ||||||||||||||||||||||||||||
// 2. Constraint B has enum or minimum keyword when Constraint A has minimum keyword and allowed values of Constraint B are greater than minimum value of Constraint A | ||||||||||||||||||||||||||||
|
@@ -36,45 +224,20 @@ namespace nmos | |||||||||||||||||||||||||||
const auto& constraint_min = nmos::fields::constraint_minimum(constraint); | ||||||||||||||||||||||||||||
const auto& subconstraint_min = nmos::fields::constraint_minimum(subconstraint); | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
if (nmos::is_rational(constraint_min)) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
if (nmos::parse_rational(constraint_min) > nmos::parse_rational(subconstraint_min)) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
return false; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
else if (constraint_min.is_integer() && subconstraint_min.is_integer()) | ||||||||||||||||||||||||||||
if (constraint_min != subconstraint_min) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
if (constraint_min.as_number().to_int64() > subconstraint_min.as_number().to_int64()) | ||||||||||||||||||||||||||||
if (!constraint_comp(constraint_min, subconstraint_min)) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
return false; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
else if (constraint_min.as_double() > subconstraint_min.as_double()) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
return false; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
if (constraint.has_field(nmos::fields::constraint_maximum) && subconstraint.has_field(nmos::fields::constraint_maximum)) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
const auto& constraint_max = nmos::fields::constraint_maximum(constraint); | ||||||||||||||||||||||||||||
const auto& subconstraint_max = nmos::fields::constraint_maximum(subconstraint); | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
if (nmos::is_rational(constraint_max)) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
if (nmos::parse_rational(constraint_max) < nmos::parse_rational(subconstraint_max)) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
return false; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
else if (constraint_max.is_integer() && subconstraint_max.is_integer()) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
if (constraint_max.as_number().to_int64() < subconstraint_max.as_number().to_int64()) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
return false; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
else if (constraint_max.as_double() < subconstraint_max.as_double()) | ||||||||||||||||||||||||||||
if (constraint_comp(constraint_max, subconstraint_max)) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
return false; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
@@ -93,14 +256,14 @@ namespace nmos | |||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
// Constraint Set B is a subset of Constraint Set A if all Parameter Constraints of Constraint Set A are present in Constraint Set B, and for each Parameter Constraint | ||||||||||||||||||||||||||||
// that is present in both, the Parameter Constraint of Constraint Set B is a subconstraint of the Parameter Constraint of Constraint Set A. | ||||||||||||||||||||||||||||
bool is_constraint_subset(const web::json::value& constraint_set, const web::json::value& constraint_subset, bool merge) | ||||||||||||||||||||||||||||
bool is_constraint_subset(const web::json::value& constraint_set, const web::json::value& constraint_subset, bool merge_left_to_right) | ||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm still not seeing why |
||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
using web::json::value; | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
const auto& param_constraints_set = constraint_set.as_object(); | ||||||||||||||||||||||||||||
auto param_constraints_subset = constraint_subset.as_object(); | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
if (merge) | ||||||||||||||||||||||||||||
if (merge_left_to_right) | ||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||
param_constraints_subset = param_constraints_set; | ||||||||||||||||||||||||||||
std::for_each(constraint_subset.as_object().begin(), constraint_subset.as_object().end(), [¶m_constraints_subset](const std::pair<utility::string_t, value>& subconstraint) | ||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
How about something like
constraint_value_less
?(I did wonder if we could rely on
web::json::operator<
after handling rational, but I think we want that different types are incomparable (!a<b and !b<a), whereas that operator provides a total ordering.)nmos-cpp/Development/cpprest/json_ops.h
Line 112 in a0ff5f3
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why do we want that different types are incomparable? Do you mean that
constraint_value_less
should treat different types as equal values (a<b
givesfalse
andb<a
givesfalse
)?Why don't we want
lhs
andrhs
insideget_intersection
be total ordered beforeset_intersection
call? Can the equality of different types create a situation likelhs = { int_A, int_B, string_A }; rhs = {string_A, int_A, int_B }
?