补全边角
This commit is contained in:
@@ -43,6 +43,7 @@ struct Property_Descriptor {
|
||||
static constexpr bool writable = Accessor::writable && (intrinsic_capability == Property_Capability::write || intrinsic_capability == Property_Capability::read_write);
|
||||
static constexpr bool synchronized_view_read = Accessor::synchronized_view_read;
|
||||
static constexpr bool trusted_object_access = Accessor::trusted_object_access;
|
||||
static constexpr bool runtime_copy_writable = writable && requires(const Accessor& accessor, object_type& object, const value_type& candidate) { accessor.write(object, candidate); };
|
||||
static_assert(unique_single_value_categories<Attributes...>());
|
||||
static_assert(!((intrinsic_capability == Property_Capability::read || intrinsic_capability == Property_Capability::read_write) && !Accessor::readable), "property capability requests read from a non-readable accessor");
|
||||
static_assert(!((intrinsic_capability == Property_Capability::write || intrinsic_capability == Property_Capability::read_write) && !Accessor::writable), "property capability requests write from a non-writable accessor");
|
||||
@@ -55,9 +56,11 @@ struct Property_Descriptor {
|
||||
template <class Category>
|
||||
using attribute_type = find_attribute_in_list_t<Category, attribute_types>;
|
||||
template <class Category>
|
||||
static constexpr bool has_attribute = !std::same_as<attribute_type<Category>, void>;
|
||||
static constexpr std::size_t attribute_count = count_attribute_category<Category, Attributes...>();
|
||||
template <class Category>
|
||||
constexpr decltype(auto) attribute() const requires has_attribute<Category> {
|
||||
static constexpr bool has_attribute = attribute_count<Category> != 0;
|
||||
template <class Category>
|
||||
constexpr decltype(auto) attribute() const requires (attribute_count<Category> == 1) {
|
||||
using target = attribute_type<Category>;
|
||||
return std::get<target>(attributes);
|
||||
}
|
||||
@@ -70,6 +73,17 @@ struct Property_Descriptor {
|
||||
(function(values), ...);
|
||||
}, attributes);
|
||||
}
|
||||
template <class Category, class Function>
|
||||
constexpr void for_each_attribute(Function&& function) const {
|
||||
std::apply([&](const auto&... values) {
|
||||
([&] {
|
||||
using type = std::remove_cvref_t<decltype(values)>;
|
||||
if constexpr (std::same_as<attribute_category_of_t<type>, Category>) {
|
||||
function(values);
|
||||
}
|
||||
}(), ...);
|
||||
}, attributes);
|
||||
}
|
||||
template <class Function>
|
||||
constexpr void for_each_constraint(Function&& function) const {
|
||||
std::apply([&](const auto&... values) {
|
||||
|
||||
Reference in New Issue
Block a user