37 #include <type_traits> 40 template <
typename T >
41 ostream& operator<<(ostream& stream, const vector< T >& val) {
45 for (
const auto& v : val) {
58 template <
typename T1,
typename T2 >
59 ostream& operator<<(ostream& stream, const pair< T1, T2 >& val) {
60 stream <<
"(" << val.first <<
"," << val.second <<
")";
66 template <
typename... T >
67 static typename std::enable_if< (N <
sizeof...(T)) >::type
68 print(std::ostream& os,
const std::tuple< T... >& t) {
70 (std::is_convertible< decltype(std::get< N >(t)), std::string >::value)
73 os <<
", " << quote << std::get< N >(t) << quote;
76 template <
typename... T >
77 static typename std::enable_if< !(N <
sizeof...(T)) >::type
78 print(std::ostream&,
const std::tuple< T... >&) {}
81 template <
typename T0,
typename... T >
82 std::ostream&
operator<<(std::ostream& os,
const std::tuple< T0, T... >& t) {
83 char quote = (std::is_convertible< T0, std::string >::value) ?
'"' : 0;
84 os << '(' << quote << std::get< 0 >(t) << quote;
91 if (x.size() <= 1)
return true;
92 if (x.size() == 2)
return x[0] != x[1];
94 auto refless = [](T
const* l, T
const* r) {
return *l < *r; };
95 auto refeq = [](T
const* l, T
const* r) {
return *l == *r; };
97 std::vector< T const* > vp;
99 for (
size_t i = 0; i < x.size(); ++i)
101 sort(vp.begin(), vp.end(), refless);
103 return std::adjacent_find(vp.begin(), vp.end(), refeq) == vp.end();
bool hasUniqueElts(std::vector< T > const &x)
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
std::ostream & operator<<(std::ostream &output, const BayesNet< GUM_SCALAR > &bn)
Prints map's DAG in output using the Graphviz-dot format.
static std::enable_if< !(N< sizeof...(T)) >::type print(std::ostream &, const std::tuple< T... > &)
static std::enable_if<(N< sizeof...(T)) >::type print(std::ostream &os, const std::tuple< T... > &t)