/*! \file guid.cpp
** \brief Template File
**
-** $Id: guid.cpp,v 1.4 2005/01/13 06:48:39 darco Exp $
+** $Id$
**
** \legal
** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+** Copyright (c) 2007, 2008 Chris Moore
**
** This package is free software; you can redistribute it and/or
** modify it under the terms of the GNU General Public License as
/* === H E A D E R S ======================================================= */
-#define HASH_MAP_H <ext/hash_map>
-#define SUBTRACT_RNG_H <ext/functional>
-
#ifdef USING_PCH
# include "pch.h"
#else
#endif
#include "guid.h"
+#include "quick_rng.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#ifdef HASH_MAP_H
#include HASH_MAP_H
-using namespace __gnu_cxx;
-#endif
-
-#ifdef SUBTRACT_RNG_H
-#include SUBTRACT_RNG_H
-using namespace __gnu_cxx;
+#include FUNCTIONAL_H
#endif
#ifdef _WIN32
/* === M E T H O D S ======================================================= */
-// A fast 32-bit linear congruential random number generator
-class quick_rng
-{
- unsigned long next;
-public:
- quick_rng(unsigned long seed=0):next(seed) { }
-
- void set_seed(unsigned long x)
- {
- next=x;
- }
-
- unsigned long i32()
- {
- static const unsigned long a(1664525);
- static const unsigned long c(1013904223);
-
- return next=next*a+c;
- }
-
- unsigned long i16()
- {
- return i32()>>16;
- }
-
- float f()
- {
- static const float m(int(65535));
-
- return float(i16())/m;
- }
-
- unsigned long operator()(const unsigned long& m)
- {
- if(m==65536)
- return i16();
- else
- if(m<=65536)
- return i16()%m;
- else
- return i32()%m;
- }
-};
-
#define GUID_RNG quick_rng
//#define GUID_RNG subtractive_rng
static void _set_up_rand_long_long(uint64_t &x)
{
#ifdef _DEBUG
- synfig::info("Starting up GUID system...");
+ // synfig::info("Starting up GUID system...");
#endif
_a=GUID_RNG(time(0)+clock());
_b=GUID_RNG(clock());
static void _set_up_rand_long_long(uint64_t &x)
{
#ifdef _DEBUG
- synfig::info("Starting up GUID system...");
+ // synfig::info("Starting up GUID system...");
#endif
rand_fd=open("/dev/urandom",O_RDONLY);
get_rand_long_long=_get_rand_long_long;
synfig::GUID::hasher(const String& str)
{
#ifdef HASH_MAP_H
- hash<const char*> string_hash_;
- const unsigned int seed(
- string_hash_(
- str.c_str()
- )
- );
-#else
- const unsigned int seed(0x3B642879);
- for(int i=0;i<str.size();i++)
+ /* http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1456.html says:
+ *
+ * "Some earlier hash table implementations gave char* special
+ * treatment: it specialized the default hash function to look
+ * at character array being pointed to, rather than the pointer
+ * itself. This proposal removes that special treatment."
+ *
+ * Unfortunately, the older implementation doesn't seem to want to
+ * accept Strings, so we're left with this conditional compilation.
+ */
+# ifdef FUNCTIONAL_HASH_ON_STRING
+ HASH_MAP_NAMESPACE::hash<String> string_hash_;
+ const unsigned int seed(string_hash_(str));
+# else // FUNCTIONAL_HASH_ON_STRING
+ HASH_MAP_NAMESPACE::hash<const char*> string_hash_;
+ const unsigned int seed(string_hash_(str.c_str()));
+# endif // FUNCTIONAL_HASH_ON_STRING
+#else // HASH_MAP_H
+ unsigned int seed(0x3B642879);
+ for(unsigned int i=0;i<str.size();i++)
{
- seed^=(seed*str[i])*i
- seed=(seed>>(32-(i%24)))^(seed<<(i%24))
+ seed^=(seed*str[i])*i;
+ seed=(seed>>(32-(i%24)))^(seed<<(i%24));
}
-#endif
+#endif // HASH_MAP_H
GUID_RNG random(seed);
GUID ret(0);