]> www.ginac.de Git - ginac.git/blobdiff - ginac/utils.h
configure: don't bother to run checks which can be done at the compile time.
[ginac.git] / ginac / utils.h
index e93f9b505314177c3ac2792e64f0aa11bc45e18c..3c293ea8c5e2e3f7b42391e701f780d3e064acdd 100644 (file)
@@ -4,7 +4,7 @@
  *  of any interest to the user of the library. */
 
 /*
- *  GiNaC Copyright (C) 1999-2006 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2008 Johannes Gutenberg University Mainz, Germany
  *
  *  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
 #ifndef __GINAC_UTILS_H__
 #define __GINAC_UTILS_H__
 
+#ifdef HAVE_CONFIG_H
 #include "config.h"
+#endif
 
 #include <string>
 #include <functional>
+#ifdef HAVE_STDINT_H
+#include <stdint.h> // for uintptr_t
+#endif
 
 #include "assertion.h"
 
@@ -44,6 +49,13 @@ class dunno {};
 
 unsigned log2(unsigned n);
 
+/** Rotate bits of unsigned value by one bit to the left.
+  * This can be necesary if the user wants to define its own hashes. */
+inline unsigned rotate_left(unsigned n)
+{
+       return (n & 0x80000000U) ? (n << 1 | 0x00000001U) : (n << 1);
+}
+
 /** Compare two pointers (just to establish some sort of canonical order).
  *  @return -1, 0, or 1 */
 template <class T>
@@ -58,18 +70,8 @@ inline int compare_pointers(const T * a, const T * b)
        return 0;
 }
 
-/** Rotate bits of unsigned value by one bit to the left. */
-inline unsigned rotate_left(unsigned n)
-{
-       return (n & 0x80000000U) ? (n << 1 | 0x00000001U) : (n << 1);
-}
-
-#if SIZEOF_VOID_P == SIZEOF_INT
-typedef unsigned int p_int;
-#elif SIZEOF_VOID_P == SIZEOF_LONG
-typedef unsigned long p_int;
-#elif SIZEOF_VOID_P == SIZEOF_LONG_LONG
-typedef unsigned long long p_int;
+#ifdef HAVE_STDINT_H
+typedef uintptr_t p_int;
 #else
 typedef unsigned long p_int;
 #endif
@@ -79,24 +81,26 @@ inline unsigned golden_ratio_hash(p_int n)
 {
        // This function works much better when fast arithmetic with at
        // least 64 significant bits is available.
-#if SIZEOF_LONG >= 8
+       if (sizeof(long) >= 8) {
        // So 'long' has 64 bits.  Excellent!  We prefer it because it might be
        // more efficient than 'long long'.
        unsigned long l = n * 0x4f1bbcddUL;
        return (unsigned)l;
-#elif SIZEOF_LONG_LONG >= 8
+       }
+#ifdef HAVE_LONG_LONG
+       else if (sizeof(long long) >= 8) {
        // This requires 'long long' (or an equivalent 64 bit type)---which is,
        // unfortunately, not ANSI-C++-compliant.
        // (Yet C99 demands it, which is reason for hope.)
        unsigned long long l = n * 0x4f1bbcddULL;
        return (unsigned)l;
-#else
+       }
+#endif
        // Without a type with 64 significant bits do the multiplication manually
        // by splitting n up into the lower and upper two bytes.
        const unsigned n0 = (n & 0x0000ffffU);
        const unsigned n1 = (n & 0xffff0000U) >> 16;
        return (n0 * 0x0000bcddU) + ((n1 * 0x0000bcddU + n0 * 0x00004f1bU) << 16);
-#endif
 }
 
 /* Compute the sign of a permutation of a container, with and without an