29 #ifndef PIRANHA_IS_KEY_HPP 30 #define PIRANHA_IS_KEY_HPP 33 #include <type_traits> 37 #include <piranha/symbol_utils.hpp> 68 using is_compatible_t = decltype(std::declval<const U &>().is_compatible(std::declval<symbol_fset const &>()));
70 using is_zero_t = decltype(std::declval<const U &>().is_zero(std::declval<symbol_fset const &>()));
72 using merge_symbols_t = decltype(std::declval<const U &>().merge_symbols(
75 using is_unitary_t = decltype(std::declval<const U &>().is_unitary(std::declval<symbol_fset const &>()));
77 using print_t = decltype(
78 std::declval<const U &>().print(std::declval<std::ostream &>(), std::declval<symbol_fset const &>()));
80 using print_tex_t = decltype(
81 std::declval<const U &>().print_tex(std::declval<std::ostream &>(), std::declval<symbol_fset const &>()));
83 using trim_identify_t = decltype(std::declval<const U &>().trim_identify(std::declval<std::vector<char> &>(),
84 std::declval<symbol_fset const &>()));
86 using trim_t = decltype(
87 std::declval<const U &>().trim(std::declval<
const std::vector<char> &>(), std::declval<symbol_fset const &>()));
89 using check_methods_t = std::integral_constant<
91 conjunction<std::is_same<detected_t<is_compatible_t, U>,
bool>, std::is_same<detected_t<is_zero_t, U>,
bool>,
92 std::is_same<detected_t<merge_symbols_t, U>, U>, std::is_same<detected_t<is_unitary_t, U>,
bool>,
93 std::is_same<detected_t<print_t, U>,
void>, std::is_same<detected_t<print_tex_t, U>,
void>,
94 std::is_same<detected_t<trim_identify_t, U>,
void>, std::is_same<detected_t<trim_t, U>, U>>
::value>;
95 template <
typename U,
typename =
void>
97 static const bool value =
false;
100 struct is_key_impl<U, enable_if_t<check_methods_t<U>::
value>> {
101 static const bool value 102 = conjunction<is_container_element<U>, std::is_constructible<U, const symbol_fset &>,
104 && noexcept(std::declval<const U &>().is_compatible(std::declval<const symbol_fset &>()))
105 && noexcept(std::declval<const U &>().is_zero(std::declval<const symbol_fset &>()));
107 static const bool implementation_defined = is_key_impl<T>::value;
111 static const bool value = implementation_defined;
114 template <
typename T>
Equality-comparable type trait.
boost::container::flat_map< symbol_idx, T > symbol_idx_fmap
Flat map of symbol indices.
static const bool value
Value of the type trait.