Advertisement
Guest User

Untitled

a guest
Jul 19th, 2013
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.97 KB | None | 0 0
  1. #include <iostream>
  2. #include <set>
  3. #include <unordered_map>
  4. #include <tuple>
  5.  
  6. // as in http://stackoverflow.com/questions/15103975/my-stdhash-for-stdtuples-any-improvements
  7. namespace std
  8. {
  9.     template<typename... TTypes>
  10.     class hash<std::tuple<TTypes...>>
  11.     {
  12.     private:
  13.         typedef std::tuple<TTypes...> Tuple;
  14.  
  15.         template<int N>
  16.         size_t operator()(Tuple value) const { return 0; }
  17.  
  18.         template<int N, typename THead, typename... TTail>
  19.         size_t operator()(Tuple value) const
  20.         {
  21.             constexpr int Index = N - sizeof...(TTail) - 1;
  22.             return hash<THead>()(std::get<Index>(value)) ^ operator()<N, TTail...>(value);
  23.         }
  24.  
  25.     public:
  26.         size_t operator()(Tuple value) const
  27.         {
  28.             return operator()<sizeof...(TTypes), TTypes...>(value);
  29.         }
  30.     };
  31. }
  32.  
  33. template <class set_type, class... addl_set_types>
  34. class Function {
  35.  
  36. private:
  37.     static constexpr size_t set_dimensions_ = sizeof...(addl_set_types) + 1;
  38.     std::tuple<std::set<set_type>, std::set<addl_set_types>...> sets_;
  39.     std::unordered_map<std::tuple<set_type, addl_set_types...>, double> map_;
  40.    
  41. public:
  42.     Function(std::set<set_type> first_set, std::set<addl_set_types>... addl_sets): sets_(first_set, addl_sets...) {};
  43.  
  44.     template <size_t index = 0>
  45.             bool is_in_domain(std::tuple<set_type, addl_set_types...> const& t) const {
  46.             const auto& set = std::get<index>(sets_);
  47.             if (set.find(std::get<index>(t)) != set.end()) {
  48.                 if (index + 1 < set_dimensions_) {
  49.                     return is_in_domain<index + 1>(t);
  50.                 }
  51.                 else return true;
  52.             }
  53.             return false;
  54.         }
  55. };
  56.  
  57. int main() {
  58.    
  59.     std::set<int> s1;
  60.     std::set<std::string> s2;
  61.    
  62.     s1.insert(2);
  63.     s1.insert(4);
  64.     s2.insert("foo");
  65.     s2.insert("bar");
  66.    
  67.     Function<int, std::string> f(s1, s2);
  68.     auto const point = std::make_tuple(2,"bar");
  69.     f.is_in_domain(point); // comment to compile
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement