62 template <
typename T >
63 ostream&
operator<<(ostream& stream,
const vector< T >& val) {
67 for (
const auto& v: val) {
68 if (deja) stream <<
" , ";
78 template <
typename T1,
typename T2 >
79 ostream&
operator<<(ostream& stream,
const pair< T1, T2 >& val) {
80 stream <<
"(" << val.first <<
"," << val.second <<
")";
86 template <
typename... T >
87 static typename std::enable_if< (N <
sizeof...(T)) >::type
print(std::ostream& os,
88 const std::tuple< T... >& t) {
90 = (std::is_convertible< decltype(std::get< N >(t)), std::string >::value) ?
'"' : 0;
91 os <<
", " << quote << std::get< N >(t) << quote;
95 template <
typename... T >
96 static typename std::enable_if< !(N <
sizeof...(T)) >::type
print(std::ostream&,
97 const std::tuple< T... >&) {}
100 template <
typename T0,
typename... T >
101 std::ostream&
operator<<(std::ostream& os,
const std::tuple< T0, T... >& t) {
102 char quote = (std::is_convertible< T0, std::string >::value) ?
'"' : 0;
103 os << '(' << quote << std::get< 0 >(t) << quote;
110 if (x.size() <= 1)
return true;
111 if (x.size() == 2)
return x[0] != x[1];
113 auto refless = [](T
const* l, T
const* r) {
return *l < *r; };
114 auto refeq = [](T
const* l, T
const* r) {
return *l == *r; };
116 std::vector< T const* > vp;
117 vp.reserve(x.size());
118 for (
size_t i = 0; i < x.size(); ++i)
120 sort(vp.begin(), vp.end(), refless);
122 return std::adjacent_find(vp.begin(), vp.end(), refeq) == vp.end();
128 template <
typename T >
130 if (t1 == t2)
return false;
131 else if (t1 == 0)
return (std::abs(t2) > 1e-5);
132 else return (std::abs(t2 - t1) / t1 > 1e-5);
135 template <
typename T >
bool hasUniqueElts(std::vector< T > const &x)
gum is the global namespace for all aGrUM entities
std::ostream & operator<<(std::ostream &os, const std::tuple<> &)
bool operator()(const T &t1, const T &t2)
static std::enable_if<(N< sizeof...(T))>::type print(std::ostream &os, const std::tuple< T... > &t)
static std::enable_if<!(N< sizeof...(T))>::type print(std::ostream &, const std::tuple< T... > &)