diff options
Diffstat (limited to 'o3d/base/cross')
-rw-r--r-- | o3d/base/cross/std_hash.h | 165 |
1 files changed, 0 insertions, 165 deletions
diff --git a/o3d/base/cross/std_hash.h b/o3d/base/cross/std_hash.h deleted file mode 100644 index ceac439..0000000 --- a/o3d/base/cross/std_hash.h +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright 2009, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -// This file declares STL hash map classes in a cross-compiler way, providing a -// GCC-compatible (not MSVC) interface. - -#ifndef O3D_BASE_CROSS_STD_HASH_H_ -#define O3D_BASE_CROSS_STD_HASH_H_ - -#include <build/build_config.h> - -#if defined(COMPILER_MSVC) -#include <hash_map> -#include <hash_set> -namespace o3d { -namespace base { - -struct PortableHashBase { - // These two public members are required by msvc. 4 and 8 are the - // default values. - static const size_t bucket_size = 4; - static const size_t min_buckets = 8; -}; - -template <typename Key> -struct hash; - -// These are missing from MSVC. -template<> struct hash<int> { - size_t operator()(int n) const { - return static_cast<size_t>(n); - } -}; - -template<> struct hash<unsigned int> { - size_t operator()(unsigned int n) const { - return static_cast<size_t>(n); - } -}; - -template<typename T> struct hash<T*> { - size_t operator()(T* t) const { - return reinterpret_cast<size_t>(t); - } -}; - -// If the 3rd template parameter of the GNU interface (KeyEqual) is -// omitted, then we know that it's using the == operator, so we can -// safely use the < operator. -// -// If the third parameter is specified, then we get a compile time -// error, and we know we have to go back and add some #ifdefs. -template <typename Key, typename Hash> -struct HashAndLessOperator : PortableHashBase { - bool operator()(const Key& a, const Key& b) const { - return a < b; - } - size_t operator()(const Key& key) const { - return hasher_(key); - } - Hash hasher_; -}; - -template <class Key, class Hash = hash<Key> > -class hash_set : public stdext::hash_set<Key, HashAndLessOperator<Key, Hash> > { - public: - hash_set() {} - explicit hash_set(int buckets) {} - typedef std::equal_to<Key> key_equal; - size_type bucket_count() const { - return size() / bucket_size; - } -}; - -template <class Key, class Val, class Hash = hash<Key> > -class hash_map : public stdext::hash_map< - Key, Val, HashAndLessOperator<Key, Hash> > { - public: - hash_map() {} - explicit hash_map(int buckets) {} - typedef std::equal_to<Key> key_equal; - size_type bucket_count() const { - return size() / bucket_size; - } -}; - -template <class Key, class Hash = hash<Key> > -class hash_multiset : public stdext::hash_multiset< - Key, HashAndLessOperator<Key, Hash> > { - public: - hash_multiset() {} - explicit hash_multiset(int buckets) {} - typedef std::equal_to<Key> key_equal; - size_type bucket_count() const { - return size() / bucket_size; - } -}; - -template <class Key, class Val, class Hash = hash<Key> > -class hash_multimap : public stdext::hash_multimap< - Key, Val, HashAndLessOperator<Key, Hash> > { - public: - hash_multimap() {} - explicit hash_multimap(int buckets) {} - typedef std::equal_to<Key> key_equal; - size_type bucket_count() const { - return size() / bucket_size; - } -}; - -} // namespace base -} // namespace o3d -#elif defined COMPILER_GCC -#include <ext/hash_map> -#include <ext/hash_set> -#include <tr1/functional> -namespace __gnu_cxx { -template <class T> struct hash<T*> { - size_t operator() (const T* x) const { - return hash<size_t>()(reinterpret_cast<size_t>(x)); - } -}; -} // namespace __gnu_cxx - -namespace o3d { -namespace base { -using __gnu_cxx::hash_map; -using __gnu_cxx::hash_multimap; -using __gnu_cxx::hash_set; -using __gnu_cxx::hash_multiset; -using __gnu_cxx::hash; -} // namespace base -} // namespace o3d -#endif // COMPILER_MSVC - -#endif // O3D_BASE_CROSS_STD_HASH_H_ |