HashFunc.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00024 #ifndef __HASHFUNC
00025 #define __HASHFUNC
00026
00027 #include <oversim_mapset.h>
00028 #include <oversim_byteswap.h>
00029
00030 #include <IPvXAddress.h>
00031 #include <TransportAddress.h>
00032
00033 #if defined(HAVE_GCC_TR1) || defined(HAVE_MSVC_TR1)
00034 namespace std { namespace tr1 {
00035 #else
00036 namespace __gnu_cxx {
00037 #endif
00038
00042 template<> struct hash<IPvXAddress> : std::unary_function<IPvXAddress, std::size_t>
00043 {
00050 std::size_t operator()(const IPvXAddress& addr) const
00051 {
00052 if (addr.isIPv6()) {
00053 return bswap_32(addr.get6().words()[0]) ^
00054 bswap_32(addr.get6().words()[1]) ^
00055 bswap_32(addr.get6().words()[2]) ^
00056 bswap_32(addr.get6().words()[3]);
00057 } else {
00058 return bswap_32(addr.get4().getInt());
00059 }
00060 }
00061 };
00062
00063
00067 template<> struct hash<TransportAddress> : std::unary_function<TransportAddress, std::size_t>
00068 {
00075 std::size_t operator()(const TransportAddress& addr) const
00076 {
00077 if (addr.getAddress().isIPv6()) {
00078 return ((bswap_32(addr.getAddress().get6().words()[0]) ^
00079 bswap_32(addr.getAddress().get6().words()[1]) ^
00080 bswap_32(addr.getAddress().get6().words()[2]) ^
00081 bswap_32(addr.getAddress().get6().words()[3])) ^
00082 addr.getPort());
00083 } else {
00084 return (bswap_32(addr.getAddress().get4().getInt()) ^
00085 addr.getPort());
00086 }
00087 }
00088 };
00089
00090 }
00091 #if defined(HAVE_GCC_TR1) || defined(HAVE_MSVC_TR1)
00092 }
00093 #endif
00094
00095 #endif