]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
HashMap implementation in INTERP_KERNEL to avoid warnings due to non standard functio...
authorageay <ageay>
Wed, 17 Feb 2010 14:24:09 +0000 (14:24 +0000)
committerageay <ageay>
Wed, 17 Feb 2010 14:24:09 +0000 (14:24 +0000)
src/INTERP_KERNEL/Bases/InterpKernelHashFun.hxx [new file with mode: 0644]
src/INTERP_KERNEL/Bases/InterpKernelHashMap.hxx [new file with mode: 0644]
src/INTERP_KERNEL/Bases/InterpKernelHashTable.hxx [new file with mode: 0644]
src/INTERP_KERNEL/Bases/InterpKernelStlExt.hxx [new file with mode: 0644]
src/INTERP_KERNEL/Bases/Makefile.am
src/INTERP_KERNEL/SplitterTetra.hxx
src/INTERP_KERNEL/SplitterTetra.txx

diff --git a/src/INTERP_KERNEL/Bases/InterpKernelHashFun.hxx b/src/INTERP_KERNEL/Bases/InterpKernelHashFun.hxx
new file mode 100644 (file)
index 0000000..1e09faa
--- /dev/null
@@ -0,0 +1,153 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2009 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/*
+ * Copyright (c) 1996-1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ */
+#ifndef __INTERPKERNELHASHFUN_HXX__
+#define __INTERPKERNELHASHFUN_HXX__
+
+#include <cstddef>
+
+namespace INTERP_KERNEL
+{
+  template<class _Key>
+  struct hash { };
+
+  inline std::size_t __stl_hash_string(const char* __s)
+  {
+    unsigned long __h = 0;
+    for ( ; *__s; ++__s)
+      __h = 5 * __h + *__s;
+    return std::size_t(__h);
+  }
+
+  template<>
+  struct hash<char*>
+  {
+    std::size_t operator()(const char* __s) const
+    { return __stl_hash_string(__s); }
+  };
+
+  template<>
+  struct hash<const char*>
+  {
+    std::size_t operator()(const char* __s) const
+    { return __stl_hash_string(__s); }
+  };
+
+  template<>
+  struct hash<char>
+  { 
+    std::size_t operator()(char __x) const { return __x; }
+  };
+
+  template<>
+  struct hash<unsigned char>
+  { 
+    std::size_t operator()(unsigned char __x) const { return __x; }
+  };
+
+  template<>
+  struct hash<signed char>
+  {
+    std::size_t operator()(unsigned char __x) const { return __x; }
+  };
+
+  template<>
+  struct hash<short>
+  {
+    std::size_t operator()(short __x) const { return __x; }
+  };
+
+  template<>
+  struct hash<unsigned short>
+  {
+    std::size_t operator()(unsigned short __x) const { return __x; }
+  };
+
+  template<>
+  struct hash<int>
+  { 
+    std::size_t operator()(int __x) const { return __x; }
+  };
+
+  template<>
+  struct hash<unsigned int>
+  { 
+    std::size_t operator()(unsigned int __x) const { return __x; }
+  };
+
+  template<>
+  struct hash<long>
+  {
+    std::size_t operator()(long __x) const { return __x; }
+  };
+
+  template<>
+  struct hash<unsigned long>
+  {
+    std::size_t operator()(unsigned long __x) const { return __x; }
+  };
+}
+
+#endif
diff --git a/src/INTERP_KERNEL/Bases/InterpKernelHashMap.hxx b/src/INTERP_KERNEL/Bases/InterpKernelHashMap.hxx
new file mode 100644 (file)
index 0000000..0bb7176
--- /dev/null
@@ -0,0 +1,421 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+// Copyright (C) 2001, 2002, 2004, 2005, 2006, 2009 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/*
+ * Copyright (c) 1996
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ */
+#ifndef __INTERPKERNELHASHMAP__
+#define __INTERPKERNELHASHMAP__
+
+#include "InterpKernelStlExt.hxx"
+#include "InterpKernelHashTable.hxx"
+
+namespace INTERP_KERNEL
+{
+  template<class _Key, class _Tp, class _HashFn = hash<_Key>,
+           class _EqualKey = std::equal_to<_Key>, class _Alloc = std::allocator<_Tp> >
+  class HashMap
+  {
+  private:
+    typedef hashtable<std::pair<const _Key, _Tp>,_Key, _HashFn,
+                      STLEXT::Select1st<std::pair<const _Key, _Tp> >,
+                      _EqualKey, _Alloc> _Ht;
+
+    _Ht _M_ht;
+    
+  public:
+    typedef typename _Ht::key_type key_type;
+    typedef _Tp data_type;
+    typedef _Tp mapped_type;
+    typedef typename _Ht::value_type value_type;
+    typedef typename _Ht::hasher hasher;
+    typedef typename _Ht::key_equal key_equal;
+    
+    typedef typename _Ht::size_type size_type;
+    typedef typename _Ht::difference_type difference_type;
+    typedef typename _Ht::pointer pointer;
+    typedef typename _Ht::const_pointer const_pointer;
+    typedef typename _Ht::reference reference;
+    typedef typename _Ht::const_reference const_reference;
+    
+    typedef typename _Ht::iterator iterator;
+    typedef typename _Ht::const_iterator const_iterator;
+    
+    typedef typename _Ht::allocator_type allocator_type;
+      
+    hasher hash_funct() const { return _M_ht.hash_funct(); }
+
+    key_equal key_eq() const { return _M_ht.key_eq(); }
+    
+    allocator_type get_allocator() const { return _M_ht.get_allocator(); }
+
+    HashMap() : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
+  
+    explicit HashMap(size_type __n) : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
+
+    HashMap(size_type __n, const hasher& __hf) : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
+
+    HashMap(size_type __n, const hasher& __hf, const key_equal& __eql,
+            const allocator_type& __a = allocator_type()) : _M_ht(__n, __hf, __eql, __a) {}
+    
+    template<class _InputIterator>
+    HashMap(_InputIterator __f, _InputIterator __l) : _M_ht(100, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+    
+    template<class _InputIterator>
+    HashMap(_InputIterator __f, _InputIterator __l, size_type __n) : _M_ht(__n, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+
+    template<class _InputIterator>
+    HashMap(_InputIterator __f, _InputIterator __l, size_type __n, const hasher& __hf)
+      : _M_ht(__n, __hf, key_equal(), allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+    
+    template<class _InputIterator>
+    HashMap(_InputIterator __f, _InputIterator __l, size_type __n,
+            const hasher& __hf, const key_equal& __eql,
+            const allocator_type& __a = allocator_type()) : _M_ht(__n, __hf, __eql, __a)
+    { _M_ht.insert_unique(__f, __l); }
+    
+    size_type size() const { return _M_ht.size(); }
+    
+    size_type max_size() const { return _M_ht.max_size(); }
+    
+    bool empty() const { return _M_ht.empty(); }
+    
+    void swap(HashMap& __hs) { _M_ht.swap(__hs._M_ht); }
+    
+    template<class _K1, class _T1, class _HF, class _EqK, class _Al>
+    friend bool operator== (const HashMap<_K1, _T1, _HF, _EqK, _Al>&,
+                            const HashMap<_K1, _T1, _HF, _EqK, _Al>&);
+    
+    iterator begin() { return _M_ht.begin(); }
+    
+    iterator end() { return _M_ht.end(); }
+    
+    const_iterator begin() const { return _M_ht.begin(); }
+    
+    const_iterator end() const { return _M_ht.end(); }
+    
+    std::pair<iterator, bool> insert(const value_type& __obj) { return _M_ht.insert_unique(__obj); }
+    
+    template<class _InputIterator>
+    void insert(_InputIterator __f, _InputIterator __l) { _M_ht.insert_unique(__f, __l); }
+    
+    std::pair<iterator, bool>
+    insert_noresize(const value_type& __obj) { return _M_ht.insert_unique_noresize(__obj); }
+    
+    iterator find(const key_type& __key) { return _M_ht.find(__key); }
+    
+    const_iterator find(const key_type& __key) const { return _M_ht.find(__key); }
+    
+    _Tp& operator[](const key_type& __key) { return _M_ht.find_or_insert(value_type(__key, _Tp())).second; }
+    
+    size_type count(const key_type& __key) const { return _M_ht.count(__key); }
+    
+    std::pair<iterator, iterator> equal_range(const key_type& __key) { return _M_ht.equal_range(__key); }
+    
+    std::pair<const_iterator, const_iterator> equal_range(const key_type& __key) const { return _M_ht.equal_range(__key); }
+    
+    size_type erase(const key_type& __key) { return _M_ht.erase(__key); }
+    
+    void erase(iterator __it) { _M_ht.erase(__it); }
+    
+    void erase(iterator __f, iterator __l) { _M_ht.erase(__f, __l); }
+
+    void clear() { _M_ht.clear(); }
+
+    void resize(size_type __hint) { _M_ht.resize(__hint); }
+    
+    size_type bucket_count() const { return _M_ht.bucket_count(); }
+
+    size_type max_bucket_count() const { return _M_ht.max_bucket_count(); }
+    
+    size_type elems_in_bucket(size_type __n) const { return _M_ht.elems_in_bucket(__n); }
+  };
+  
+  template<class _Key, class _Tp, class _HashFn, class _EqlKey, class _Alloc>
+  inline bool operator==(const HashMap<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm1,
+                         const HashMap<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm2)
+  { return __hm1._M_ht == __hm2._M_ht; }
+  
+  template<class _Key, class _Tp, class _HashFn, class _EqlKey, class _Alloc>
+  inline bool operator!=(const HashMap<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm1,
+                         const HashMap<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm2)
+  { return !(__hm1 == __hm2); }
+  
+  template<class _Key, class _Tp, class _HashFn, class _EqlKey, class _Alloc>
+  inline void swap(HashMap<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm1,
+                   HashMap<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm2)
+  { __hm1.swap(__hm2); }
+
+  template<class _Key, class _Tp,
+           class _HashFn = hash<_Key>,
+           class _EqualKey = std::equal_to<_Key>,
+           class _Alloc = std::allocator<_Tp> >
+  class hash_multimap
+  {
+  private:
+    typedef hashtable<std::pair<const _Key, _Tp>, _Key, _HashFn,
+                      STLEXT::Select1st<std::pair<const _Key, _Tp> >, _EqualKey, _Alloc>
+    _Ht;
+    _Ht _M_ht;
+  public:
+    typedef typename _Ht::key_type key_type;
+    typedef _Tp data_type;
+    typedef _Tp mapped_type;
+    typedef typename _Ht::value_type value_type;
+    typedef typename _Ht::hasher hasher;
+    typedef typename _Ht::key_equal key_equal;
+    
+    typedef typename _Ht::size_type size_type;
+    typedef typename _Ht::difference_type difference_type;
+    typedef typename _Ht::pointer pointer;
+    typedef typename _Ht::const_pointer const_pointer;
+    typedef typename _Ht::reference reference;
+    typedef typename _Ht::const_reference const_reference;
+    
+    typedef typename _Ht::iterator iterator;
+    typedef typename _Ht::const_iterator const_iterator;
+    
+    typedef typename _Ht::allocator_type allocator_type;
+  
+    hasher hash_funct() const { return _M_ht.hash_funct(); }
+    
+    key_equal key_eq() const { return _M_ht.key_eq(); }
+    
+    allocator_type get_allocator() const { return _M_ht.get_allocator(); }
+    
+    hash_multimap() : _M_ht(100, hasher(), key_equal(), allocator_type()) { }
+    
+    explicit hash_multimap(size_type __n) : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
+    
+    hash_multimap(size_type __n, const hasher& __hf) : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
+    
+    hash_multimap(size_type __n, const hasher& __hf, const key_equal& __eql,
+                  const allocator_type& __a = allocator_type()) : _M_ht(__n, __hf, __eql, __a) {}
+    
+    template<class _InputIterator>
+    hash_multimap(_InputIterator __f, _InputIterator __l) : _M_ht(100, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+    
+    template<class _InputIterator>
+    hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n) : _M_ht(__n, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+    
+    template<class _InputIterator>
+    hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n, const hasher& __hf)
+      : _M_ht(__n, __hf, key_equal(), allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+    
+    template<class _InputIterator>
+    hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n,
+                  const hasher& __hf, const key_equal& __eql,
+                  const allocator_type& __a = allocator_type())
+      : _M_ht(__n, __hf, __eql, __a)
+    { _M_ht.insert_equal(__f, __l); }
+    
+    size_type size() const { return _M_ht.size(); }
+    
+    size_type max_size() const { return _M_ht.max_size(); }
+    
+    bool empty() const { return _M_ht.empty(); }
+    
+    void swap(hash_multimap& __hs) { _M_ht.swap(__hs._M_ht); }
+    
+    template<class _K1, class _T1, class _HF, class _EqK, class _Al>
+    friend bool operator==(const hash_multimap<_K1, _T1, _HF, _EqK, _Al>&,
+                           const hash_multimap<_K1, _T1, _HF, _EqK, _Al>&);
+    
+    iterator begin() { return _M_ht.begin(); }
+    
+    iterator end() { return _M_ht.end(); }
+    
+    const_iterator begin() const { return _M_ht.begin(); }
+    
+    const_iterator end() const { return _M_ht.end(); }
+    
+    iterator insert(const value_type& __obj) { return _M_ht.insert_equal(__obj); }
+    
+    template<class _InputIterator>
+    void insert(_InputIterator __f, _InputIterator __l) { _M_ht.insert_equal(__f,__l); }
+    
+    iterator insert_noresize(const value_type& __obj) { return _M_ht.insert_equal_noresize(__obj); }
+    
+    iterator find(const key_type& __key) { return _M_ht.find(__key); }
+    
+    const_iterator find(const key_type& __key) const { return _M_ht.find(__key); }
+    
+    size_type count(const key_type& __key) const { return _M_ht.count(__key); }
+    
+    std::pair<iterator, iterator> equal_range(const key_type& __key) { return _M_ht.equal_range(__key); }
+    
+    std::pair<const_iterator, const_iterator> equal_range(const key_type& __key) const { return _M_ht.equal_range(__key); }
+    
+    size_type erase(const key_type& __key) { return _M_ht.erase(__key); }
+    
+    void erase(iterator __it) { _M_ht.erase(__it); }
+    
+    void erase(iterator __f, iterator __l) { _M_ht.erase(__f, __l); }
+    
+    void clear() { _M_ht.clear(); }
+    
+    void resize(size_type __hint) { _M_ht.resize(__hint); }
+    
+    size_type bucket_count() const { return _M_ht.bucket_count(); }
+    
+    size_type max_bucket_count() const { return _M_ht.max_bucket_count(); }
+    
+    size_type elems_in_bucket(size_type __n) const { return _M_ht.elems_in_bucket(__n); }
+  };
+  
+  template<class _Key, class _Tp, class _HF, class _EqKey, class _Alloc>
+  inline bool operator==(const hash_multimap<_Key, _Tp, _HF, _EqKey, _Alloc>& __hm1,
+                         const hash_multimap<_Key, _Tp, _HF, _EqKey, _Alloc>& __hm2)
+  { return __hm1._M_ht == __hm2._M_ht; }
+  
+  template<class _Key, class _Tp, class _HF, class _EqKey, class _Alloc>
+  inline bool operator!=(const hash_multimap<_Key, _Tp, _HF, _EqKey, _Alloc>& __hm1,
+                         const hash_multimap<_Key, _Tp, _HF, _EqKey, _Alloc>& __hm2)
+  { return !(__hm1 == __hm2); }
+  
+  template<class _Key, class _Tp, class _HashFn, class _EqlKey, class _Alloc>
+  inline void swap(hash_multimap<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm1,
+                   hash_multimap<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm2)
+  { __hm1.swap(__hm2); }
+  
+}
+
+namespace std
+{
+  // Specialization of insert_iterator so that it will work for HashMap
+  // and hash_multimap.
+  template<class _Key, class _Tp, class _HashFn,  class _EqKey, class _Alloc>
+  class insert_iterator<INTERP_KERNEL::HashMap<_Key, _Tp, _HashFn, 
+                                               _EqKey, _Alloc> >
+  {
+  protected:
+    typedef INTERP_KERNEL::HashMap<_Key, _Tp, _HashFn, _EqKey, _Alloc>
+    _Container;
+    _Container* container;
+  public:
+    typedef _Container          container_type;
+    typedef output_iterator_tag iterator_category;
+    typedef void                value_type;
+    typedef void                difference_type;
+    typedef void                pointer;
+    typedef void                reference;
+      
+    insert_iterator(_Container& __x) : container(&__x) {}
+    
+    insert_iterator(_Container& __x, typename _Container::iterator) : container(&__x) {}
+    
+    insert_iterator<_Container>& operator=(const typename _Container::value_type& __value)
+    {
+      container->insert(__value);
+      return *this;
+    }
+    
+    insert_iterator<_Container>& operator*() { return *this; }
+    
+    insert_iterator<_Container>& operator++() { return *this; }
+
+    insert_iterator<_Container>& operator++(int) { return *this; }
+  };
+
+  template<class _Key, class _Tp, class _HashFn,  class _EqKey, class _Alloc>
+  class insert_iterator<INTERP_KERNEL::hash_multimap<_Key, _Tp, _HashFn,
+                                                     _EqKey, _Alloc> >
+  {
+  protected:
+    typedef INTERP_KERNEL::hash_multimap<_Key, _Tp, _HashFn, _EqKey, _Alloc>
+    _Container;
+    _Container* container;
+    typename _Container::iterator iter;
+    
+  public:
+    typedef _Container          container_type;
+    typedef output_iterator_tag iterator_category;
+    typedef void                value_type;
+    typedef void                difference_type;
+    typedef void                pointer;
+    typedef void                reference;
+    
+    insert_iterator(_Container& __x) : container(&__x) {}
+
+    insert_iterator(_Container& __x, typename _Container::iterator) : container(&__x) {}
+
+    insert_iterator<_Container>& operator=(const typename _Container::value_type& __value)
+    {
+      container->insert(__value);
+      return *this;
+    }
+
+    insert_iterator<_Container>& operator*() { return *this; }
+
+    insert_iterator<_Container>& operator++() { return *this; }
+
+    insert_iterator<_Container>& operator++(int) { return *this; }
+  };
+}
+
+#endif
diff --git a/src/INTERP_KERNEL/Bases/InterpKernelHashTable.hxx b/src/INTERP_KERNEL/Bases/InterpKernelHashTable.hxx
new file mode 100644 (file)
index 0000000..36819db
--- /dev/null
@@ -0,0 +1,1013 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+// Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ */
+#ifndef __INTERPKERNELHASHTABLE_HXX__
+#define __INTERPKERNELHASHTABLE_HXX__
+
+#include "InterpKernelStlExt.hxx"
+#include "InterpKernelHashFun.hxx"
+
+#include <vector>
+#include <iterator>
+#include <algorithm>
+#include <functional>
+
+namespace INTERP_KERNEL
+{
+  template<class _Val>
+  struct _Hashtable_node
+  {
+    _Hashtable_node* _M_next;
+    _Val _M_val;
+  };
+
+  template<class _Val, class _Key, class _HashFcn, class _ExtractKey, 
+           class _EqualKey, class _Alloc = std::allocator<_Val> >
+  class hashtable;
+
+  template<class _Val, class _Key, class _HashFcn,
+           class _ExtractKey, class _EqualKey, class _Alloc>
+  struct _Hashtable_iterator;
+
+  template<class _Val, class _Key, class _HashFcn,
+           class _ExtractKey, class _EqualKey, class _Alloc>
+  struct _Hashtable_const_iterator;
+
+  template<class _Val, class _Key, class _HashFcn,
+           class _ExtractKey, class _EqualKey, class _Alloc>
+  struct _Hashtable_iterator
+  {
+    typedef hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>
+    _Hashtable;
+    typedef _Hashtable_iterator<_Val, _Key, _HashFcn,
+                                _ExtractKey, _EqualKey, _Alloc>
+    iterator;
+    typedef _Hashtable_const_iterator<_Val, _Key, _HashFcn,
+                                      _ExtractKey, _EqualKey, _Alloc>
+    const_iterator;
+    typedef _Hashtable_node<_Val> _Node;
+    typedef std::forward_iterator_tag iterator_category;
+    typedef _Val value_type;
+    typedef std::ptrdiff_t difference_type;
+    typedef std::size_t size_type;
+    typedef _Val& reference;
+    typedef _Val* pointer;
+      
+    _Node* _M_cur;
+    _Hashtable* _M_ht;
+
+    _Hashtable_iterator(_Node* __n, _Hashtable* __tab)
+      : _M_cur(__n), _M_ht(__tab) { }
+
+    _Hashtable_iterator() { }
+
+    reference
+    operator*() const
+    { return _M_cur->_M_val; }
+
+    pointer
+    operator->() const
+    { return &(operator*()); }
+
+    iterator&
+    operator++();
+
+    iterator
+    operator++(int);
+
+    bool
+    operator==(const iterator& __it) const
+    { return _M_cur == __it._M_cur; }
+
+    bool
+    operator!=(const iterator& __it) const
+    { return _M_cur != __it._M_cur; }
+  };
+
+  template<class _Val, class _Key, class _HashFcn,
+           class _ExtractKey, class _EqualKey, class _Alloc>
+  struct _Hashtable_const_iterator
+  {
+    typedef hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>
+    _Hashtable;
+    typedef _Hashtable_iterator<_Val,_Key,_HashFcn,
+                                _ExtractKey,_EqualKey,_Alloc>
+    iterator;
+    typedef _Hashtable_const_iterator<_Val, _Key, _HashFcn,
+                                      _ExtractKey, _EqualKey, _Alloc>
+    const_iterator;
+    typedef _Hashtable_node<_Val> _Node;
+
+    typedef std::forward_iterator_tag iterator_category;
+    typedef _Val value_type;
+    typedef std::ptrdiff_t difference_type;
+    typedef std::size_t size_type;
+    typedef const _Val& reference;
+    typedef const _Val* pointer;
+      
+    const _Node* _M_cur;
+    const _Hashtable* _M_ht;
+
+    _Hashtable_const_iterator(const _Node* __n, const _Hashtable* __tab)
+      : _M_cur(__n), _M_ht(__tab) { }
+
+    _Hashtable_const_iterator() { }
+
+    _Hashtable_const_iterator(const iterator& __it)
+      : _M_cur(__it._M_cur), _M_ht(__it._M_ht) { }
+
+    reference  operator*() const { return _M_cur->_M_val; }
+
+    pointer operator->() const { return &(operator*()); }
+
+    const_iterator& operator++();
+
+    const_iterator operator++(int);
+
+    bool operator==(const const_iterator& __it) const { return _M_cur == __it._M_cur; }
+
+    bool operator!=(const const_iterator& __it) const { return _M_cur != __it._M_cur; }
+  };
+
+  // Note: assumes long is at least 32 bits.
+  enum { _S_num_primes = 28 };
+
+  static const unsigned long __stl_prime_list[_S_num_primes] =
+    {
+      53ul,         97ul,         193ul,       389ul,       769ul,
+      1543ul,       3079ul,       6151ul,      12289ul,     24593ul,
+      49157ul,      98317ul,      196613ul,    393241ul,    786433ul,
+      1572869ul,    3145739ul,    6291469ul,   12582917ul,  25165843ul,
+      50331653ul,   100663319ul,  201326611ul, 402653189ul, 805306457ul,
+      1610612741ul, 3221225473ul, 4294967291ul
+    };
+
+  inline unsigned long
+  __stl_next_prime(unsigned long __n)
+  {
+    const unsigned long* __first = __stl_prime_list;
+    const unsigned long* __last = __stl_prime_list + (int)_S_num_primes;
+    const unsigned long* pos = std::lower_bound(__first, __last, __n);
+    return pos == __last ? *(__last - 1) : *pos;
+  }
+
+  // Forward declaration of operator==.  
+  template<class _Val, class _Key, class _HF, class _Ex,
+           class _Eq, class _All>
+  class hashtable;
+
+  template<class _Val, class _Key, class _HF, class _Ex,
+           class _Eq, class _All>
+  bool operator==(const hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>& __ht1,
+                  const hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>& __ht2);
+
+  // Hashtables handle allocators a bit differently than other
+  // containers do.  If we're using standard-conforming allocators, then
+  // a hashtable unconditionally has a member variable to hold its
+  // allocator, even if it so happens that all instances of the
+  // allocator type are identical.  This is because, for hashtables,
+  // this extra storage is negligible.  Additionally, a base class
+  // wouldn't serve any other purposes; it wouldn't, for example,
+  // simplify the exception-handling code.  
+  template<class _Val, class _Key, class _HashFcn,
+           class _ExtractKey, class _EqualKey, class _Alloc>
+  class hashtable
+  {
+  public:
+    typedef _Key key_type;
+    typedef _Val value_type;
+    typedef _HashFcn hasher;
+    typedef _EqualKey key_equal;
+
+    typedef std::size_t            size_type;
+    typedef std::ptrdiff_t         difference_type;
+    typedef value_type*       pointer;
+    typedef const value_type* const_pointer;
+    typedef value_type&       reference;
+    typedef const value_type& const_reference;
+
+    hasher hash_funct() const { return _M_hash; }
+
+    key_equal key_eq() const { return _M_equals; }
+
+  private:
+    typedef _Hashtable_node<_Val> _Node;
+
+  public:
+    typedef typename _Alloc::template rebind<value_type>::other allocator_type;
+    allocator_type get_allocator() const { return _M_node_allocator; }
+
+  private:
+    typedef typename _Alloc::template rebind<_Node>::other _Node_Alloc;
+    typedef typename _Alloc::template rebind<_Node*>::other _Nodeptr_Alloc;
+    typedef std::vector<_Node*, _Nodeptr_Alloc> _Vector_type;
+
+    _Node_Alloc _M_node_allocator;
+
+    _Node *_M_get_node() { return _M_node_allocator.allocate(1); }
+
+    void _M_put_node(_Node* __p) { _M_node_allocator.deallocate(__p, 1); }
+
+  private:
+    hasher                _M_hash;
+    key_equal             _M_equals;
+    _ExtractKey           _M_get_key;
+    _Vector_type          _M_buckets;
+    size_type             _M_num_elements;
+      
+  public:
+    typedef _Hashtable_iterator<_Val, _Key, _HashFcn, _ExtractKey,
+                                _EqualKey, _Alloc>
+    iterator;
+    typedef _Hashtable_const_iterator<_Val, _Key, _HashFcn, _ExtractKey,
+                                      _EqualKey, _Alloc>
+    const_iterator;
+
+    friend struct
+    _Hashtable_iterator<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>;
+
+    friend struct
+    _Hashtable_const_iterator<_Val, _Key, _HashFcn, _ExtractKey,
+                              _EqualKey, _Alloc>;
+
+  public:
+    hashtable(size_type __n, const _HashFcn& __hf,
+              const _EqualKey& __eql, const _ExtractKey& __ext,
+              const allocator_type& __a = allocator_type())
+      : _M_node_allocator(__a), _M_hash(__hf), _M_equals(__eql),
+        _M_get_key(__ext), _M_buckets(__a), _M_num_elements(0)
+    { _M_initialize_buckets(__n); }
+
+    hashtable(size_type __n, const _HashFcn& __hf,
+              const _EqualKey& __eql,
+              const allocator_type& __a = allocator_type())
+      : _M_node_allocator(__a), _M_hash(__hf), _M_equals(__eql),
+        _M_get_key(_ExtractKey()), _M_buckets(__a), _M_num_elements(0)
+    { _M_initialize_buckets(__n); }
+
+    hashtable(const hashtable& __ht)
+      : _M_node_allocator(__ht.get_allocator()), _M_hash(__ht._M_hash),
+        _M_equals(__ht._M_equals), _M_get_key(__ht._M_get_key),
+        _M_buckets(__ht.get_allocator()), _M_num_elements(0)
+    { _M_copy_from(__ht); }
+
+    hashtable& operator= (const hashtable& __ht)
+    {
+      if (&__ht != this)
+        {
+          clear();
+          _M_hash = __ht._M_hash;
+          _M_equals = __ht._M_equals;
+          _M_get_key = __ht._M_get_key;
+          _M_copy_from(__ht);
+        }
+      return *this;
+    }
+
+    ~hashtable()
+    { clear(); }
+
+    size_type size() const { return _M_num_elements; }
+
+    size_type max_size() const { return size_type(-1); }
+
+    bool empty() const { return size() == 0; }
+
+    void swap(hashtable& __ht) 
+    {
+      std::swap(_M_hash, __ht._M_hash);
+      std::swap(_M_equals, __ht._M_equals);
+      std::swap(_M_get_key, __ht._M_get_key);
+      _M_buckets.swap(__ht._M_buckets);
+      std::swap(_M_num_elements, __ht._M_num_elements);
+    }
+
+    iterator begin()
+    {
+      for (size_type __n = 0; __n < _M_buckets.size(); ++__n)
+        if (_M_buckets[__n])
+          return iterator(_M_buckets[__n], this);
+      return end();
+    }
+
+    iterator end() { return iterator(0, this); }
+
+    const_iterator begin() const 
+    {
+      for (size_type __n = 0; __n < _M_buckets.size(); ++__n)
+        if (_M_buckets[__n])
+          return const_iterator(_M_buckets[__n], this);
+      return end();
+    }
+
+    const_iterator end() const { return const_iterator(0, this); }
+
+    template<class _Vl, class _Ky, class _HF, class _Ex, class _Eq, class _Al>
+    friend bool operator==(const hashtable<_Vl, _Ky, _HF, _Ex, _Eq, _Al>&,
+                           const hashtable<_Vl, _Ky, _HF, _Ex, _Eq, _Al>&);
+    
+  public:
+    size_type bucket_count() const { return _M_buckets.size(); }
+
+    size_type max_bucket_count() const { return __stl_prime_list[(int)_S_num_primes - 1]; }
+
+    size_type elems_in_bucket(size_type __bucket) const 
+    {
+      size_type __result = 0;
+      for (_Node* __n = _M_buckets[__bucket]; __n; __n = __n->_M_next)
+        __result += 1;
+      return __result;
+    }
+
+    std::pair<iterator, bool> insert_unique(const value_type& __obj)
+    {
+      resize(_M_num_elements + 1);
+      return insert_unique_noresize(__obj);
+    }
+
+    iterator insert_equal(const value_type& __obj)
+    {
+      resize(_M_num_elements + 1);
+      return insert_equal_noresize(__obj);
+    }
+
+    std::pair<iterator, bool> insert_unique_noresize(const value_type& __obj);
+
+    iterator insert_equal_noresize(const value_type& __obj);
+
+    template<class _InputIterator>
+    void insert_unique(_InputIterator __f, _InputIterator __l)
+    { insert_unique(__f, __l, __iterator_category(__f)); }
+
+    template<class _InputIterator>
+    void insert_equal(_InputIterator __f, _InputIterator __l)
+    { insert_equal(__f, __l, __iterator_category(__f)); }
+
+    template<class _InputIterator>
+    void insert_unique(_InputIterator __f, _InputIterator __l,
+                       std::input_iterator_tag)
+    {
+      for ( ; __f != __l; ++__f)
+        insert_unique(*__f);
+    }
+
+    template<class _InputIterator>
+    void insert_equal(_InputIterator __f, _InputIterator __l,
+                      std::input_iterator_tag)
+    {
+      for ( ; __f != __l; ++__f)
+        insert_equal(*__f);
+    }
+    
+    template<class _ForwardIterator>
+    void insert_unique(_ForwardIterator __f, _ForwardIterator __l,
+                       std::forward_iterator_tag)
+    {
+      size_type __n = std::distance(__f, __l);
+      resize(_M_num_elements + __n);
+      for ( ; __n > 0; --__n, ++__f)
+        insert_unique_noresize(*__f);
+    }
+
+    template<class _ForwardIterator>
+    void
+    insert_equal(_ForwardIterator __f, _ForwardIterator __l,
+                 std::forward_iterator_tag)
+    {
+      size_type __n = std::distance(__f, __l);
+      resize(_M_num_elements + __n);
+      for ( ; __n > 0; --__n, ++__f)
+        insert_equal_noresize(*__f);
+    }
+
+    reference find_or_insert(const value_type& __obj);
+
+    iterator find(const key_type& __key)
+    {
+      size_type __n = _M_bkt_num_key(__key);
+      _Node* __first;
+      for (__first = _M_buckets[__n];
+           __first && !_M_equals(_M_get_key(__first->_M_val), __key);
+           __first = __first->_M_next)
+        { }
+      return iterator(__first, this);
+    }
+
+    const_iterator find(const key_type& __key) const
+    {
+      size_type __n = _M_bkt_num_key(__key);
+      const _Node* __first;
+      for (__first = _M_buckets[__n];
+           __first && !_M_equals(_M_get_key(__first->_M_val), __key);
+           __first = __first->_M_next)
+        { }
+      return const_iterator(__first, this);
+    }
+
+    size_type count(const key_type& __key) const
+    {
+      const size_type __n = _M_bkt_num_key(__key);
+      size_type __result = 0;
+      for (const _Node* __cur = _M_buckets[__n]; __cur;
+           __cur = __cur->_M_next)
+        if (_M_equals(_M_get_key(__cur->_M_val), __key))
+          ++__result;
+      return __result;
+    }
+
+    std::pair<iterator, iterator> equal_range(const key_type& __key);
+
+    std::pair<const_iterator, const_iterator> equal_range(const key_type& __key) const;
+
+    size_type erase(const key_type& __key);
+      
+    void erase(const iterator& __it);
+
+    void erase(iterator __first, iterator __last);
+
+    void erase(const const_iterator& __it);
+
+    void erase(const_iterator __first, const_iterator __last);
+
+    void resize(size_type __num_elements_hint);
+
+    void clear();
+
+  private:
+    size_type _M_next_size(size_type __n) const { return __stl_next_prime(__n); }
+
+    void _M_initialize_buckets(size_type __n)
+    {
+      const size_type __n_buckets = _M_next_size(__n);
+      _M_buckets.reserve(__n_buckets);
+      _M_buckets.insert(_M_buckets.end(), __n_buckets, (_Node*) 0);
+      _M_num_elements = 0;
+    }
+
+    size_type _M_bkt_num_key(const key_type& __key) const
+    { return _M_bkt_num_key(__key, _M_buckets.size()); }
+    
+    size_type _M_bkt_num(const value_type& __obj) const
+    { return _M_bkt_num_key(_M_get_key(__obj)); }
+    
+    size_type _M_bkt_num_key(const key_type& __key, std::size_t __n) const
+    { return _M_hash(__key) % __n; }
+    
+    size_type _M_bkt_num(const value_type& __obj, std::size_t __n) const
+    { return _M_bkt_num_key(_M_get_key(__obj), __n); }
+
+    _Node* _M_new_node(const value_type& __obj)
+    {
+      _Node* __n = _M_get_node();
+      __n->_M_next = 0;
+      __try
+        {
+          this->get_allocator().construct(&__n->_M_val, __obj);
+          return __n;
+        }
+      __catch(...)
+        {
+          _M_put_node(__n);
+          __throw_exception_again;
+        }
+    }
+
+    void _M_delete_node(_Node* __n)
+    {
+      this->get_allocator().destroy(&__n->_M_val);
+      _M_put_node(__n);
+    }
+      
+    void _M_erase_bucket(const size_type __n, _Node* __first, _Node* __last);
+
+    void _M_erase_bucket(const size_type __n, _Node* __last);
+
+    void _M_copy_from(const hashtable& __ht);
+  };
+
+  template<class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+  _Hashtable_iterator<_Val, _Key, _HF, _ExK, _EqK, _All>&
+  _Hashtable_iterator<_Val, _Key, _HF, _ExK, _EqK, _All>::
+  operator++()
+  {
+    const _Node* __old = _M_cur;
+    _M_cur = _M_cur->_M_next;
+    if (!_M_cur)
+      {
+        size_type __bucket = _M_ht->_M_bkt_num(__old->_M_val);
+        while (!_M_cur && ++__bucket < _M_ht->_M_buckets.size())
+          _M_cur = _M_ht->_M_buckets[__bucket];
+      }
+    return *this;
+  }
+
+  template<class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+  inline _Hashtable_iterator<_Val, _Key, _HF, _ExK, _EqK, _All>
+  _Hashtable_iterator<_Val, _Key, _HF, _ExK, _EqK, _All>::
+  operator++(int)
+  {
+    iterator __tmp = *this;
+    ++*this;
+    return __tmp;
+  }
+
+  template<class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+  _Hashtable_const_iterator<_Val, _Key, _HF, _ExK, _EqK, _All>&
+  _Hashtable_const_iterator<_Val, _Key, _HF, _ExK, _EqK, _All>::
+  operator++()
+  {
+    const _Node* __old = _M_cur;
+    _M_cur = _M_cur->_M_next;
+    if (!_M_cur)
+      {
+        size_type __bucket = _M_ht->_M_bkt_num(__old->_M_val);
+        while (!_M_cur && ++__bucket < _M_ht->_M_buckets.size())
+          _M_cur = _M_ht->_M_buckets[__bucket];
+      }
+    return *this;
+  }
+
+  template<class _Val, class _Key, class _HF, class _ExK, class _EqK,
+           class _All>
+  inline _Hashtable_const_iterator<_Val, _Key, _HF, _ExK, _EqK, _All>
+  _Hashtable_const_iterator<_Val, _Key, _HF, _ExK, _EqK, _All>::
+  operator++(int)
+  {
+    const_iterator __tmp = *this;
+    ++*this;
+    return __tmp;
+  }
+
+  template<class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>
+  bool operator==(const hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>& __ht1,
+                  const hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>& __ht2)
+  {
+    typedef typename hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::_Node _Node;
+    
+    if (__ht1._M_buckets.size() != __ht2._M_buckets.size())
+      return false;
+    
+    for (std::size_t __n = 0; __n < __ht1._M_buckets.size(); ++__n)
+      {
+        _Node* __cur1 = __ht1._M_buckets[__n];
+        _Node* __cur2 = __ht2._M_buckets[__n];
+        // Check same length of lists
+        for (; __cur1 && __cur2;
+             __cur1 = __cur1->_M_next, __cur2 = __cur2->_M_next)
+          { } 
+        if (__cur1 || __cur2)
+          return false;
+        // Now check one's elements are in the other
+        for (__cur1 = __ht1._M_buckets[__n] ; __cur1;
+             __cur1 = __cur1->_M_next)
+          {
+            bool _found__cur1 = false;
+            for (__cur2 = __ht2._M_buckets[__n];
+                 __cur2; __cur2 = __cur2->_M_next)
+              {
+                if (__cur1->_M_val == __cur2->_M_val)
+                  {
+                    _found__cur1 = true;
+                    break;
+                  }
+              }
+            if (!_found__cur1)
+              return false;
+          }
+      }
+    return true;
+  }
+
+  template<class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>
+  inline bool operator!=(const hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>& __ht1,
+                         const hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>& __ht2)
+  { return !(__ht1 == __ht2); }
+
+  template<class _Val, class _Key, class _HF, class _Extract, class _EqKey, class _All>
+  inline void swap(hashtable<_Val, _Key, _HF, _Extract, _EqKey, _All>& __ht1,
+                   hashtable<_Val, _Key, _HF, _Extract, _EqKey, _All>& __ht2)
+  { __ht1.swap(__ht2); }
+
+  template<class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>
+  std::pair<typename hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::iterator, bool>
+  hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::
+  insert_unique_noresize(const value_type& __obj)
+  {
+    const size_type __n = _M_bkt_num(__obj);
+    _Node* __first = _M_buckets[__n];
+      
+    for (_Node* __cur = __first; __cur; __cur = __cur->_M_next)
+      if (_M_equals(_M_get_key(__cur->_M_val), _M_get_key(__obj)))
+        return std::pair<iterator, bool>(iterator(__cur, this), false);
+      
+    _Node* __tmp = _M_new_node(__obj);
+    __tmp->_M_next = __first;
+    _M_buckets[__n] = __tmp;
+    ++_M_num_elements;
+    return std::pair<iterator, bool>(iterator(__tmp, this), true);
+  }
+
+  template<class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>
+  typename hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::iterator
+  hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::
+  insert_equal_noresize(const value_type& __obj)
+  {
+    const size_type __n = _M_bkt_num(__obj);
+    _Node* __first = _M_buckets[__n];
+      
+    for (_Node* __cur = __first; __cur; __cur = __cur->_M_next)
+      if (_M_equals(_M_get_key(__cur->_M_val), _M_get_key(__obj)))
+        {
+          _Node* __tmp = _M_new_node(__obj);
+          __tmp->_M_next = __cur->_M_next;
+          __cur->_M_next = __tmp;
+          ++_M_num_elements;
+          return iterator(__tmp, this);
+        }
+
+    _Node* __tmp = _M_new_node(__obj);
+    __tmp->_M_next = __first;
+    _M_buckets[__n] = __tmp;
+    ++_M_num_elements;
+    return iterator(__tmp, this);
+  }
+
+  template<class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>
+  typename hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::reference
+  hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::
+  find_or_insert(const value_type& __obj)
+  {
+    resize(_M_num_elements + 1);
+
+    size_type __n = _M_bkt_num(__obj);
+    _Node* __first = _M_buckets[__n];
+      
+    for (_Node* __cur = __first; __cur; __cur = __cur->_M_next)
+      if (_M_equals(_M_get_key(__cur->_M_val), _M_get_key(__obj)))
+        return __cur->_M_val;
+      
+    _Node* __tmp = _M_new_node(__obj);
+    __tmp->_M_next = __first;
+    _M_buckets[__n] = __tmp;
+    ++_M_num_elements;
+    return __tmp->_M_val;
+  }
+
+  template<class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>
+  std::pair<typename hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::iterator,
+            typename hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::iterator>
+  hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::equal_range(const key_type& __key)
+  {
+    typedef std::pair<iterator, iterator> _Pii;
+    const size_type __n = _M_bkt_num_key(__key);
+    
+    for (_Node* __first = _M_buckets[__n]; __first;
+         __first = __first->_M_next)
+      if (_M_equals(_M_get_key(__first->_M_val), __key))
+        {
+          for (_Node* __cur = __first->_M_next; __cur;
+               __cur = __cur->_M_next)
+            if (!_M_equals(_M_get_key(__cur->_M_val), __key))
+              return _Pii(iterator(__first, this), iterator(__cur, this));
+          for (size_type __m = __n + 1; __m < _M_buckets.size(); ++__m)
+            if (_M_buckets[__m])
+              return _Pii(iterator(__first, this),
+                          iterator(_M_buckets[__m], this));
+          return _Pii(iterator(__first, this), end());
+        }
+    return _Pii(end(), end());
+  }
+  
+  template<class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>
+  std::pair<typename hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::const_iterator,
+            typename hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::const_iterator>
+  hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::equal_range(const key_type& __key) const
+  {
+    typedef std::pair<const_iterator, const_iterator> _Pii;
+    const size_type __n = _M_bkt_num_key(__key);
+    
+    for (const _Node* __first = _M_buckets[__n]; __first;
+         __first = __first->_M_next)
+      {
+        if (_M_equals(_M_get_key(__first->_M_val), __key))
+          {
+            for (const _Node* __cur = __first->_M_next; __cur;
+                 __cur = __cur->_M_next)
+              if (!_M_equals(_M_get_key(__cur->_M_val), __key))
+                return _Pii(const_iterator(__first, this),
+                          const_iterator(__cur, this));
+            for (size_type __m = __n + 1; __m < _M_buckets.size(); ++__m)
+              if (_M_buckets[__m])
+                return _Pii(const_iterator(__first, this),
+                            const_iterator(_M_buckets[__m], this));
+            return _Pii(const_iterator(__first, this), end());
+          }
+      }
+    return _Pii(end(), end());
+  }
+  
+  template<class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>
+  typename hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::size_type
+  hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::erase(const key_type& __key)
+  {
+    const size_type __n = _M_bkt_num_key(__key);
+    _Node* __first = _M_buckets[__n];
+    size_type __erased = 0;
+    
+    if (__first)
+      {
+        _Node* __cur = __first;
+        _Node* __next = __cur->_M_next;
+        while (__next)
+          {
+            if (_M_equals(_M_get_key(__next->_M_val), __key))
+              {
+                __cur->_M_next = __next->_M_next;
+                _M_delete_node(__next);
+                __next = __cur->_M_next;
+                ++__erased;
+                --_M_num_elements;
+              }
+            else
+              {
+                __cur = __next;
+                __next = __cur->_M_next;
+              }
+          }
+        if (_M_equals(_M_get_key(__first->_M_val), __key))
+          {
+            _M_buckets[__n] = __first->_M_next;
+            _M_delete_node(__first);
+            ++__erased;
+            --_M_num_elements;
+          }
+      }
+    return __erased;
+  }
+  
+  template<class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>
+  void hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::erase(const iterator& __it)
+  {
+    _Node* __p = __it._M_cur;
+    if (__p)
+      {
+        const size_type __n = _M_bkt_num(__p->_M_val);
+        _Node* __cur = _M_buckets[__n]; 
+        if (__cur == __p)
+          {
+            _M_buckets[__n] = __cur->_M_next;
+            _M_delete_node(__cur);
+            --_M_num_elements;
+          }
+        else
+          {
+            _Node* __next = __cur->_M_next;
+            while (__next)
+              {
+                if (__next == __p)
+                  {
+                    __cur->_M_next = __next->_M_next;
+                    _M_delete_node(__next);
+                    --_M_num_elements;
+                    break;
+                  }
+                else
+                  {
+                    __cur = __next;
+                    __next = __cur->_M_next;
+                  }
+              }
+          }
+      }
+  }
+
+  template<class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>
+  void hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::erase(iterator __first, iterator __last)
+  {
+    size_type __f_bucket = __first._M_cur ? _M_bkt_num(__first._M_cur->_M_val) : _M_buckets.size();
+    
+    size_type __l_bucket = __last._M_cur ? _M_bkt_num(__last._M_cur->_M_val) : _M_buckets.size();
+    
+    if (__first._M_cur == __last._M_cur)
+      return;
+    else if (__f_bucket == __l_bucket)
+      _M_erase_bucket(__f_bucket, __first._M_cur, __last._M_cur);
+    else
+      {
+        _M_erase_bucket(__f_bucket, __first._M_cur, 0);
+        for (size_type __n = __f_bucket + 1; __n < __l_bucket; ++__n)
+          _M_erase_bucket(__n, 0);
+        if (__l_bucket != _M_buckets.size())
+          _M_erase_bucket(__l_bucket, __last._M_cur);
+      }
+  }
+  
+  template<class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>
+  inline void
+  hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::
+  erase(const_iterator __first, const_iterator __last)
+  {
+    erase(iterator(const_cast<_Node*>(__first._M_cur),
+                   const_cast<hashtable*>(__first._M_ht)),
+          iterator(const_cast<_Node*>(__last._M_cur),
+                   const_cast<hashtable*>(__last._M_ht)));
+  }
+  
+  template<class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>
+  inline void hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::erase(const const_iterator& __it)
+  { erase(iterator(const_cast<_Node*>(__it._M_cur), const_cast<hashtable*>(__it._M_ht))); }
+  
+  template<class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>
+  void hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::resize(size_type __num_elements_hint)
+  {
+    const size_type __old_n = _M_buckets.size();
+    if (__num_elements_hint > __old_n)
+      {
+        const size_type __n = _M_next_size(__num_elements_hint);
+        if (__n > __old_n)
+          {
+            _Vector_type __tmp(__n, (_Node*)(0), _M_buckets.get_allocator());
+            __try
+              {
+                for (size_type __bucket = 0; __bucket < __old_n; ++__bucket)
+                  {
+                    _Node* __first = _M_buckets[__bucket];
+                    while (__first)
+                      {
+                        size_type __new_bucket = _M_bkt_num(__first->_M_val,__n);
+                        _M_buckets[__bucket] = __first->_M_next;
+                        __first->_M_next = __tmp[__new_bucket];
+                        __tmp[__new_bucket] = __first;
+                        __first = _M_buckets[__bucket];
+                      }
+                  }
+                _M_buckets.swap(__tmp);
+              }
+            __catch(...)
+              {
+                for (size_type __bucket = 0; __bucket < __tmp.size();++__bucket)
+                  {
+                    while (__tmp[__bucket])
+                      {
+                        _Node* __next = __tmp[__bucket]->_M_next;
+                        _M_delete_node(__tmp[__bucket]);
+                        __tmp[__bucket] = __next;
+                      }
+                  }
+                __throw_exception_again;
+              }
+          }
+      }
+  }
+
+  template<class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>
+  void hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::_M_erase_bucket(const size_type __n, _Node* __first, _Node* __last)
+  {
+    _Node* __cur = _M_buckets[__n];
+    if (__cur == __first)
+      _M_erase_bucket(__n, __last);
+    else
+      {
+        _Node* __next;
+        for (__next = __cur->_M_next;
+             __next != __first;
+             __cur = __next, __next = __cur->_M_next)
+          ;
+        while (__next != __last)
+          {
+            __cur->_M_next = __next->_M_next;
+            _M_delete_node(__next);
+            __next = __cur->_M_next;
+            --_M_num_elements;
+          }
+      }
+  }
+  
+  template<class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>
+  void hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::_M_erase_bucket(const size_type __n, _Node* __last)
+  {
+    _Node* __cur = _M_buckets[__n];
+    while (__cur != __last)
+      {
+        _Node* __next = __cur->_M_next;
+        _M_delete_node(__cur);
+        __cur = __next;
+        _M_buckets[__n] = __cur;
+        --_M_num_elements;
+      }
+  }
+
+  template<class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>
+  void hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::clear()
+  {
+    for (size_type __i = 0; __i < _M_buckets.size(); ++__i)
+      {
+        _Node* __cur = _M_buckets[__i];
+        while (__cur != 0)
+          {
+            _Node* __next = __cur->_M_next;
+            _M_delete_node(__cur);
+            __cur = __next;
+          }
+        _M_buckets[__i] = 0;
+      }
+    _M_num_elements = 0;
+  }
+
+  template<class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>
+  void hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::_M_copy_from(const hashtable& __ht)
+  {
+    _M_buckets.clear();
+    _M_buckets.reserve(__ht._M_buckets.size());
+    _M_buckets.insert(_M_buckets.end(), __ht._M_buckets.size(), (_Node*) 0);
+    __try
+      {
+        for (size_type __i = 0; __i < __ht._M_buckets.size(); ++__i) {
+          const _Node* __cur = __ht._M_buckets[__i];
+          if (__cur)
+            {
+              _Node* __local_copy = _M_new_node(__cur->_M_val);
+              _M_buckets[__i] = __local_copy;
+              for (_Node* __next = __cur->_M_next;
+                   __next;
+                   __cur = __next, __next = __cur->_M_next)
+                {
+                  __local_copy->_M_next = _M_new_node(__next->_M_val);
+                  __local_copy = __local_copy->_M_next;
+                }
+            }
+        }
+        _M_num_elements = __ht._M_num_elements;
+      }
+    __catch(...)
+      {
+        clear();
+        __throw_exception_again;
+      }
+  }
+}
+
+#endif
diff --git a/src/INTERP_KERNEL/Bases/InterpKernelStlExt.hxx b/src/INTERP_KERNEL/Bases/InterpKernelStlExt.hxx
new file mode 100644 (file)
index 0000000..1dfa16b
--- /dev/null
@@ -0,0 +1,42 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+#ifndef __INTERPKERNELSTLEXT_HXX__
+#define __INTERPKERNELSTLEXT_HXX__
+
+#include <functional>
+
+namespace INTERP_KERNEL
+{
+  namespace STLEXT
+  {
+    template<typename _Pair>
+    struct Select1st : public std::unary_function<_Pair, typename _Pair::first_type>
+    {
+      typename _Pair::first_type& operator()(_Pair& __x) const { return __x.first; }
+      const typename _Pair::first_type&operator()(const _Pair& __x) const { return __x.first; }
+    };
+
+    template<typename _T1, typename _T2>
+    inline void Construct(_T1* __p, const _T2& __value) { ::new(static_cast<void*>(__p)) _T1(__value); }
+
+    template<typename _Tp> inline void Destroy(_Tp* __pointer) { __pointer->~_Tp(); }
+  }
+}
+
+#endif
index 9c7c593e6a874cb409c94b3a29a18697e060e70a..3ff9afa8eb3f2e21cfcca2b8972ef907fcab69cb 100755 (executable)
@@ -27,7 +27,11 @@ lib_LTLIBRARIES = libinterpkernelbases.la
 salomeinclude_HEADERS =         \
 INTERPKERNELBASESDefines.hxx    \
 InterpKernelException.hxx       \
-NormalizedUnstructuredMesh.hxx
+NormalizedUnstructuredMesh.hxx  \
+InterpKernelStlExt.hxx          \
+InterpKernelHashMap.hxx         \
+InterpKernelHashTable.hxx       \
+InterpKernelHashFun.hxx
 
 # Libraries targets
 
index 48a0d82041b945988fca32d51a4a00ebe86388ed..159530459fd66e5c0fd83677bc26c79ff1826d66 100644 (file)
 #include "TransformedTriangle.hxx"
 #include "TetraAffineTransform.hxx"
 #include "InterpolationOptions.hxx"
+#include "InterpKernelHashMap.hxx"
 
 #include <assert.h>
 #include <vector>
 #include <functional>
 #include <map>
-#ifdef WIN32
-# include <hash_map>
-#else
-# include <ext/hash_map>
-#endif
-
-#ifndef WIN32
-using __gnu_cxx::hash_map;
-#else
-using stdext::hash_map;
-using stdext::hash_compare;
-#endif
 
 namespace INTERP_KERNEL
 {
@@ -87,13 +76,6 @@ namespace INTERP_KERNEL
     {
       return _hashVal;
     }
-
-#ifdef WIN32
-    operator size_t () const
-    {
-      return _hashVal;
-    }
-#endif
      
     inline void sort3Ints(int* sorted, int node1, int node2, int node3);
 
@@ -150,20 +132,13 @@ namespace INTERP_KERNEL
           }
       }
   }
-}
-#ifndef WIN32
-namespace __gnu_cxx
-{
-
 
   /**
-   * \brief Template specialization of __gnu_cxx::hash<T> function object for use with a __gnu_cxx::hash_map 
+   * \brief Template specialization of INTERP_KERNEL::hash<T> function object for use with a 
    * with TriangleFaceKey as key class.
    * 
    */
-  template<>
-  class hash<INTERP_KERNEL::TriangleFaceKey>
-
+  template<> class hash<INTERP_KERNEL::TriangleFaceKey>
   {
   public:
     /**
@@ -178,16 +153,6 @@ namespace __gnu_cxx
     }
   };
 }
-#else
-  struct TriangleFaceKeyComparator
-  {
-    bool operator()(const INTERP_KERNEL::TriangleFaceKey& key1,
-                    const INTERP_KERNEL::TriangleFaceKey& key2 ) const
-    {
-      return key1.hashVal() < key2.hashVal();
-    }
-  };
-#endif
 
 namespace INTERP_KERNEL
 {
@@ -236,14 +201,14 @@ namespace INTERP_KERNEL
     /// affine transform associated with this target element
     TetraAffineTransform* _t;
     
-    /// hash_map relating node numbers to transformed nodes, used for caching
-    hash_map< int , double* > _nodes;
+    /// HashMap relating node numbers to transformed nodes, used for caching
+    HashMap< int , double* > _nodes;
     
-    /// hash_map relating triangular faces to calculated volume contributions, used for caching
-    hash_map< TriangleFaceKey, double
-#ifdef WIN32
-        , hash_compare<TriangleFaceKey,TriangleFaceKeyComparator> 
-#endif
+    /// HashMap relating triangular faces to calculated volume contributions, used for caching
+    HashMap< TriangleFaceKey, double
+// #ifdef WIN32
+//         , hash_compare<TriangleFaceKey,TriangleFaceKeyComparator> 
+// #endif
     > _volumes;
 
     /// reference to the source mesh
index 82bce23341f71324df157d2a88f6019e11061b5c..1862a242ae05c95abd68e54617061eaf4cbc8615 100644 (file)
@@ -123,7 +123,7 @@ namespace INTERP_KERNEL
   SplitterTetra<MyMeshType>::~SplitterTetra()
   {
     delete _t;
-    for(hash_map< int, double* >::iterator iter = _nodes.begin(); iter != _nodes.end() ; ++iter)
+    for(HashMap< int, double* >::iterator iter = _nodes.begin(); iter != _nodes.end() ; ++iter)
       delete[] iter->second;
   }
 
@@ -207,7 +207,7 @@ namespace INTERP_KERNEL
         cellNodes[i]=globalNodeNum;
         if(_nodes.find(globalNodeNum) == _nodes.end()) 
           {
-            //for(hash_map< int , double* >::iterator iter3=_nodes.begin();iter3!=_nodes.end();iter3++)
+            //for(HashMap< int , double* >::iterator iter3=_nodes.begin();iter3!=_nodes.end();iter3++)
             //  std::cout << (*iter3).first << " ";
             //std::cout << std::endl << "*** " << globalNodeNum << std::endl;
             calculateNode(globalNodeNum);