Separating tl::hfunc from std namespace. Needed to support int128 in tl::Variant for 64bit coordinate builds.

This commit is contained in:
Matthias Koefferlein 2025-03-22 20:35:15 +01:00
parent 561a760881
commit 2668b42d29
17 changed files with 338 additions and 311 deletions

View File

@ -53,7 +53,7 @@ struct ResultCountingInserter
{ {
typedef db::Polygon value_type; typedef db::Polygon value_type;
ResultCountingInserter (std::unordered_map<const db::Polygon *, size_t, std::ptr_hash_from_value<db::Polygon> > &result) ResultCountingInserter (std::unordered_map<const db::Polygon *, size_t, tl::ptr_hash_from_value<db::Polygon> > &result)
: mp_result (&result) : mp_result (&result)
{ {
// .. nothing yet .. // .. nothing yet ..
@ -70,7 +70,7 @@ struct ResultCountingInserter
} }
private: private:
std::unordered_map<const db::Polygon *, size_t, std::ptr_hash_from_value<db::Polygon> > *mp_result; std::unordered_map<const db::Polygon *, size_t, tl::ptr_hash_from_value<db::Polygon> > *mp_result;
}; };
} }

View File

@ -55,7 +55,7 @@ namespace db
* for use with std::unordered_map and std::unordered_set * for use with std::unordered_map and std::unordered_set
*/ */
namespace std namespace tl
{ {
inline size_t hfunc_coord (db::DCoord d) inline size_t hfunc_coord (db::DCoord d)
{ {
@ -89,15 +89,6 @@ namespace std
return hfunc_coord (o.x (), hfunc_coord (o.y ())); return hfunc_coord (o.x (), hfunc_coord (o.y ()));
} }
template <class C>
struct hash <db::point<C> >
{
size_t operator() (const db::point<C> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief Hash value for a vector * @brief Hash value for a vector
*/ */
@ -114,15 +105,6 @@ namespace std
return hfunc_coord (o.x (), hfunc_coord (o.y ())); return hfunc_coord (o.x (), hfunc_coord (o.y ()));
} }
template <class C>
struct hash <db::vector<C> >
{
size_t operator() (const db::vector<C> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief Hash value for a box * @brief Hash value for a box
*/ */
@ -139,15 +121,6 @@ namespace std
return hfunc (o.p1 (), hfunc (o.p2 ())); return hfunc (o.p1 (), hfunc (o.p2 ()));
} }
template <class C>
struct hash <db::box<C> >
{
size_t operator() (const db::box<C> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief Hash value for an edge * @brief Hash value for an edge
*/ */
@ -164,15 +137,6 @@ namespace std
return hfunc (o.p1 (), hfunc (o.p2 ())); return hfunc (o.p1 (), hfunc (o.p2 ()));
} }
template <class C>
struct hash <db::edge<C> >
{
size_t operator() (const db::edge<C> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief Hash value for an edge pair * @brief Hash value for an edge pair
*/ */
@ -189,15 +153,6 @@ namespace std
return hfunc (o.lesser (), hfunc (o.greater (), hfunc (int (o.is_symmetric ())))); return hfunc (o.lesser (), hfunc (o.greater (), hfunc (int (o.is_symmetric ()))));
} }
template <class C>
struct hash <db::edge_pair<C> >
{
size_t operator() (const db::edge_pair<C> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief Hash value for a text object * @brief Hash value for a text object
*/ */
@ -220,15 +175,6 @@ namespace std
return hfunc (o, size_t (0)); return hfunc (o, size_t (0));
} }
template <class C>
struct hash <db::text<C> >
{
size_t operator() (const db::text<C> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief Hash value for a path * @brief Hash value for a path
*/ */
@ -259,15 +205,6 @@ namespace std
return hfunc (o, size_t (0)); return hfunc (o, size_t (0));
} }
template <class C>
struct hash <db::path<C> >
{
size_t operator() (const db::path<C> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief Hash value for a polygon contour * @brief Hash value for a polygon contour
*/ */
@ -294,15 +231,6 @@ namespace std
return hfunc (o, size_t (0)); return hfunc (o, size_t (0));
} }
template <class C>
struct hash <db::polygon_contour<C> >
{
size_t operator() (const db::path<C> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief Hash value for a polygon * @brief Hash value for a polygon
*/ */
@ -330,15 +258,6 @@ namespace std
return hfunc (o, size_t (0)); return hfunc (o, size_t (0));
} }
template <class C>
struct hash <db::polygon<C> >
{
size_t operator() (const db::polygon<C> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief Hash value for a simple polygon * @brief Hash value for a simple polygon
*/ */
@ -355,15 +274,6 @@ namespace std
return hfunc (o, size_t (0)); return hfunc (o, size_t (0));
} }
template <class C>
struct hash <db::simple_polygon<C> >
{
size_t operator() (const db::simple_polygon<C> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief Hash value for a simple transformation * @brief Hash value for a simple transformation
*/ */
@ -380,15 +290,6 @@ namespace std
return hfunc (o, size_t (0)); return hfunc (o, size_t (0));
} }
template <class C>
struct hash <db::simple_trans<C> >
{
size_t operator() (const db::simple_trans<C> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief A hash function for a displacement transformation * @brief A hash function for a displacement transformation
*/ */
@ -405,15 +306,6 @@ namespace std
return hfunc (o, size_t (0)); return hfunc (o, size_t (0));
} }
template <class C>
struct hash <db::disp_trans<C> >
{
size_t operator() (const db::disp_trans<C> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief Hash value for a complex transformation * @brief Hash value for a complex transformation
*/ */
@ -434,15 +326,6 @@ namespace std
return hfunc (o, size_t (0)); return hfunc (o, size_t (0));
} }
template <class I, class F, class R>
struct hash <db::complex_trans<I, F, R> >
{
size_t operator() (const db::complex_trans<I, F, R> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief A hash value for a db::CellInstArray and db::DCellInstArray * @brief A hash value for a db::CellInstArray and db::DCellInstArray
*/ */
@ -482,15 +365,6 @@ namespace std
return hfunc (o, size_t (0)); return hfunc (o, size_t (0));
} }
template <class C>
struct hash <db::array <db::CellInst, db::simple_trans<C> > >
{
size_t operator() (const db::array <db::CellInst, db::simple_trans<C> > &o) const
{
return hfunc (o);
}
};
/** /**
* @brief Hash value for an object with properties * @brief Hash value for an object with properties
*/ */
@ -507,15 +381,6 @@ namespace std
return hfunc ((const O &) o, db::hash_for_properties_id (o.properties_id ())); return hfunc ((const O &) o, db::hash_for_properties_id (o.properties_id ()));
} }
template <class O>
struct hash <db::object_with_properties<O> >
{
size_t operator() (const db::object_with_properties<O> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief A hash function for a shape reference * @brief A hash function for a shape reference
*/ */
@ -532,15 +397,6 @@ namespace std
return hfunc (*o.ptr (), hfunc (o.trans ())); return hfunc (*o.ptr (), hfunc (o.trans ()));
} }
template <class Shape, class Trans>
struct hash <db::shape_ref<Shape, Trans> >
{
size_t operator() (const db::shape_ref<Shape, Trans> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief A hash function for a polygon reference * @brief A hash function for a polygon reference
*/ */
@ -557,15 +413,6 @@ namespace std
return hfunc (*o.ptr (), hfunc (o.trans ())); return hfunc (*o.ptr (), hfunc (o.trans ()));
} }
template <class Shape, class Trans>
struct hash <db::polygon_ref<Shape, Trans> >
{
size_t operator() (const db::polygon_ref<Shape, Trans> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief A hash function for a path reference * @brief A hash function for a path reference
*/ */
@ -582,15 +429,6 @@ namespace std
return hfunc (*o.ptr (), hfunc (o.trans ())); return hfunc (*o.ptr (), hfunc (o.trans ()));
} }
template <class Shape, class Trans>
struct hash <db::path_ref<Shape, Trans> >
{
size_t operator() (const db::path_ref<Shape, Trans> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief A hash function for a text reference * @brief A hash function for a text reference
*/ */
@ -607,15 +445,6 @@ namespace std
return hfunc (*o.ptr (), hfunc (o.trans ())); return hfunc (*o.ptr (), hfunc (o.trans ()));
} }
template <class Shape, class Trans>
struct hash <db::text_ref<Shape, Trans> >
{
size_t operator() (const db::text_ref<Shape, Trans> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief A hash value for a db::LayerProperties object * @brief A hash value for a db::LayerProperties object
*/ */
@ -637,14 +466,191 @@ namespace std
return hfunc (o, size_t (0)); return hfunc (o, size_t (0));
} }
}
namespace std
{
template <class C>
struct hash <db::point<C> >
{
size_t operator() (const db::point<C> &o) const
{
return tl::hfunc (o);
}
};
template <class C>
struct hash <db::vector<C> >
{
size_t operator() (const db::vector<C> &o) const
{
return tl::hfunc (o);
}
};
template <class C>
struct hash <db::box<C> >
{
size_t operator() (const db::box<C> &o) const
{
return tl::hfunc (o);
}
};
template <class C>
struct hash <db::edge<C> >
{
size_t operator() (const db::edge<C> &o) const
{
return tl::hfunc (o);
}
};
template <class C>
struct hash <db::edge_pair<C> >
{
size_t operator() (const db::edge_pair<C> &o) const
{
return tl::hfunc (o);
}
};
template <class C>
struct hash <db::text<C> >
{
size_t operator() (const db::text<C> &o) const
{
return tl::hfunc (o);
}
};
template <class C>
struct hash <db::path<C> >
{
size_t operator() (const db::path<C> &o) const
{
return tl::hfunc (o);
}
};
template <class C>
struct hash <db::polygon_contour<C> >
{
size_t operator() (const db::path<C> &o) const
{
return tl::hfunc (o);
}
};
template <class C>
struct hash <db::polygon<C> >
{
size_t operator() (const db::polygon<C> &o) const
{
return tl::hfunc (o);
}
};
template <class C>
struct hash <db::simple_polygon<C> >
{
size_t operator() (const db::simple_polygon<C> &o) const
{
return tl::hfunc (o);
}
};
template <class C>
struct hash <db::simple_trans<C> >
{
size_t operator() (const db::simple_trans<C> &o) const
{
return tl::hfunc (o);
}
};
template <class C>
struct hash <db::disp_trans<C> >
{
size_t operator() (const db::disp_trans<C> &o) const
{
return tl::hfunc (o);
}
};
template <class I, class F, class R>
struct hash <db::complex_trans<I, F, R> >
{
size_t operator() (const db::complex_trans<I, F, R> &o) const
{
return tl::hfunc (o);
}
};
template <class C>
struct hash <db::array <db::CellInst, db::simple_trans<C> > >
{
size_t operator() (const db::array <db::CellInst, db::simple_trans<C> > &o) const
{
return tl::hfunc (o);
}
};
template <class O>
struct hash <db::object_with_properties<O> >
{
size_t operator() (const db::object_with_properties<O> &o) const
{
return tl::hfunc (o);
}
};
template <class Shape, class Trans>
struct hash <db::shape_ref<Shape, Trans> >
{
size_t operator() (const db::shape_ref<Shape, Trans> &o) const
{
return tl::hfunc (o);
}
};
template <class Shape, class Trans>
struct hash <db::polygon_ref<Shape, Trans> >
{
size_t operator() (const db::polygon_ref<Shape, Trans> &o) const
{
return tl::hfunc (o);
}
};
template <class Shape, class Trans>
struct hash <db::path_ref<Shape, Trans> >
{
size_t operator() (const db::path_ref<Shape, Trans> &o) const
{
return tl::hfunc (o);
}
};
template <class Shape, class Trans>
struct hash <db::text_ref<Shape, Trans> >
{
size_t operator() (const db::text_ref<Shape, Trans> &o) const
{
return tl::hfunc (o);
}
};
template <> template <>
struct hash <db::LayerProperties> struct hash <db::LayerProperties>
{ {
size_t operator() (const db::LayerProperties &o) const size_t operator() (const db::LayerProperties &o) const
{ {
return hfunc (o); return tl::hfunc (o);
} }
}; };
} }
#endif #endif

View File

@ -296,7 +296,7 @@ PropertiesSet::hash () const
tl::MutexLocker locker (&lock); tl::MutexLocker locker (&lock);
if (! m_hash) { if (! m_hash) {
m_hash = std::hfunc (to_map ()); m_hash = tl::hfunc (to_map ());
if (! m_hash) { if (! m_hash) {
// avoid 0 value as this is reserved for "not computed yet" // avoid 0 value as this is reserved for "not computed yet"
m_hash = size_t (1); m_hash = size_t (1);

View File

@ -867,15 +867,15 @@ size_t
Shape::hash_value () const Shape::hash_value () const
{ {
size_t h = size_t (m_type); size_t h = size_t (m_type);
h = std::hcombine (h, std::hfunc (m_trans)); h = tl::hcombine (h, tl::hfunc (m_trans));
if (m_stable) { if (m_stable) {
// Use the bytes of the iterator binary pattern (see operator<) // Use the bytes of the iterator binary pattern (see operator<)
for (unsigned int i = 0; i < sizeof (tl::reuse_vector<box_type>::const_iterator); ++i) { for (unsigned int i = 0; i < sizeof (tl::reuse_vector<box_type>::const_iterator); ++i) {
h = std::hcombine (h, size_t (m_generic.iter[i])); h = tl::hcombine (h, size_t (m_generic.iter[i]));
} }
} else { } else {
h = std::hcombine (h, size_t (m_generic.any)); h = tl::hcombine (h, size_t (m_generic.any));
} }
return h; return h;

View File

@ -124,7 +124,7 @@ struct box_defs
static size_t hash_value (const C *box) static size_t hash_value (const C *box)
{ {
return std::hfunc (*box); return tl::hfunc (*box);
} }
static const C &bbox (const C *box) static const C &bbox (const C *box)

View File

@ -448,7 +448,7 @@ struct cell_inst_array_defs
static size_t hash_value (const C *i) static size_t hash_value (const C *i)
{ {
return std::hfunc (*i); return tl::hfunc (*i);
} }
static bool less (const C *i, const C &other) static bool less (const C *i, const C &other)

View File

@ -170,7 +170,7 @@ struct edge_defs
static size_t hash_value (const C *e) static size_t hash_value (const C *e)
{ {
return std::hfunc (*e); return tl::hfunc (*e);
} }
static gsi::Methods methods () static gsi::Methods methods ()

View File

@ -62,7 +62,7 @@ struct edge_pair_defs
static size_t hash_value (const C *ep) static size_t hash_value (const C *ep)
{ {
return std::hfunc (*ep); return tl::hfunc (*ep);
} }
static gsi::Methods methods () static gsi::Methods methods ()

View File

@ -126,7 +126,7 @@ db::LayerProperties li_from_string (const char *s, bool as_target)
static static
size_t hash_value (const db::LayerProperties *l) size_t hash_value (const db::LayerProperties *l)
{ {
return std::hfunc (*l); return tl::hfunc (*l);
} }
static bool log_equal_ext (const db::LayerProperties *lp1, const db::LayerProperties &lp2) static bool log_equal_ext (const db::LayerProperties *lp1, const db::LayerProperties &lp2)

View File

@ -111,7 +111,7 @@ struct path_defs
static size_t hash_value (const C *e) static size_t hash_value (const C *e)
{ {
return std::hfunc (*e); return tl::hfunc (*e);
} }
static gsi::Methods methods () static gsi::Methods methods ()

View File

@ -95,7 +95,7 @@ struct point_defs
static size_t hash_value (const C *pt) static size_t hash_value (const C *pt)
{ {
return std::hfunc (*pt); return tl::hfunc (*pt);
} }
static C move_d (C *p, const vector_type &d) static C move_d (C *p, const vector_type &d)

View File

@ -275,7 +275,7 @@ struct simple_polygon_defs
static size_t hash_value (const C *p) static size_t hash_value (const C *p)
{ {
return std::hfunc (*p); return tl::hfunc (*p);
} }
static bool touches_box (const C *p, const db::box<coord_type> &box) static bool touches_box (const C *p, const db::box<coord_type> &box)
@ -1215,7 +1215,7 @@ struct polygon_defs
static size_t hash_value (const C *p) static size_t hash_value (const C *p)
{ {
return std::hfunc (*p); return tl::hfunc (*p);
} }
static bool touches_box (const C *p, const db::box<coord_type> &box) static bool touches_box (const C *p, const db::box<coord_type> &box)

View File

@ -169,7 +169,7 @@ struct text_defs
static size_t hash_value (const C *box) static size_t hash_value (const C *box)
{ {
return std::hfunc (*box); return tl::hfunc (*box);
} }
static gsi::Methods methods () static gsi::Methods methods ()

View File

@ -225,7 +225,7 @@ struct trans_defs
static size_t hash_value (const C *t) static size_t hash_value (const C *t)
{ {
return std::hfunc (*t); return tl::hfunc (*t);
} }
static gsi::Methods methods () static gsi::Methods methods ()
@ -853,7 +853,7 @@ struct cplx_trans_defs
static size_t hash_value (const C *t) static size_t hash_value (const C *t)
{ {
return std::hfunc (*t); return tl::hfunc (*t);
} }
static gsi::Methods methods () static gsi::Methods methods ()

View File

@ -114,7 +114,7 @@ struct vector_defs
static size_t hash_value (const C *v) static size_t hash_value (const C *v)
{ {
return std::hfunc (*v); return tl::hfunc (*v);
} }
static db::point<coord_type> add_with_point (const C *v, const db::point<coord_type> &p) static db::point<coord_type> add_with_point (const C *v, const db::point<coord_type> &p)

View File

@ -47,7 +47,7 @@
* for use with std::unordered_map and std::unordered_set * for use with std::unordered_map and std::unordered_set
*/ */
namespace std namespace tl
{ {
inline size_t hcombine (size_t h1, size_t h2) inline size_t hcombine (size_t h1, size_t h2)
{ {
@ -57,14 +57,14 @@ namespace std
template <class T> template <class T>
inline size_t hfunc (const T &t) inline size_t hfunc (const T &t)
{ {
hash <T> hf; std::hash <T> hf;
return hf (t); return hf (t);
} }
template <class T> template <class T>
inline size_t hfunc (const T &t, size_t h) inline size_t hfunc (const T &t, size_t h)
{ {
hash <T> hf; std::hash <T> hf;
return hcombine (h, hf (t)); return hcombine (h, hf (t));
} }
@ -93,15 +93,6 @@ namespace std
return hfunc (o.first, hfunc (o.second)); return hfunc (o.first, hfunc (o.second));
} }
template <class T1, class T2>
struct hash <std::pair <T1, T2> >
{
size_t operator() (const std::pair<T1, T2> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief Generic hash for an unordered set * @brief Generic hash for an unordered set
*/ */
@ -118,15 +109,6 @@ namespace std
return hfunc (o, size_t (0)); return hfunc (o, size_t (0));
} }
template <class T>
struct hash <std::unordered_set <T> >
{
size_t operator() (const std::unordered_set<T> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief Generic hash for a vector * @brief Generic hash for a vector
*/ */
@ -143,15 +125,6 @@ namespace std
return hfunc (o, size_t (0)); return hfunc (o, size_t (0));
} }
template <class T>
struct hash <std::vector <T> >
{
size_t operator() (const std::vector<T> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief Generic hash for a list * @brief Generic hash for a list
*/ */
@ -168,15 +141,6 @@ namespace std
return hfunc (o, size_t (0)); return hfunc (o, size_t (0));
} }
template <class T>
struct hash <std::list <T> >
{
size_t operator() (const std::list<T> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief Generic hash for a tl::slist * @brief Generic hash for a tl::slist
*/ */
@ -193,15 +157,6 @@ namespace std
return hfunc (o, size_t (0)); return hfunc (o, size_t (0));
} }
template <class T>
struct hash <tl::slist <T> >
{
size_t operator() (const tl::slist<T> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief Generic hash for an ordered set * @brief Generic hash for an ordered set
*/ */
@ -218,15 +173,6 @@ namespace std
return hfunc (o, size_t (0)); return hfunc (o, size_t (0));
} }
template <class T>
struct hash <std::set <T> >
{
size_t operator() (const std::set<T> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief Generic hash for std::multiset * @brief Generic hash for std::multiset
*/ */
@ -243,15 +189,6 @@ namespace std
return hfunc (o, size_t (0)); return hfunc (o, size_t (0));
} }
template <class T>
struct hash <std::multiset <T> >
{
size_t operator() (const std::multiset<T> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief Generic hash for an unordered map * @brief Generic hash for an unordered map
*/ */
@ -271,15 +208,6 @@ namespace std
return hfunc (o, size_t (0)); return hfunc (o, size_t (0));
} }
template <class T1, class T2>
struct hash <std::unordered_map<T1, T2> >
{
size_t operator() (const std::unordered_map<T1, T2> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief Generic hash for an ordered map * @brief Generic hash for an ordered map
*/ */
@ -299,15 +227,6 @@ namespace std
return hfunc (o, size_t (0)); return hfunc (o, size_t (0));
} }
template <class T1, class T2>
struct hash <std::map<T1, T2> >
{
size_t operator() (const std::map<T1, T2> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief Generic hash for std::multimap * @brief Generic hash for std::multimap
*/ */
@ -327,15 +246,6 @@ namespace std
return hfunc (o, size_t (0)); return hfunc (o, size_t (0));
} }
template <class T1, class T2>
struct hash <std::multimap<T1, T2> >
{
size_t operator() (const std::multimap<T1, T2> &o) const
{
return hfunc (o);
}
};
/** /**
* @brief Create a pointer hash from the pointer's value * @brief Create a pointer hash from the pointer's value
*/ */
@ -344,7 +254,7 @@ namespace std
{ {
size_t operator() (const X *ptr) const size_t operator() (const X *ptr) const
{ {
return ptr ? hash<X> () (*ptr) : 0; return ptr ? std::hash<X> () (*ptr) : 0;
} }
}; };
@ -400,6 +310,117 @@ namespace std
#endif #endif
#if defined(HAVE_64BIT_COORD)
inline size_t hfunc (__int128 v)
{
return hcombine (hfunc (uint64_t (v)), hfunc (uint64_t (v >> 64)));
}
inline size_t hfunc (__int128 v, size_t h)
{
return hcombine (hfunc (v), h);
}
#endif
}
// provide some missing std::hash implementations based on our tl::hfunc
namespace std
{
template <class T1, class T2>
struct hash <std::pair <T1, T2> >
{
size_t operator() (const std::pair<T1, T2> &o) const
{
return tl::hfunc (o);
}
};
template <class T>
struct hash <std::unordered_set <T> >
{
size_t operator() (const std::unordered_set<T> &o) const
{
return tl::hfunc (o);
}
};
template <class T>
struct hash <std::vector <T> >
{
size_t operator() (const std::vector<T> &o) const
{
return tl::hfunc (o);
}
};
template <class T>
struct hash <std::list <T> >
{
size_t operator() (const std::list<T> &o) const
{
return tl::hfunc (o);
}
};
template <class T>
struct hash <tl::slist <T> >
{
size_t operator() (const tl::slist<T> &o) const
{
return tl::hfunc (o);
}
};
template <class T>
struct hash <std::set <T> >
{
size_t operator() (const std::set<T> &o) const
{
return tl::hfunc (o);
}
};
template <class T>
struct hash <std::multiset <T> >
{
size_t operator() (const std::multiset<T> &o) const
{
return tl::hfunc (o);
}
};
template <class T1, class T2>
struct hash <std::unordered_map<T1, T2> >
{
size_t operator() (const std::unordered_map<T1, T2> &o) const
{
return tl::hfunc (o);
}
};
template <class T1, class T2>
struct hash <std::map<T1, T2> >
{
size_t operator() (const std::map<T1, T2> &o) const
{
return tl::hfunc (o);
}
};
template <class T1, class T2>
struct hash <std::multimap<T1, T2> >
{
size_t operator() (const std::multimap<T1, T2> &o) const
{
return tl::hfunc (o);
}
};
} }
#endif #endif

View File

@ -992,63 +992,63 @@ Variant::hash () const
size_t h = 0; size_t h = 0;
if (m_type == t_double) { if (m_type == t_double) {
h = std::hfunc (m_var.m_double); h = tl::hfunc (m_var.m_double);
} else if (m_type == t_float) { } else if (m_type == t_float) {
h = std::hfunc (m_var.m_float); h = tl::hfunc (m_var.m_float);
} else if (m_type == t_bool) { } else if (m_type == t_bool) {
h = std::hfunc (m_var.m_bool); h = tl::hfunc (m_var.m_bool);
} else if (m_type == t_uchar) { } else if (m_type == t_uchar) {
h = std::hfunc (m_var.m_uchar); h = tl::hfunc (m_var.m_uchar);
} else if (m_type == t_schar) { } else if (m_type == t_schar) {
h = std::hfunc (m_var.m_schar); h = tl::hfunc (m_var.m_schar);
} else if (m_type == t_char) { } else if (m_type == t_char) {
h = std::hfunc (m_var.m_char); h = tl::hfunc (m_var.m_char);
} else if (m_type == t_ushort) { } else if (m_type == t_ushort) {
h = std::hfunc (m_var.m_ushort); h = tl::hfunc (m_var.m_ushort);
} else if (m_type == t_short) { } else if (m_type == t_short) {
h = std::hfunc (m_var.m_short); h = tl::hfunc (m_var.m_short);
} else if (m_type == t_uint) { } else if (m_type == t_uint) {
h = std::hfunc (m_var.m_uint); h = tl::hfunc (m_var.m_uint);
} else if (m_type == t_int) { } else if (m_type == t_int) {
h = std::hfunc (m_var.m_int); h = tl::hfunc (m_var.m_int);
} else if (m_type == t_ulong) { } else if (m_type == t_ulong) {
h = std::hfunc (m_var.m_ulong); h = tl::hfunc (m_var.m_ulong);
} else if (m_type == t_long) { } else if (m_type == t_long) {
h = std::hfunc (m_var.m_long); h = tl::hfunc (m_var.m_long);
} else if (m_type == t_longlong) { } else if (m_type == t_longlong) {
h = std::hfunc (m_var.m_longlong); h = tl::hfunc (m_var.m_longlong);
} else if (m_type == t_ulonglong) { } else if (m_type == t_ulonglong) {
h = std::hfunc (m_var.m_ulonglong); h = tl::hfunc (m_var.m_ulonglong);
#if defined(HAVE_64BIT_COORD) #if defined(HAVE_64BIT_COORD)
} else if (m_type == t_int128) { } else if (m_type == t_int128) {
h = std::hfunc (m_var.m_int128); h = tl::hfunc (m_var.m_int128);
#endif #endif
} else if (m_type == t_id) { } else if (m_type == t_id) {
h = std::hfunc (m_var.m_id); h = tl::hfunc (m_var.m_id);
} else if (m_type == t_bytearray) { } else if (m_type == t_bytearray) {
h = std::hfunc (*m_var.m_bytearray); h = tl::hfunc (*m_var.m_bytearray);
#if defined(HAVE_QT) #if defined(HAVE_QT)
} else if (m_type == t_qstring) { } else if (m_type == t_qstring) {
h = std::hfunc (*m_var.m_qstring); h = tl::hfunc (*m_var.m_qstring);
} else if (m_type == t_qbytearray) { } else if (m_type == t_qbytearray) {
h = std::hfunc (*m_var.m_qbytearray); h = tl::hfunc (*m_var.m_qbytearray);
#endif #endif
} else if (m_type == t_stdstring) { } else if (m_type == t_stdstring) {
h = std::hfunc (*m_var.m_stdstring); h = tl::hfunc (*m_var.m_stdstring);
} else if (m_type == t_string) { } else if (m_type == t_string) {
for (const char *cp = m_string; *cp; ++cp) { for (const char *cp = m_string; *cp; ++cp) {
h = std::hfunc (*cp, h); h = tl::hfunc (*cp, h);
} }
} else if (m_type == t_list) { } else if (m_type == t_list) {
h = std::hfunc (*m_var.m_list); h = tl::hfunc (*m_var.m_list);
} else if (m_type == t_array) { } else if (m_type == t_array) {
h = std::hfunc (*m_var.m_array); h = tl::hfunc (*m_var.m_array);
} else if (m_type == t_user) { } else if (m_type == t_user) {
// NOTE: this involves pointers ... // NOTE: this involves pointers ...
h = std::hfunc (m_var.mp_user.object, std::hfunc (m_var.mp_user.cls, 0)); h = tl::hfunc (m_var.mp_user.object, tl::hfunc (m_var.mp_user.cls, 0));
} else if (m_type == t_user_ref) { } else if (m_type == t_user_ref) {
const WeakOrSharedPtr *ptr = reinterpret_cast<const WeakOrSharedPtr *> (m_var.mp_user_ref.ptr); const WeakOrSharedPtr *ptr = reinterpret_cast<const WeakOrSharedPtr *> (m_var.mp_user_ref.ptr);
h = std::hfunc (ptr->get (), std::hfunc (m_var.mp_user_ref.cls, 0)); h = tl::hfunc (ptr->get (), tl::hfunc (m_var.mp_user_ref.cls, 0));
} }
return h; return h;