diff options
| author | Howard Hinnant <hhinnant@apple.com> | 2013-07-04 19:46:35 +0000 |
|---|---|---|
| committer | Howard Hinnant <hhinnant@apple.com> | 2013-07-04 19:46:35 +0000 |
| commit | bbdf669bde57f1a2f8fa1a3d4fbb46b1e3c25a4c (patch) | |
| tree | 0e1d1286ee7d083650669efae7460466a0d46ae0 | |
| parent | 1cbed2283677d6b098a705cabcd878392d61e25a (diff) | |
| download | bcm5719-llvm-bbdf669bde57f1a2f8fa1a3d4fbb46b1e3c25a4c.tar.gz bcm5719-llvm-bbdf669bde57f1a2f8fa1a3d4fbb46b1e3c25a4c.zip | |
Simplify comparators of [unordered_][multi]map. This fixes http://llvm.org/bugs/show_bug.cgi?id=16538
llvm-svn: 185665
| -rw-r--r-- | libcxx/include/map | 38 | ||||
| -rw-r--r-- | libcxx/include/unordered_map | 46 | ||||
| -rw-r--r-- | libcxx/test/containers/associative/map/compare.pass.cpp | 29 | ||||
| -rw-r--r-- | libcxx/test/containers/unord/unord.map/compare.pass.cpp | 39 |
4 files changed, 68 insertions, 84 deletions
diff --git a/libcxx/include/map b/libcxx/include/map index df174daaae3..d0cd0c6b844 100644 --- a/libcxx/include/map +++ b/libcxx/include/map @@ -389,7 +389,6 @@ template <class _Key, class _Tp, class _Compare, bool = is_empty<_Compare>::valu class __map_value_compare : private _Compare { - typedef pair<typename std::remove_const<_Key>::type, _Tp> _Pp; typedef pair<const _Key, _Tp> _CP; public: _LIBCPP_INLINE_VISIBILITY @@ -406,29 +405,11 @@ public: bool operator()(const _CP& __x, const _CP& __y) const {return static_cast<const _Compare&>(*this)(__x.first, __y.first);} _LIBCPP_INLINE_VISIBILITY - bool operator()(const _CP& __x, const _Pp& __y) const - {return static_cast<const _Compare&>(*this)(__x.first, __y.first);} - _LIBCPP_INLINE_VISIBILITY bool operator()(const _CP& __x, const _Key& __y) const {return static_cast<const _Compare&>(*this)(__x.first, __y);} _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Pp& __x, const _CP& __y) const - {return static_cast<const _Compare&>(*this)(__x.first, __y.first);} - _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Pp& __x, const _Pp& __y) const - {return static_cast<const _Compare&>(*this)(__x.first, __y.first);} - _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Pp& __x, const _Key& __y) const - {return static_cast<const _Compare&>(*this)(__x.first, __y);} - _LIBCPP_INLINE_VISIBILITY bool operator()(const _Key& __x, const _CP& __y) const {return static_cast<const _Compare&>(*this)(__x, __y.first);} - _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Key& __x, const _Pp& __y) const - {return static_cast<const _Compare&>(*this)(__x, __y.first);} - _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Key& __x, const _Key& __y) const - {return static_cast<const _Compare&>(*this)(__x, __y);} }; template <class _Key, class _Tp, class _Compare> @@ -436,7 +417,6 @@ class __map_value_compare<_Key, _Tp, _Compare, false> { _Compare comp; - typedef pair<typename std::remove_const<_Key>::type, _Tp> _Pp; typedef pair<const _Key, _Tp> _CP; public: @@ -455,29 +435,11 @@ public: bool operator()(const _CP& __x, const _CP& __y) const {return comp(__x.first, __y.first);} _LIBCPP_INLINE_VISIBILITY - bool operator()(const _CP& __x, const _Pp& __y) const - {return comp(__x.first, __y.first);} - _LIBCPP_INLINE_VISIBILITY bool operator()(const _CP& __x, const _Key& __y) const {return comp(__x.first, __y);} _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Pp& __x, const _CP& __y) const - {return comp(__x.first, __y.first);} - _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Pp& __x, const _Pp& __y) const - {return comp(__x.first, __y.first);} - _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Pp& __x, const _Key& __y) const - {return comp(__x.first, __y);} - _LIBCPP_INLINE_VISIBILITY bool operator()(const _Key& __x, const _CP& __y) const {return comp(__x, __y.first);} - _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Key& __x, const _Pp& __y) const - {return comp(__x, __y.first);} - _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Key& __x, const _Key& __y) const - {return comp(__x, __y);} }; template <class _Allocator> diff --git a/libcxx/include/unordered_map b/libcxx/include/unordered_map index 772c44b6f4b..cc30d763424 100644 --- a/libcxx/include/unordered_map +++ b/libcxx/include/unordered_map @@ -333,7 +333,6 @@ template <class _Key, class _Tp, class _Hash, bool = is_empty<_Hash>::value class __unordered_map_hasher : private _Hash { - typedef pair<typename remove_const<_Key>::type, _Tp> _Pp; typedef pair<const _Key, _Tp> _Cp; public: _LIBCPP_INLINE_VISIBILITY @@ -347,9 +346,6 @@ public: _LIBCPP_INLINE_VISIBILITY const _Hash& hash_function() const _NOEXCEPT {return *this;} _LIBCPP_INLINE_VISIBILITY - size_t operator()(const _Pp& __x) const - {return static_cast<const _Hash&>(*this)(__x.first);} - _LIBCPP_INLINE_VISIBILITY size_t operator()(const _Cp& __x) const {return static_cast<const _Hash&>(*this)(__x.first);} _LIBCPP_INLINE_VISIBILITY @@ -362,7 +358,6 @@ class __unordered_map_hasher<_Key, _Tp, _Hash, false> { _Hash __hash_; - typedef pair<typename remove_const<_Key>::type, _Tp> _Pp; typedef pair<const _Key, _Tp> _Cp; public: _LIBCPP_INLINE_VISIBILITY @@ -376,9 +371,6 @@ public: _LIBCPP_INLINE_VISIBILITY const _Hash& hash_function() const _NOEXCEPT {return __hash_;} _LIBCPP_INLINE_VISIBILITY - size_t operator()(const _Pp& __x) const - {return __hash_(__x.first);} - _LIBCPP_INLINE_VISIBILITY size_t operator()(const _Cp& __x) const {return __hash_(__x.first);} _LIBCPP_INLINE_VISIBILITY @@ -394,7 +386,6 @@ template <class _Key, class _Tp, class _Pred, bool = is_empty<_Pred>::value class __unordered_map_equal : private _Pred { - typedef pair<typename remove_const<_Key>::type, _Tp> _Pp; typedef pair<const _Key, _Tp> _Cp; public: _LIBCPP_INLINE_VISIBILITY @@ -408,32 +399,14 @@ public: _LIBCPP_INLINE_VISIBILITY const _Pred& key_eq() const _NOEXCEPT {return *this;} _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Pp& __x, const _Pp& __y) const - {return static_cast<const _Pred&>(*this)(__x.first, __y.first);} - _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Pp& __x, const _Cp& __y) const - {return static_cast<const _Pred&>(*this)(__x.first, __y.first);} - _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Pp& __x, const _Key& __y) const - {return static_cast<const _Pred&>(*this)(__x.first, __y);} - _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Cp& __x, const _Pp& __y) const - {return static_cast<const _Pred&>(*this)(__x.first, __y.first);} - _LIBCPP_INLINE_VISIBILITY bool operator()(const _Cp& __x, const _Cp& __y) const {return static_cast<const _Pred&>(*this)(__x.first, __y.first);} _LIBCPP_INLINE_VISIBILITY bool operator()(const _Cp& __x, const _Key& __y) const {return static_cast<const _Pred&>(*this)(__x.first, __y);} _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Key& __x, const _Pp& __y) const - {return static_cast<const _Pred&>(*this)(__x, __y.first);} - _LIBCPP_INLINE_VISIBILITY bool operator()(const _Key& __x, const _Cp& __y) const {return static_cast<const _Pred&>(*this)(__x, __y.first);} - _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Key& __x, const _Key& __y) const - {return static_cast<const _Pred&>(*this)(__x, __y);} }; template <class _Key, class _Tp, class _Pred> @@ -441,7 +414,6 @@ class __unordered_map_equal<_Key, _Tp, _Pred, false> { _Pred __pred_; - typedef pair<typename remove_const<_Key>::type, _Tp> _Pp; typedef pair<const _Key, _Tp> _Cp; public: _LIBCPP_INLINE_VISIBILITY @@ -455,32 +427,14 @@ public: _LIBCPP_INLINE_VISIBILITY const _Pred& key_eq() const _NOEXCEPT {return __pred_;} _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Pp& __x, const _Pp& __y) const - {return __pred_(__x.first, __y.first);} - _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Pp& __x, const _Cp& __y) const - {return __pred_(__x.first, __y.first);} - _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Pp& __x, const _Key& __y) const - {return __pred_(__x.first, __y);} - _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Cp& __x, const _Pp& __y) const - {return __pred_(__x.first, __y.first);} - _LIBCPP_INLINE_VISIBILITY bool operator()(const _Cp& __x, const _Cp& __y) const {return __pred_(__x.first, __y.first);} _LIBCPP_INLINE_VISIBILITY bool operator()(const _Cp& __x, const _Key& __y) const {return __pred_(__x.first, __y);} _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Key& __x, const _Pp& __y) const - {return __pred_(__x, __y.first);} - _LIBCPP_INLINE_VISIBILITY bool operator()(const _Key& __x, const _Cp& __y) const {return __pred_(__x, __y.first);} - _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Key& __x, const _Key& __y) const - {return __pred_(__x, __y);} }; template <class _Alloc> diff --git a/libcxx/test/containers/associative/map/compare.pass.cpp b/libcxx/test/containers/associative/map/compare.pass.cpp new file mode 100644 index 00000000000..f5e69173eb1 --- /dev/null +++ b/libcxx/test/containers/associative/map/compare.pass.cpp @@ -0,0 +1,29 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <map> + +// template <class Key, class T, class Compare = less<Key>, +// class Allocator = allocator<pair<const Key, T>>> +// class map + +// http://llvm.org/bugs/show_bug.cgi?id=16538 + +#include <map> + +struct Key { + template <typename T> Key(const T&) {} + bool operator< (const Key&) const { return false; } +}; + +int +main() +{ + std::map<Key, int>::iterator it = std::map<Key, int>().find(Key(0)); +} diff --git a/libcxx/test/containers/unord/unord.map/compare.pass.cpp b/libcxx/test/containers/unord/unord.map/compare.pass.cpp new file mode 100644 index 00000000000..814c40f2d2b --- /dev/null +++ b/libcxx/test/containers/unord/unord.map/compare.pass.cpp @@ -0,0 +1,39 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <unordered_map> + +// template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>, +// class Alloc = allocator<pair<const Key, T>>> +// class unordered_map + +// http://llvm.org/bugs/show_bug.cgi?id=16538 + +#include <unordered_map> + +struct Key { + template <typename T> Key(const T&) {} + bool operator== (const Key&) const { return true; } +}; + +namespace std +{ + template <> + struct hash<Key> + { + size_t operator()(Key const &) const {return 0;} + }; +} + +int +main() +{ + std::unordered_map<Key, int>::iterator it = + std::unordered_map<Key, int>().find(Key(0)); +} |

