30 #include <agrum/tools/core/utils_misc.h> 36 #include <type_traits> 39 template <
typename T >
40 ostream& operator<<(ostream& stream,
const vector< T >& val) {
44 for (
const auto& v: val) {
57 template <
typename T1,
typename T2 >
58 ostream& operator<<(ostream& stream,
const pair< T1, T2 >& val) {
59 stream <<
"(" << val.first <<
"," << val.second <<
")";
64 struct auxiliary_print_tuple__ {
65 template <
typename... T >
66 static typename std::enable_if< (N <
sizeof...(T)) >::type
67 print(std::ostream& os,
const std::tuple< T... >& t) {
69 = (std::is_convertible<
decltype(std::get< N >(t)), std::string >::value)
72 os <<
", " << quote << std::get< N >(t) << quote;
73 auxiliary_print_tuple__< N + 1 >::print(os, t);
75 template <
typename... T >
76 static typename std::enable_if< !(N <
sizeof...(T)) >::type
77 print(std::ostream&,
const std::tuple< T... >&) {}
80 template <
typename T0,
typename... T >
81 std::ostream& operator<<(std::ostream& os,
const std::tuple< T0, T... >& t) {
82 char quote = (std::is_convertible< T0, std::string >::value) ?
'"' : 0;
83 os <<
'(' << quote << std::get< 0 >(t) << quote;
84 auxiliary_print_tuple__< 1 >::print(os, t);
89 bool hasUniqueElts(std::vector< T >
const& x) {
90 if (x.size() <= 1)
return true;
91 if (x.size() == 2)
return x[0] != x[1];
93 auto refless = [](T
const* l, T
const* r) {
96 auto refeq = [](T
const* l, T
const* r) {
100 std::vector< T
const* > vp;
101 vp.reserve(x.size());
102 for (size_t i = 0; i < x.size(); ++i)
104 sort(vp.begin(), vp.end(), refless);
106 return std::adjacent_find(vp.begin(), vp.end(), refeq) == vp.end();