$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-users] [Unordered] template find() request
From: Kenneth Heafield (void_at_[hidden])
Date: 2009-03-08 17:07:09
Hello Boost,
    Suppose I have a boost::unordered_set<std::string>.  Now I want to
find() a const char *, std::string, or even a string without zero
termination (Google StringPiece).  Converting these to std::string just
to do a lookup is wasteful.  Instead, I want to provide functors like:
struct either_hash {
  size_t operator()(const std::string &str) const {
    return boost::hash_range(str.begin(), str.end());
  }
  size_t operator()(const char *str) const {
     return boost::hash_range(str, str + std::strlen(str));
  }
};
This raises the question: what is either_hash::argument_type ?  But it
seems this is not used by boost::unordered_set .  It should probably be
std::string to match the underlying hash table. 
Would it make sense to change find() to template <class query_type>
const_iterator find(const query_type& q) const ? 
For those familiar with Google StringPiece, one solution is using
boost::unordered_set<StringPiece>, but then I have to keep the
underlying strings somewhere outside the table.  Further, a generalized
find is useful in other cases, but this was the easiest to explain. 
Kenneth