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 print(std::ostream& os,
67 const std::tuple< T... >& t) {
69 = (std::is_convertible<
decltype(std::get< N >(t)), std::string >::value) ?
'"' : 0;
70 os <<
", " << quote << std::get< N >(t) << quote;
71 _auxiliary_print_tuple_< N + 1 >::print(os, t);
73 template <
typename... T >
74 static typename std::enable_if< !(N <
sizeof...(T)) >::type print(std::ostream&,
75 const std::tuple< T... >&) {}
78 template <
typename T0,
typename... T >
79 std::ostream& operator<<(std::ostream& os,
const std::tuple< T0, T... >& t) {
80 char quote = (std::is_convertible< T0, std::string >::value) ?
'"' : 0;
81 os <<
'(' << quote << std::get< 0 >(t) << quote;
82 _auxiliary_print_tuple_< 1 >::print(os, t);
87 bool hasUniqueElts(std::vector< T >
const& x) {
88 if (x.size() <= 1)
return true;
89 if (x.size() == 2)
return x[0] != x[1];
91 auto refless = [](T
const* l, T
const* r) {
94 auto refeq = [](T
const* l, T
const* r) {
98 std::vector< T
const* > vp;
100 for (size_t i = 0; i < x.size(); ++i)
102 sort(vp.begin(), vp.end(), refless);
104 return std::adjacent_find(vp.begin(), vp.end(), refeq) == vp.end();