1 // -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*- 2 // 3 // sets.h: Rcpp R/C++ interface class library -- 4 // 5 // Copyright (C) 2012 Dirk Eddelbuettel and Romain Francois 6 // 7 // This file is part of Rcpp. 8 // 9 // Rcpp is free software: you can redistribute it and/or modify it 10 // under the terms of the GNU General Public License as published by 11 // the Free Software Foundation, either version 2 of the License, or 12 // (at your option) any later version. 13 // 14 // Rcpp is distributed in the hope that it will be useful, but 15 // WITHOUT ANY WARRANTY; without even the implied warranty of 16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 // GNU General Public License for more details. 18 // 19 // You should have received a copy of the GNU General Public License 20 // along with Rcpp. If not, see <http://www.gnu.org/licenses/>. 21 22 #ifndef Rcpp__sugar__sets_h 23 #define Rcpp__sugar__sets_h 24 25 #if __cplusplus >= 201103L 26 #define RCPP_UNORDERED_SET std::unordered_set 27 #define RCPP_UNORDERED_MAP std::unordered_map 28 29 namespace std { 30 template<> 31 struct hash<Rcpp::String> { 32 std::size_t operator()(const Rcpp::String& key) const { 33 return pointer_hasher( key.get_sexp() ) ; 34 } 35 hash<SEXP> pointer_hasher ; 36 }; 37 } 38 39 #elif defined(HAS_TR1_UNORDERED_SET) 40 #define RCPP_UNORDERED_SET std::tr1::unordered_set 41 #define RCPP_UNORDERED_MAP std::tr1::unordered_map 42 43 namespace std { 44 namespace tr1 { 45 template<> 46 struct hash<Rcpp::String> { 47 std::size_t operator()(const Rcpp::String& key) const { 48 return pointer_hasher( key.get_sexp() ) ; 49 } 50 hash<SEXP> pointer_hasher ; 51 }; 52 } 53 } 54 55 56 #else 57 #define RCPP_UNORDERED_SET std::set 58 #define RCPP_UNORDERED_MAP std::map 59 #endif 60 61 #endif 62