⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyfunc.h

📁 比较权威的p2p仿真软件
💻 H
字号:
// -*-c++-*-/* $Id: keyfunc.h,v 1.1 2003/12/07 18:58:09 thomer Exp $ *//* * * Copyright (C) 1998 David Mazieres (dm@uun.org) * * This program 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 2, or (at * your option) any later version. * * This program 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. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * */#ifndef _KEYFUNC_H_#define _KEYFUNC_H_ 1template<class T> struct unref_t {  typedef T base_type;  typedef T unref_type;  typedef const T &ref_type;  typedef T &ncref_type;};template<class T> struct unref_t<const T> {  typedef T base_type;  typedef const T unref_type;  typedef const T &ref_type;  typedef T &ncref_type;};template<class T> struct unref_t<T &> {  typedef T base_type;  typedef T unref_type;  typedef const T &ref_type;  typedef T &ncref_type;};template<class T> struct unref_t<const T &> {  typedef T base_type;  typedef const T unref_type;  typedef const T &ref_type;  typedef T &ncref_type;};#define CREF(T) unref_t<T>::ref_type#define UNREF(T) unref_t<T>::unref_type#define UNCREF(T) unref_t<T>::base_type#define NCREF(T) unref_t<T>::ncref_type#define HASHSEED 5381inline u_inthash_bytes (const void *_key, int len, u_int seed = HASHSEED){  const u_char *key = (const u_char *) _key;  const u_char *end;  for (end = key + len; key < end; key++)    seed = ((seed << 5) + seed) ^ *key;  return seed;}inline u_inthash_string (const void *_p, u_int v = HASHSEED){  const char *p = (const char *) _p;  while (*p)    v = (33 * v) ^ (unsigned char) *p++;  return v;}inline u_inthash_rotate (u_int val, u_int rot){  rot %= 8 * sizeof (val);  return (val << rot) | (val >> (8 * sizeof (val) - rot));}class hash_t {  u_int val;public:  hash_t () {}  hash_t (u_int v) : val (v) {}  operator u_int() const { return val; }};template<class T>struct compare {  compare () {}  int operator() (typename CREF (T) a, typename CREF (T) b) const    { return a < b ? -1 : b < a; }};template<class T>struct compare<const T> : compare<T>{  compare () {}};template<class T>struct equals {  equals () {}  bool operator() (typename CREF (T) a, typename CREF (T) b) const    { return a == b; }};template<class T>struct equals<const T> : equals<T>{  equals () {}};template<class T>struct hashfn {  hashfn () {}  hash_t operator() (typename CREF (T) a) const    { return a; }};template<class T>struct hashfn<const T> : hashfn<T>{  hashfn () {}};template<class T1, class T2>struct hash2fn {  hashfn<T1> h1;  hashfn<T2> h2;  hash2fn () {}  hash_t operator() (typename CREF (T1) t1, typename CREF (T2) t2) const    { return h1 (t1) ^ h2 (t2);  }};/* Don't compare pointers by accident */template<class T> struct compare<T *>;template<class T> struct hashfn<T *>;/* Specializations for (char *) */#define _CHAR_PTR(T, u)						\template<>							\struct compare<T> {						\  compare () {}							\  int operator() (const u char *a, const u char *b) const	\    { return strcmp ((char *) a, (char *) b); }			\};								\template<>							\struct equals<T> {						\  equals () {}							\  bool operator() (const u char *a, const u char *b) const	\    { return !strcmp ((char *) a, (char *) b); }		\};								\template<>							\struct hashfn<T> {						\  hashfn () {}							\  hash_t operator() (const u char *a) const			\    { return hash_string (a); }					\};#define CHAR_PTR(T, u) _CHAR_PTR(T, u) _CHAR_PTR(T const, u)CHAR_PTR(char *,)CHAR_PTR(const char *,)CHAR_PTR(signed char *, signed)CHAR_PTR(const signed char *, signed)CHAR_PTR(unsigned char *, unsigned)CHAR_PTR(const unsigned char *, unsigned)template<class R, class V, class K, K V::*key, class F>class keyfunc_1 {public:  const F kf;  keyfunc_1 () {}  keyfunc_1 (const F &f) : kf (f) {}  R operator() (typename CREF (V) a) const    { return kf (a.*key); }};template<class R, class V, class K, K V::*key, class F>class keyfunc_2 {public:  const F kf;  keyfunc_2 () {}  keyfunc_2 (const F &f) : kf (f) {}  R operator() (typename CREF (V) a, typename CREF (V) b) const    { return kf (a.*key, b.*key); }};#endif /* !KEYFUNC_H_ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -