message: vector: make push_back_if_missing more generic than just std::vector
  Also, use boost rather than duplicating (hence the removal of
  pseudo range-based find overloads).
diff: #include <ostream>
  #include_next <vector>
  +
  +#include <boost/algorithm/cxx11/none_of.hpp>
  +
  #include <elle/printf-fwd.hh>
  namespace std
  @@ -26,42 +29,26 @@ namespace std
  return out;
  }
  - /// Look for \a e in \a v, const version.
  - template <typename... Args, typename T>
  - auto
  - find(std::vector<Args...> const& v, T const& e)
  - -> typename std::vector<Args...>::const_iterator
  - {
  - return std::find(std::begin(v), std::end(v), e);
  - }
  -
  - /// Look for \a e in \a v, mutable version.
  - template <typename... Args, typename T>
  - auto
  - find(std::vector<Args...>& v, T const& e)
  - -> typename std::vector<Args...>::iterator
  - {
  - return std::find(std::begin(v), std::end(v), e);
  - }
  -
  /// Whether \a e is in \a v.
  - template <typename... Args, typename T>
  + ///
  + /// Get rid of it in favor of none_of_equal.
  + template <typename Container, typename T>
  bool
  - contains(std::vector<Args...> const& v, T const& e)
  + contains(Container const& c, T const& e)
  {
  - return std::find(v, e) != std::end(v);
  + return boost::algorithm::none_of_equal(c, e);
  }
  /// Emplace back only if not already in the vector.
  ///
  /// The need for this function is somewhat a smell: wouldn't a set
  /// or a flat_set do better?
  - template <typename... Args, typename T>
  + template <typename Container, typename T>
  void
  - push_back_if_missing(std::vector<Args...>& v, T const& e)
  + push_back_if_missing(Container& c, T const& e)
  {
  - if (!contains(v, e))
  - v.push_back(e);
  + if (boost::algorithm::none_of_equal(c, e))
  + c.push_back(e);
  }
  }
  