From c481446c0210205deca32bef6e199b5dd84f7b11 Mon Sep 17 00:00:00 2001
From: Waldemar Brodkorb <wbx@openadk.org>
Date: Fri, 6 Feb 2015 17:38:29 +0100
Subject: update firefox, partially working.

---
 package/firefox/patches/patch-configure            |   63 +-
 .../patch-gfx_angle_src_common_angleutils_cpp      |   10 +
 .../patches/patch-gfx_layers_BufferUnrotate_cpp    |   10 -
 ...patch-ipc_chromium_src_base_debug_util_posix_cc |   13 -
 .../patch-ipc_chromium_src_base_file_util_h        |   10 -
 .../patch-ipc_chromium_src_base_file_util_posix_cc |   48 -
 package/firefox/patches/patch-js_src_Makefile_in   |   14 +-
 .../patches/patch-js_src_assembler_wtf_Platform_h  |   12 -
 package/firefox/patches/patch-js_src_configure     |   31 -
 .../patch-js_src_yarr_BumpPointerAllocator_h       |   11 -
 ...a_mtransport_third_party_nICEr_src_stun_addrs_c |   43 -
 ...ia_mtransport_third_party_nICEr_src_stun_stun_h |   12 -
 ...edia_webrtc_trunk_tools_gyp_pylib_gyp_common_py |   23 -
 ..._trunk_tools_gyp_pylib_gyp_generator_mozmake_py |   26 -
 ...ebrtc_modules_audio_device_audio_device_impl_cc |   11 -
 ...s_audio_device_linux_audio_device_alsa_linux_cc |   11 -
 ..._device_linux_audio_mixer_manager_alsa_linux_cc |   11 -
 ...trunk_webrtc_system_wrappers_source_cpu_info_cc |   23 -
 ...em_wrappers_source_spreadsortlib_spreadsort_hpp | 3385 --------------------
 .../patch-netwerk_sctp_src_netinet_sctp_bsd_addr_c |   15 -
 ...ch-netwerk_sctp_src_netinet_sctp_os_userspace_h |   22 -
 .../patch-netwerk_sctp_src_netinet_sctp_pcb_c      |   25 -
 .../patch-netwerk_sctp_src_user_environment_c      |   14 -
 .../patches/patch-netwerk_sctp_src_user_queue_h    |   12 -
 ...thon_mozbuild_mozbuild_backend_recursivemake_py |   10 +-
 .../patches/patch-tools_profiler_platform-linux_cc |   12 +-
 .../patch-tools_profiler_shared-libraries-linux_cc |   11 -
 .../firefox/patches/patch-xpcom_ds_nsMathUtils_h   |   22 +-
 .../patches/patch-xpcom_io_nsLocalFileUnix_cpp     |   31 +-
 .../patches/patch-xpcom_threads_nsThread_cpp       |   17 -
 30 files changed, 94 insertions(+), 3864 deletions(-)
 create mode 100644 package/firefox/patches/patch-gfx_angle_src_common_angleutils_cpp
 delete mode 100644 package/firefox/patches/patch-gfx_layers_BufferUnrotate_cpp
 delete mode 100644 package/firefox/patches/patch-ipc_chromium_src_base_debug_util_posix_cc
 delete mode 100644 package/firefox/patches/patch-ipc_chromium_src_base_file_util_h
 delete mode 100644 package/firefox/patches/patch-ipc_chromium_src_base_file_util_posix_cc
 delete mode 100644 package/firefox/patches/patch-js_src_assembler_wtf_Platform_h
 delete mode 100644 package/firefox/patches/patch-js_src_configure
 delete mode 100644 package/firefox/patches/patch-js_src_yarr_BumpPointerAllocator_h
 delete mode 100644 package/firefox/patches/patch-media_mtransport_third_party_nICEr_src_stun_addrs_c
 delete mode 100644 package/firefox/patches/patch-media_mtransport_third_party_nICEr_src_stun_stun_h
 delete mode 100644 package/firefox/patches/patch-media_webrtc_trunk_tools_gyp_pylib_gyp_common_py
 delete mode 100644 package/firefox/patches/patch-media_webrtc_trunk_tools_gyp_pylib_gyp_generator_mozmake_py
 delete mode 100644 package/firefox/patches/patch-media_webrtc_trunk_webrtc_modules_audio_device_audio_device_impl_cc
 delete mode 100644 package/firefox/patches/patch-media_webrtc_trunk_webrtc_modules_audio_device_linux_audio_device_alsa_linux_cc
 delete mode 100644 package/firefox/patches/patch-media_webrtc_trunk_webrtc_modules_audio_device_linux_audio_mixer_manager_alsa_linux_cc
 delete mode 100644 package/firefox/patches/patch-media_webrtc_trunk_webrtc_system_wrappers_source_cpu_info_cc
 delete mode 100644 package/firefox/patches/patch-media_webrtc_trunk_webrtc_system_wrappers_source_spreadsortlib_spreadsort_hpp
 delete mode 100644 package/firefox/patches/patch-netwerk_sctp_src_netinet_sctp_bsd_addr_c
 delete mode 100644 package/firefox/patches/patch-netwerk_sctp_src_netinet_sctp_os_userspace_h
 delete mode 100644 package/firefox/patches/patch-netwerk_sctp_src_netinet_sctp_pcb_c
 delete mode 100644 package/firefox/patches/patch-netwerk_sctp_src_user_environment_c
 delete mode 100644 package/firefox/patches/patch-netwerk_sctp_src_user_queue_h
 delete mode 100644 package/firefox/patches/patch-tools_profiler_shared-libraries-linux_cc
 delete mode 100644 package/firefox/patches/patch-xpcom_threads_nsThread_cpp

(limited to 'package/firefox/patches')

diff --git a/package/firefox/patches/patch-configure b/package/firefox/patches/patch-configure
index 884cea4dd..52210624e 100644
--- a/package/firefox/patches/patch-configure
+++ b/package/firefox/patches/patch-configure
@@ -1,30 +1,41 @@
---- mozilla-release.orig/configure	2013-12-05 17:08:46.000000000 +0100
-+++ mozilla-release/configure	2014-01-06 18:17:43.008094174 +0100
-@@ -9787,27 +9787,6 @@ if test -z "$GNU_CC"; then
-     esac
+--- mozilla-release.orig/configure	2015-01-09 05:39:04.000000000 +0100
++++ mozilla-release/configure	2015-02-04 11:49:00.000000000 +0100
+@@ -8156,38 +8156,6 @@ EOF
+ 
  fi
  
--if test "$GNU_CC" -a -n "$DEVELOPER_OPTIONS"; then
--            if $CC -Wl,--version 2>&1 | grep -q "GNU ld"; then
--        GOLD=$($CC -print-prog-name=ld.gold)
--        case "$GOLD" in
--        /*)
--            ;;
--        *)
--            GOLD=$(which $GOLD)
--            ;;
--        esac
--        if test -n "$GOLD"; then
--            mkdir -p $_objdir/build/unix/gold
--            ln -s "$GOLD" $_objdir/build/unix/gold/ld
--            if $CC -B $_objdir/build/unix/gold -Wl,--version 2>&1 | grep -q "GNU gold"; then
--                LDFLAGS="$LDFLAGS -B $_objdir/build/unix/gold"
--            else
--                rm -rf $_objdir/build/unix/gold
--            fi
--        fi
--    fi
+-MOZ_ENABLE_PROFILER_SPS=1
+-
+-case "${OS_TARGET}" in
+-Android)
+-    case "${CPU_ARCH}" in
+-    x86 | arm) ;;
+-    *)
+-        MOZ_ENABLE_PROFILER_SPS=
+-    esac
+-    ;;
+-Linux)
+-    case "${CPU_ARCH}" in
+-    x86 | x86_64) ;;
+-    *)
+-        MOZ_ENABLE_PROFILER_SPS=
+-    esac
+-    ;;
+-WINNT|Darwin) ;;
+-*)
+-    MOZ_ENABLE_PROFILER_SPS=
+-    ;;
+-esac
+-
+-if test -n "$MOZ_ENABLE_PROFILER_SPS"; then
+-    cat >> confdefs.pytmp <<\EOF
+-    (''' MOZ_ENABLE_PROFILER_SPS ''', ' 1 ')
+-EOF
+-cat >> confdefs.h <<\EOF
+-#define MOZ_ENABLE_PROFILER_SPS 1
+-EOF
+-
 -fi
  
- if test "$GNU_CC"; then
-     if test -z "$DEVELOPER_OPTIONS"; then
+ # Check whether --enable-shark or --disable-shark was given.
+ if test "${enable_shark+set}" = set; then
diff --git a/package/firefox/patches/patch-gfx_angle_src_common_angleutils_cpp b/package/firefox/patches/patch-gfx_angle_src_common_angleutils_cpp
new file mode 100644
index 000000000..bcf9ac30a
--- /dev/null
+++ b/package/firefox/patches/patch-gfx_angle_src_common_angleutils_cpp
@@ -0,0 +1,10 @@
+--- mozilla-release.orig/gfx/angle/src/common/angleutils.cpp	2015-01-09 05:38:28.000000000 +0100
++++ mozilla-release/gfx/angle/src/common/angleutils.cpp	2015-02-03 04:42:10.000000000 +0100
+@@ -7,6 +7,7 @@
+ #include "common/angleutils.h"
+ 
+ #include <vector>
++#include <cstdio>
+ 
+ std::string FormatString(const char *fmt, va_list vararg)
+ {
diff --git a/package/firefox/patches/patch-gfx_layers_BufferUnrotate_cpp b/package/firefox/patches/patch-gfx_layers_BufferUnrotate_cpp
deleted file mode 100644
index 0a96d2259..000000000
--- a/package/firefox/patches/patch-gfx_layers_BufferUnrotate_cpp
+++ /dev/null
@@ -1,10 +0,0 @@
---- mozilla-release.orig/gfx/layers/BufferUnrotate.cpp	2013-12-05 17:07:31.000000000 +0100
-+++ mozilla-release/gfx/layers/BufferUnrotate.cpp	2014-01-06 21:27:39.000000000 +0100
-@@ -8,6 +8,7 @@
- #include <stdint.h>
- #include <stdio.h>
- #include <stdlib.h>
-+#include <string.h>
- 
- void BufferUnrotate(uint8_t* aBuffer, int aByteWidth, int aHeight,
-                     int aByteStride, int aXBoundary, int aYBoundary)
diff --git a/package/firefox/patches/patch-ipc_chromium_src_base_debug_util_posix_cc b/package/firefox/patches/patch-ipc_chromium_src_base_debug_util_posix_cc
deleted file mode 100644
index 8537bed9a..000000000
--- a/package/firefox/patches/patch-ipc_chromium_src_base_debug_util_posix_cc
+++ /dev/null
@@ -1,13 +0,0 @@
---- mozilla-release.orig/ipc/chromium/src/base/debug_util_posix.cc	2013-09-11 01:15:04.000000000 +0200
-+++ mozilla-release/ipc/chromium/src/base/debug_util_posix.cc	2013-10-23 16:28:38.000000000 +0200
-@@ -5,7 +5,9 @@
- #include "build/build_config.h"
- #include "base/debug_util.h"
- 
--#define MOZ_HAVE_EXECINFO_H (defined(OS_LINUX) && !defined(ANDROID))
-+#include <features.h>
-+
-+#define MOZ_HAVE_EXECINFO_H (defined(OS_LINUX) && !defined(ANDROID) && !defined(__UCLIBC__)) && defined(__GLIBC__)
- 
- #include <errno.h>
- #include <fcntl.h>
diff --git a/package/firefox/patches/patch-ipc_chromium_src_base_file_util_h b/package/firefox/patches/patch-ipc_chromium_src_base_file_util_h
deleted file mode 100644
index 5f7e30a10..000000000
--- a/package/firefox/patches/patch-ipc_chromium_src_base_file_util_h
+++ /dev/null
@@ -1,10 +0,0 @@
---- mozilla-release.orig/ipc/chromium/src/base/file_util.h	2013-12-05 17:07:35.000000000 +0100
-+++ mozilla-release/ipc/chromium/src/base/file_util.h	2014-01-02 15:01:42.000000000 +0100
-@@ -16,7 +16,6 @@
- #include <sys/stat.h>
- #elif defined(OS_POSIX) 
- #include <sys/types.h>
--#include <fts.h>
- #include <sys/stat.h>
- #endif
- 
diff --git a/package/firefox/patches/patch-ipc_chromium_src_base_file_util_posix_cc b/package/firefox/patches/patch-ipc_chromium_src_base_file_util_posix_cc
deleted file mode 100644
index 7680a29c4..000000000
--- a/package/firefox/patches/patch-ipc_chromium_src_base_file_util_posix_cc
+++ /dev/null
@@ -1,48 +0,0 @@
---- mozilla-release.orig/ipc/chromium/src/base/file_util_posix.cc	2013-12-05 17:07:35.000000000 +0100
-+++ mozilla-release/ipc/chromium/src/base/file_util_posix.cc	2014-01-02 14:53:44.000000000 +0100
-@@ -8,13 +8,16 @@
- #include <errno.h>
- #include <fcntl.h>
- #include <fnmatch.h>
--#ifndef ANDROID
-+#ifndef __GLIBC__
-+#define NO_FTS
-+#endif
-+#ifndef NO_FTS
- #include <fts.h>
- #endif
- #include <libgen.h>
- #include <stdio.h>
- #include <string.h>
--#include <sys/errno.h>
-+#include <errno.h>
- #include <sys/mman.h>
- #define _DARWIN_USE_64_BIT_INODE // Use 64-bit inode data structures
- #include <sys/stat.h>
-@@ -67,7 +70,7 @@ bool Delete(const FilePath& path, bool r
-   if (!recursive)
-     return (rmdir(path_str) == 0);
- 
--#ifdef ANDROID
-+#ifdef NO_FTS
-   // XXX Need ftsless impl for bionic
-   return false;
- #else
-@@ -140,7 +143,7 @@ bool CopyDirectory(const FilePath& from_
-     return false;
-   }
- 
--#ifdef ANDROID
-+#ifdef NO_FTS
-   // XXX Need ftsless impl for bionic
-   return false;
- #else
-@@ -333,7 +336,7 @@ bool CreateNewTempDirectory(const FilePa
-     return false;
-   tmpdir = tmpdir.Append(kTempFileName);
-   std::string tmpdir_string = tmpdir.value();
--#ifdef ANDROID
-+#ifdef NO_FTS
-   char* dtemp = NULL;
- #else
-   // this should be OK since mkdtemp just replaces characters in place
diff --git a/package/firefox/patches/patch-js_src_Makefile_in b/package/firefox/patches/patch-js_src_Makefile_in
index d4acee98c..b536ab3f5 100644
--- a/package/firefox/patches/patch-js_src_Makefile_in
+++ b/package/firefox/patches/patch-js_src_Makefile_in
@@ -1,11 +1,11 @@
---- mozilla-release.orig/js/src/Makefile.in	2013-12-05 17:07:35.000000000 +0100
-+++ mozilla-release/js/src/Makefile.in	2014-01-02 14:53:44.000000000 +0100
-@@ -103,7 +103,7 @@ ifdef JS_HAS_CTYPES
- VPATH += $(srcdir)/ctypes
+--- mozilla-release.orig/js/src/Makefile.in	2015-01-09 05:38:17.000000000 +0100
++++ mozilla-release/js/src/Makefile.in	2015-01-29 17:03:28.000000000 +0100
+@@ -21,7 +21,7 @@ NO_EXPAND_LIBS = 1
  
+ ifdef JS_HAS_CTYPES
  ifdef MOZ_NATIVE_FFI
 -LOCAL_INCLUDES = $(MOZ_FFI_CFLAGS)
-+LOCAL_INCLUDES =
- else
- LOCAL_INCLUDES = -Ictypes/libffi/include
++LOCAL_INCLUDES = 
  endif
+ 
+ # Windows needs this to be linked with a static library.
diff --git a/package/firefox/patches/patch-js_src_assembler_wtf_Platform_h b/package/firefox/patches/patch-js_src_assembler_wtf_Platform_h
deleted file mode 100644
index 68a7adf0a..000000000
--- a/package/firefox/patches/patch-js_src_assembler_wtf_Platform_h
+++ /dev/null
@@ -1,12 +0,0 @@
---- mozilla-release.orig/js/src/assembler/wtf/Platform.h	2013-09-11 01:15:04.000000000 +0200
-+++ mozilla-release/js/src/assembler/wtf/Platform.h	2013-10-28 12:43:50.000000000 +0100
-@@ -139,8 +139,7 @@
- 
- /* WTF_CPU_MIPS - MIPS 32-bit */
- /* Note: Only O32 ABI is tested, so we enable it for O32 ABI for now.  */
--#if (defined(mips) || defined(__mips__) || defined(MIPS) || defined(_MIPS_)) \
--    && defined(_ABIO32)
-+#if (defined(mips) || defined(__mips__) || defined(MIPS) || defined(_MIPS_))
- #define WTF_CPU_MIPS 1
- #if defined(__MIPSEB__)
- #define WTF_CPU_BIG_ENDIAN 1
diff --git a/package/firefox/patches/patch-js_src_configure b/package/firefox/patches/patch-js_src_configure
deleted file mode 100644
index c37f501e4..000000000
--- a/package/firefox/patches/patch-js_src_configure
+++ /dev/null
@@ -1,31 +0,0 @@
---- mozilla-release.orig/js/src/configure	2013-12-05 17:08:46.000000000 +0100
-+++ mozilla-release/js/src/configure	2014-01-07 19:30:38.660353287 +0100
-@@ -8652,28 +8652,6 @@ if test -z "$GNU_CC"; then
-     esac
- fi
- 
--if test "$GNU_CC" -a -n "$DEVELOPER_OPTIONS"; then
--            if $CC -Wl,--version 2>&1 | grep -q "GNU ld"; then
--        GOLD=$($CC -print-prog-name=ld.gold)
--        case "$GOLD" in
--        /*)
--            ;;
--        *)
--            GOLD=$(which $GOLD)
--            ;;
--        esac
--        if test -n "$GOLD"; then
--            mkdir -p $_objdir/build/unix/gold
--            ln -s "$GOLD" $_objdir/build/unix/gold/ld
--            if $CC -B $_objdir/build/unix/gold -Wl,--version 2>&1 | grep -q "GNU gold"; then
--                LDFLAGS="$LDFLAGS -B $_objdir/build/unix/gold"
--            else
--                rm -rf $_objdir/build/unix/gold
--            fi
--        fi
--    fi
--fi
--
- if test "$GNU_CC"; then
-     if test -z "$DEVELOPER_OPTIONS"; then
-         CFLAGS="$CFLAGS -ffunction-sections -fdata-sections"
diff --git a/package/firefox/patches/patch-js_src_yarr_BumpPointerAllocator_h b/package/firefox/patches/patch-js_src_yarr_BumpPointerAllocator_h
deleted file mode 100644
index 1697dfddd..000000000
--- a/package/firefox/patches/patch-js_src_yarr_BumpPointerAllocator_h
+++ /dev/null
@@ -1,11 +0,0 @@
---- mozilla-release.orig/js/src/yarr/BumpPointerAllocator.h	2013-09-11 01:15:09.000000000 +0200
-+++ mozilla-release/js/src/yarr/BumpPointerAllocator.h	2013-10-28 12:44:10.000000000 +0100
-@@ -38,6 +38,8 @@ namespace WTF {
- #define MINIMUM_BUMP_POOL_SIZE 0x2000
- #elif WTF_CPU_IA64
- #define MINIMUM_BUMP_POOL_SIZE 0x4000
-+#elif WTF_CPU_MIPS
-+#define MINIMUM_BUMP_POOL_SIZE 0x4000
- #else
- #define MINIMUM_BUMP_POOL_SIZE 0x1000
- #endif
diff --git a/package/firefox/patches/patch-media_mtransport_third_party_nICEr_src_stun_addrs_c b/package/firefox/patches/patch-media_mtransport_third_party_nICEr_src_stun_addrs_c
deleted file mode 100644
index f2b55cd6a..000000000
--- a/package/firefox/patches/patch-media_mtransport_third_party_nICEr_src_stun_addrs_c
+++ /dev/null
@@ -1,43 +0,0 @@
---- mozilla-release.orig/media/mtransport/third_party/nICEr/src/stun/addrs.c	2013-12-05 17:07:48.000000000 +0100
-+++ mozilla-release/media/mtransport/third_party/nICEr/src/stun/addrs.c	2014-03-16 18:41:03.000000000 +0100
-@@ -45,7 +45,9 @@ static char *RCSSTRING __UNUSED__="$Id:
- #include <sys/param.h>
- #include <sys/socket.h>
- #ifndef ANDROID
-+#ifdef __GLIBC__
- #include <sys/sysctl.h>
-+#endif
- #include <sys/syslog.h>
- #else
- #include <syslog.h>
-@@ -53,7 +55,9 @@ static char *RCSSTRING __UNUSED__="$Id:
- #undef __unused
- #include <linux/sysctl.h>
- #endif
-+#if defined(__GLIBC__)
- #include <net/if.h>
-+#endif
- #ifndef LINUX
- #if !defined(__OpenBSD__) && !defined(__NetBSD__)
- #include <net/if_var.h>
-@@ -61,14 +65,17 @@ static char *RCSSTRING __UNUSED__="$Id:
- #include <net/if_dl.h>
- #include <net/if_types.h>
- #include <sys/sockio.h>
--#else
-+#elif defined(__GLIBC__)
- #include <linux/sockios.h>
- #include <linux/if.h>
- #include <linux/kernel.h>
- #include <linux/wireless.h>
--#ifndef ANDROID
- #include <linux/ethtool.h>
--#endif
-+#else
-+#include <linux/sockios.h>
-+#include <linux/kernel.h>
-+#include <linux/wireless.h>
-+#include <linux/ethtool.h>
- #endif
- #include <net/route.h>
- 
diff --git a/package/firefox/patches/patch-media_mtransport_third_party_nICEr_src_stun_stun_h b/package/firefox/patches/patch-media_mtransport_third_party_nICEr_src_stun_stun_h
deleted file mode 100644
index 7877d65cc..000000000
--- a/package/firefox/patches/patch-media_mtransport_third_party_nICEr_src_stun_stun_h
+++ /dev/null
@@ -1,12 +0,0 @@
---- mozilla-release.orig/media/mtransport/third_party/nICEr/src/stun/stun.h	2013-12-05 17:07:48.000000000 +0100
-+++ mozilla-release/media/mtransport/third_party/nICEr/src/stun/stun.h	2014-01-03 17:19:05.000000000 +0100
-@@ -39,7 +39,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- #else
- #include <sys/param.h>
- #include <sys/socket.h>
-+#if defined(__GLIBC__)
- #include <net/if.h>
-+#endif
- #ifndef LINUX
- #if !defined(__OpenBSD__) && !defined(__NetBSD__)
- #include <net/if_var.h>
diff --git a/package/firefox/patches/patch-media_webrtc_trunk_tools_gyp_pylib_gyp_common_py b/package/firefox/patches/patch-media_webrtc_trunk_tools_gyp_pylib_gyp_common_py
deleted file mode 100644
index 60d33bb2e..000000000
--- a/package/firefox/patches/patch-media_webrtc_trunk_tools_gyp_pylib_gyp_common_py
+++ /dev/null
@@ -1,23 +0,0 @@
---- mozilla-release.orig/media/webrtc/trunk/tools/gyp/pylib/gyp/common.py	2013-12-05 17:07:48.000000000 +0100
-+++ mozilla-release/media/webrtc/trunk/tools/gyp/pylib/gyp/common.py	2014-02-05 08:12:49.000000000 +0100
-@@ -364,20 +364,6 @@ def WriteOnDiff(filename):
- 
- def GetFlavor(params):
-   """Returns |params.flavor| if it's set, the system's default flavor else."""
--  flavors = {
--    'cygwin': 'win',
--    'win32': 'win',
--    'darwin': 'mac',
--  }
--
--  if 'flavor' in params:
--    return params['flavor']
--  if sys.platform in flavors:
--    return flavors[sys.platform]
--  if sys.platform.startswith('sunos'):
--    return 'solaris'
--  if sys.platform.startswith('freebsd'):
--    return 'freebsd'
- 
-   return 'linux'
- 
diff --git a/package/firefox/patches/patch-media_webrtc_trunk_tools_gyp_pylib_gyp_generator_mozmake_py b/package/firefox/patches/patch-media_webrtc_trunk_tools_gyp_pylib_gyp_generator_mozmake_py
deleted file mode 100644
index 452d380f0..000000000
--- a/package/firefox/patches/patch-media_webrtc_trunk_tools_gyp_pylib_gyp_generator_mozmake_py
+++ /dev/null
@@ -1,26 +0,0 @@
---- mozilla-release.orig/media/webrtc/trunk/tools/gyp/pylib/gyp/generator/mozmake.py	2013-12-05 17:07:48.000000000 +0100
-+++ mozilla-release/media/webrtc/trunk/tools/gyp/pylib/gyp/generator/mozmake.py	2014-02-05 08:13:30.000000000 +0100
-@@ -118,23 +118,6 @@ def ensure_directory_exists(path):
- 
- def GetFlavor(params):
-   """Returns |params.flavor| if it's set, the system's default flavor else."""
--  system = platform.system().lower()
--  flavors = {
--    'microsoft': 'win',
--    'windows'  : 'win',
--    'cygwin'   : 'win',
--    'darwin'   : 'mac',
--    'sunos'    : 'solaris',
--    'dragonfly': 'dragonfly',
--    'freebsd'  : 'freebsd',
--    'netbsd'   : 'netbsd',
--    'openbsd'  : 'openbsd',
--  }
--
--  if 'flavor' in params:
--    return params['flavor']
--  if system in flavors:
--    return flavors[system]
- 
-   return 'linux'
- 
diff --git a/package/firefox/patches/patch-media_webrtc_trunk_webrtc_modules_audio_device_audio_device_impl_cc b/package/firefox/patches/patch-media_webrtc_trunk_webrtc_modules_audio_device_audio_device_impl_cc
deleted file mode 100644
index 0ef4e5714..000000000
--- a/package/firefox/patches/patch-media_webrtc_trunk_webrtc_modules_audio_device_audio_device_impl_cc
+++ /dev/null
@@ -1,11 +0,0 @@
---- mozilla-release.orig/media/webrtc/trunk/webrtc/modules/audio_device/audio_device_impl.cc	2013-09-11 01:15:17.000000000 +0200
-+++ mozilla-release/media/webrtc/trunk/webrtc/modules/audio_device/audio_device_impl.cc	2013-10-23 16:28:38.000000000 +0200
-@@ -8,6 +8,8 @@
-  *  be found in the AUTHORS file in the root of the source tree.
-  */
- 
-+#define _POSIX_SOURCE
-+
- #include "audio_device_impl.h"
- #include "audio_device_config.h"
- #include "common_audio/signal_processing/include/signal_processing_library.h"
diff --git a/package/firefox/patches/patch-media_webrtc_trunk_webrtc_modules_audio_device_linux_audio_device_alsa_linux_cc b/package/firefox/patches/patch-media_webrtc_trunk_webrtc_modules_audio_device_linux_audio_device_alsa_linux_cc
deleted file mode 100644
index a5fd50511..000000000
--- a/package/firefox/patches/patch-media_webrtc_trunk_webrtc_modules_audio_device_linux_audio_device_alsa_linux_cc
+++ /dev/null
@@ -1,11 +0,0 @@
---- mozilla-release.orig/media/webrtc/trunk/webrtc/modules/audio_device/linux/audio_device_alsa_linux.cc	2013-09-11 01:15:17.000000000 +0200
-+++ mozilla-release/media/webrtc/trunk/webrtc/modules/audio_device/linux/audio_device_alsa_linux.cc	2013-10-23 16:28:38.000000000 +0200
-@@ -8,6 +8,8 @@
-  *  be found in the AUTHORS file in the root of the source tree.
-  */
- 
-+#define _POSIX_SOURCE
-+
- #include <cassert>
- 
- #include "audio_device_utility.h"
diff --git a/package/firefox/patches/patch-media_webrtc_trunk_webrtc_modules_audio_device_linux_audio_mixer_manager_alsa_linux_cc b/package/firefox/patches/patch-media_webrtc_trunk_webrtc_modules_audio_device_linux_audio_mixer_manager_alsa_linux_cc
deleted file mode 100644
index 2544d6c08..000000000
--- a/package/firefox/patches/patch-media_webrtc_trunk_webrtc_modules_audio_device_linux_audio_mixer_manager_alsa_linux_cc
+++ /dev/null
@@ -1,11 +0,0 @@
---- mozilla-release.orig/media/webrtc/trunk/webrtc/modules/audio_device/linux/audio_mixer_manager_alsa_linux.cc	2013-09-11 01:15:17.000000000 +0200
-+++ mozilla-release/media/webrtc/trunk/webrtc/modules/audio_device/linux/audio_mixer_manager_alsa_linux.cc	2013-10-23 16:28:38.000000000 +0200
-@@ -8,6 +8,8 @@
-  *  be found in the AUTHORS file in the root of the source tree.
-  */
- 
-+#define _POSIX_SOURCE
-+
- #include <cassert>
- 
- #include "audio_mixer_manager_alsa_linux.h"
diff --git a/package/firefox/patches/patch-media_webrtc_trunk_webrtc_system_wrappers_source_cpu_info_cc b/package/firefox/patches/patch-media_webrtc_trunk_webrtc_system_wrappers_source_cpu_info_cc
deleted file mode 100644
index 5e066a88a..000000000
--- a/package/firefox/patches/patch-media_webrtc_trunk_webrtc_system_wrappers_source_cpu_info_cc
+++ /dev/null
@@ -1,23 +0,0 @@
---- mozilla-release.orig/media/webrtc/trunk/webrtc/system_wrappers/source/cpu_info.cc	2013-12-05 17:07:50.000000000 +0100
-+++ mozilla-release/media/webrtc/trunk/webrtc/system_wrappers/source/cpu_info.cc	2014-03-16 10:56:09.000000000 +0100
-@@ -36,11 +36,6 @@ uint32_t CpuInfo::DetectNumberOfCores()
-     WEBRTC_TRACE(kTraceStateInfo, kTraceUtility, -1,
-                  "Available number of cores:%d", number_of_cores_);
- 
--#elif defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) && !defined(WEBRTC_GONK)
--    number_of_cores_ = static_cast<uint32_t>(sysconf(_SC_NPROCESSORS_ONLN));
--    WEBRTC_TRACE(kTraceStateInfo, kTraceUtility, -1,
--                 "Available number of cores:%d", number_of_cores_);
--
- #elif defined(WEBRTC_BSD) || defined(WEBRTC_MAC)
-     int name[] = {
-       CTL_HW,
-@@ -61,8 +56,6 @@ uint32_t CpuInfo::DetectNumberOfCores()
-                    "Failed to get number of cores");
-       number_of_cores_ = 1;
-     }
--#elif defined(_SC_NPROCESSORS_ONLN)
--    number_of_cores_ = sysconf(_SC_NPROCESSORS_ONLN);
- #else
-     WEBRTC_TRACE(kTraceWarning, kTraceUtility, -1,
-                  "No function to get number of cores");
diff --git a/package/firefox/patches/patch-media_webrtc_trunk_webrtc_system_wrappers_source_spreadsortlib_spreadsort_hpp b/package/firefox/patches/patch-media_webrtc_trunk_webrtc_system_wrappers_source_spreadsortlib_spreadsort_hpp
deleted file mode 100644
index 95cfd56ba..000000000
--- a/package/firefox/patches/patch-media_webrtc_trunk_webrtc_system_wrappers_source_spreadsortlib_spreadsort_hpp
+++ /dev/null
@@ -1,3385 +0,0 @@
---- mozilla-release.orig/media/webrtc/trunk/webrtc/system_wrappers/source/spreadsortlib/spreadsort.hpp	2013-12-05 17:07:50.000000000 +0100
-+++ mozilla-release/media/webrtc/trunk/webrtc/system_wrappers/source/spreadsortlib/spreadsort.hpp	2014-02-05 09:52:11.000000000 +0100
-@@ -1,1688 +1,1694 @@
--//Templated spread_sort library
--
--//          Copyright Steven J. Ross 2001 - 2009.
--// Distributed under the Boost Software License, Version 1.0.
--//    (See accompanying file LICENSE_1_0.txt or copy at
--//          http://www.boost.org/LICENSE_1_0.txt)
--
--//  See http://www.boost.org/ for updates, documentation, and revision history.
--		  
--/*
--Some improvements suggested by:
--Phil Endecott and Frank Gennari
--Cygwin fix provided by:
--Scott McMurray
--*/
--
--#ifndef BOOST_SPREAD_SORT_H
--#define BOOST_SPREAD_SORT_H
--#include <algorithm>
--#include <cstring>
--#include <vector>
--#include "webrtc/system_wrappers/source/spreadsortlib/constants.hpp"
--
--namespace boost {
--  namespace detail {
--  	//This only works on unsigned data types
--  	template <typename T>
--  	inline unsigned 
--  	rough_log_2_size(const T& input) 
--  	{
--  		unsigned result = 0;
--  		//The && is necessary on some compilers to avoid infinite loops; it doesn't significantly impair performance
--  		while((input >> result) && (result < (8*sizeof(T)))) ++result;
--  		return result;
--  	}
--
--  	//Gets the maximum size which we'll call spread_sort on to control worst-case performance
--  	//Maintains both a minimum size to recurse and a check of distribution size versus count
--  	//This is called for a set of bins, instead of bin-by-bin, to avoid performance overhead
--  	inline size_t
--  	get_max_count(unsigned log_range, size_t count)
--  	{
--  		unsigned divisor = rough_log_2_size(count);
--  		//Making sure the divisor is positive
--  		if(divisor > LOG_MEAN_BIN_SIZE)
--  			divisor -= LOG_MEAN_BIN_SIZE;
--  		else
--  			divisor = 1;
--  		unsigned relative_width = (LOG_CONST * log_range)/((divisor > MAX_SPLITS) ? MAX_SPLITS : divisor);
--  		//Don't try to bitshift more than the size of an element
--  		if((8*sizeof(size_t)) <= relative_width)
--  			relative_width = (8*sizeof(size_t)) - 1;
--  		return (size_t)1 << ((relative_width < (LOG_MEAN_BIN_SIZE + LOG_MIN_SPLIT_COUNT)) ? 
--  			(LOG_MEAN_BIN_SIZE + LOG_MIN_SPLIT_COUNT) :  relative_width);
--  	}
--
--  	//Find the minimum and maximum using <
--  	template <class RandomAccessIter>
--  	inline void 
--  	find_extremes(RandomAccessIter current, RandomAccessIter last, RandomAccessIter & max, RandomAccessIter & min)
--  	{
--  		min = max = current;
--  		//Start from the second item, as max and min are initialized to the first
--  		while(++current < last) {
--  			if(*max < *current)
--  				max = current;
--  			else if(*current < *min)
--  				min = current;
--  		}
--  	}
--
--  	//Uses a user-defined comparison operator to find minimum and maximum
--  	template <class RandomAccessIter, class compare>
--  	inline void 
--  	find_extremes(RandomAccessIter current, RandomAccessIter last, RandomAccessIter & max, RandomAccessIter & min, compare comp)
--  	{
--  		min = max = current;
--  		while(++current < last) {
--  			if(comp(*max, *current))
--  				max = current;
--  			else if(comp(*current, *min))
--  				min = current;
--  		}
--  	}
--
--  	//Gets a non-negative right bit shift to operate as a logarithmic divisor
--  	inline int
--  	get_log_divisor(size_t count, unsigned log_range)
--  	{
--  		int log_divisor;
--  		//If we can finish in one iteration without exceeding either (2 to the MAX_SPLITS) or n bins, do so
--  		if((log_divisor = log_range - rough_log_2_size(count)) <= 0 && log_range < MAX_SPLITS)
--  			log_divisor = 0;
--  		else {
--  			//otherwise divide the data into an optimized number of pieces
--  			log_divisor += LOG_MEAN_BIN_SIZE;
--  			if(log_divisor < 0)
--  				log_divisor = 0;
--  			//Cannot exceed MAX_SPLITS or cache misses slow down bin lookups dramatically
--  			if((log_range - log_divisor) > MAX_SPLITS)
--  				log_divisor = log_range - MAX_SPLITS;
--  		}
--  		return log_divisor;
--  	}
--
--  	template <class RandomAccessIter>
--  	inline RandomAccessIter * 
--  	size_bins(std::vector<size_t> &bin_sizes, std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset, unsigned &cache_end, unsigned bin_count)
--  	{
--  		//Assure space for the size of each bin, followed by initializing sizes
--  		if(bin_count > bin_sizes.size())
--  			bin_sizes.resize(bin_count);
--  		for(size_t u = 0; u < bin_count; u++)
--  			bin_sizes[u] = 0;
--  		//Make sure there is space for the bins
--  		cache_end = cache_offset + bin_count;
--  		if(cache_end > bin_cache.size())
--  			bin_cache.resize(cache_end);
--  		return &(bin_cache[cache_offset]);
--  	}
--
--  	//Implementation for recursive integer sorting
--  	template <class RandomAccessIter, class div_type, class data_type>
--  	inline void 
--  	spread_sort_rec(RandomAccessIter first, RandomAccessIter last, std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
--  				  , std::vector<size_t> &bin_sizes)
--  	{
--  		//This step is roughly 10% of runtime, but it helps avoid worst-case behavior and improve behavior with real data
--  		//If you know the maximum and minimum ahead of time, you can pass those values in and skip this step for the first iteration
--  		RandomAccessIter max, min;
--  		find_extremes(first, last, max, min);
--  		//max and min will be the same (the first item) iff all values are equivalent
--  		if(max == min)
--  			return;
--  		RandomAccessIter * target_bin;
--  		unsigned log_divisor = get_log_divisor(last - first, rough_log_2_size((size_t)(*max >> 0) - (*min >> 0)));
--  		div_type div_min = *min >> log_divisor;
--  		div_type div_max = *max >> log_divisor;
--  		unsigned bin_count = div_max - div_min + 1;
--  		unsigned cache_end;
--  		RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, bin_count);
--  	
--  		//Calculating the size of each bin; this takes roughly 10% of runtime
--  		for (RandomAccessIter current = first; current != last;)
--  			bin_sizes[(*(current++) >> log_divisor) - div_min]++;
--  		//Assign the bin positions
--  		bins[0] = first;
--  		for(unsigned u = 0; u < bin_count - 1; u++)
--  			bins[u + 1] = bins[u] + bin_sizes[u];
--  
--  		//Swap into place
--  		//This dominates runtime, mostly in the swap and bin lookups
--  		RandomAccessIter nextbinstart = first;
--  		for(unsigned u = 0; u < bin_count - 1; ++u) {
--  			RandomAccessIter * local_bin = bins + u;
--  			nextbinstart += bin_sizes[u];
--  			//Iterating over each element in this bin
--  			for(RandomAccessIter current = *local_bin; current < nextbinstart; ++current) {
--  				//Swapping elements in current into place until the correct element has been swapped in
--  				for(target_bin = (bins + ((*current >> log_divisor) - div_min));  target_bin != local_bin; 
--  					target_bin = bins + ((*current >> log_divisor) - div_min)) {
--  					//3-way swap; this is about 1% faster than a 2-way swap with integers
--  					//The main advantage is less copies are involved per item put in the correct place
--  					data_type tmp;
--  					RandomAccessIter b = (*target_bin)++;
--  					RandomAccessIter * b_bin = bins + ((*b >> log_divisor) - div_min);
--  					if (b_bin != local_bin) {
--  						RandomAccessIter c = (*b_bin)++;
--  						tmp = *c;
--  						*c = *b;
--  					} 
--  					else
--  						tmp = *b;
--  					*b = *current;
--  					*current = tmp;
--  				}
--  			}
--  			*local_bin = nextbinstart;
--  		}
--  		bins[bin_count - 1] = last;
--  
--  		//If we've bucketsorted, the array is sorted and we should skip recursion
--  		if(!log_divisor)
--  			return;
--  
--  		//Recursing; log_divisor is the remaining range
--  		size_t max_count = get_max_count(log_divisor, last - first);
--  		RandomAccessIter lastPos = first;
--  		for(unsigned u = cache_offset; u < cache_end; lastPos = bin_cache[u], ++u) {
--  			size_t count = bin_cache[u] - lastPos;
--  			//don't sort unless there are at least two items to compare
--  			if(count < 2)
--  				continue;
--  			//using std::sort if its worst-case is better
--  			if(count < max_count)
--  				std::sort(lastPos, bin_cache[u]);
--  			else
--  				spread_sort_rec<RandomAccessIter, div_type, data_type>(lastPos, bin_cache[u], bin_cache, cache_end, bin_sizes);
--  		}
--  	}
--
--  	//Generic bitshift-based 3-way swapping code
--  	template <class RandomAccessIter, class div_type, class data_type, class right_shift>
--  	inline void inner_swap_loop(RandomAccessIter * bins, const RandomAccessIter & nextbinstart, unsigned ii, right_shift &shift
--  		, const unsigned log_divisor, const div_type div_min) 
--  	{
--  		RandomAccessIter * local_bin = bins + ii;
--  		for(RandomAccessIter current = *local_bin; current < nextbinstart; ++current) {
--  			for(RandomAccessIter * target_bin = (bins + (shift(*current, log_divisor) - div_min));  target_bin != local_bin; 
--  				target_bin = bins + (shift(*current, log_divisor) - div_min)) {
--  				data_type tmp;
--  				RandomAccessIter b = (*target_bin)++;
--  				RandomAccessIter * b_bin = bins + (shift(*b, log_divisor) - div_min);
--  				//Three-way swap; if the item to be swapped doesn't belong in the current bin, swap it to where it belongs
--  				if (b_bin != local_bin) {
--  					RandomAccessIter c = (*b_bin)++;
--  					tmp = *c;
--  					*c = *b;
--  				} 
--  				//Note: we could increment current once the swap is done in this case, but that seems to impair performance
--  				else
--  					tmp = *b;
--  				*b = *current;
--  				*current = tmp;
--  			}
--  		}
--  		*local_bin = nextbinstart;
--  	}
--
--  	//Standard swapping wrapper for ascending values
--  	template <class RandomAccessIter, class div_type, class data_type, class right_shift>
--  	inline void swap_loop(RandomAccessIter * bins, RandomAccessIter & nextbinstart, unsigned ii, right_shift &shift
--  		, const std::vector<size_t> &bin_sizes, const unsigned log_divisor, const div_type div_min) 
--  	{
--  		nextbinstart += bin_sizes[ii];
--  		inner_swap_loop<RandomAccessIter, div_type, data_type, right_shift>(bins, nextbinstart, ii, shift, log_divisor, div_min);
--  	}
--
--  	//Functor implementation for recursive sorting
--  	template <class RandomAccessIter, class div_type, class data_type, class right_shift, class compare>
--  	inline void 
--  	spread_sort_rec(RandomAccessIter first, RandomAccessIter last, std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
--  					, std::vector<size_t> &bin_sizes, right_shift shift, compare comp)
--  	{
--  		RandomAccessIter max, min;
--  		find_extremes(first, last, max, min, comp);
--  		if(max == min)
--  			return;
--  		unsigned log_divisor = get_log_divisor(last - first, rough_log_2_size((size_t)(shift(*max, 0)) - (shift(*min, 0))));
--  		div_type div_min = shift(*min, log_divisor);
--  		div_type div_max = shift(*max, log_divisor);
--  		unsigned bin_count = div_max - div_min + 1;
--  		unsigned cache_end;
--  		RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, bin_count);
--  			
--  		//Calculating the size of each bin
--  		for (RandomAccessIter current = first; current != last;)
--  			bin_sizes[shift(*(current++), log_divisor) - div_min]++;
--  		bins[0] = first;
--  		for(unsigned u = 0; u < bin_count - 1; u++)
--  			bins[u + 1] = bins[u] + bin_sizes[u];
--  		
--  		//Swap into place
--  		RandomAccessIter nextbinstart = first;
--  		for(unsigned u = 0; u < bin_count - 1; ++u)
--  			swap_loop<RandomAccessIter, div_type, data_type, right_shift>(bins, nextbinstart, u, shift, bin_sizes, log_divisor, div_min);
--  		bins[bin_count - 1] = last;
--  		
--  		//If we've bucketsorted, the array is sorted and we should skip recursion
--  		if(!log_divisor)
--  			return;
--  		
--  		//Recursing
--  		size_t max_count = get_max_count(log_divisor, last - first);
--  		RandomAccessIter lastPos = first;
--  		for(unsigned u = cache_offset; u < cache_end; lastPos = bin_cache[u], ++u) {
--  			size_t count = bin_cache[u] - lastPos;
--  			if(count < 2)
--  				continue;
--  			if(count < max_count)
--  				std::sort(lastPos, bin_cache[u], comp);
--  			else
--  				spread_sort_rec<RandomAccessIter, div_type, data_type, right_shift, compare>(lastPos, bin_cache[u], bin_cache, cache_end, bin_sizes, shift, comp);
--  		}
--  	}
--
--  	//Functor implementation for recursive sorting with only Shift overridden
--  	template <class RandomAccessIter, class div_type, class data_type, class right_shift>
--  	inline void 
--  	spread_sort_rec(RandomAccessIter first, RandomAccessIter last, std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
--  					, std::vector<size_t> &bin_sizes, right_shift shift)
--  	{
--  		RandomAccessIter max, min;
--  		find_extremes(first, last, max, min);
--  		if(max == min)
--  			return;
--  		unsigned log_divisor = get_log_divisor(last - first, rough_log_2_size((size_t)(shift(*max, 0)) - (shift(*min, 0))));
--  		div_type div_min = shift(*min, log_divisor);
--  		div_type div_max = shift(*max, log_divisor);
--  		unsigned bin_count = div_max - div_min + 1;
--  		unsigned cache_end;
--  		RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, bin_count);
--  			
--  		//Calculating the size of each bin
--  		for (RandomAccessIter current = first; current != last;)
--  			bin_sizes[shift(*(current++), log_divisor) - div_min]++;
--  		bins[0] = first;
--  		for(unsigned u = 0; u < bin_count - 1; u++)
--  			bins[u + 1] = bins[u] + bin_sizes[u];
--  		
--  		//Swap into place
--  		RandomAccessIter nextbinstart = first;
--  		for(unsigned ii = 0; ii < bin_count - 1; ++ii)
--  			swap_loop<RandomAccessIter, div_type, data_type, right_shift>(bins, nextbinstart, ii, shift, bin_sizes, log_divisor, div_min);
--  		bins[bin_count - 1] = last;
--  		
--  		//If we've bucketsorted, the array is sorted and we should skip recursion
--  		if(!log_divisor)
--  			return;
--  		
--  		//Recursing
--  		size_t max_count = get_max_count(log_divisor, last - first);
--  		RandomAccessIter lastPos = first;
--  		for(unsigned u = cache_offset; u < cache_end; lastPos = bin_cache[u], ++u) {
--  			size_t count = bin_cache[u] - lastPos;
--  			if(count < 2)
--  				continue;
--  			if(count < max_count)
--  				std::sort(lastPos, bin_cache[u]);
--  			else
--  				spread_sort_rec<RandomAccessIter, div_type, data_type, right_shift>(lastPos, bin_cache[u], bin_cache, cache_end, bin_sizes, shift);
--  		}
--  	}
--
--  	//Holds the bin vector and makes the initial recursive call
--  	template <class RandomAccessIter, class div_type, class data_type>
--  	inline void 
--  	spread_sort(RandomAccessIter first, RandomAccessIter last, div_type, data_type)
--  	{
--  		std::vector<size_t> bin_sizes;
--  		std::vector<RandomAccessIter> bin_cache;
--  		spread_sort_rec<RandomAccessIter, div_type, data_type>(first, last, bin_cache, 0, bin_sizes);
--  	}
--
--  	template <class RandomAccessIter, class div_type, class data_type, class right_shift, class compare>
--  	inline void 
--  	spread_sort(RandomAccessIter first, RandomAccessIter last, div_type, data_type, right_shift shift, compare comp)
--  	{
--  		std::vector<size_t> bin_sizes;
--  		std::vector<RandomAccessIter> bin_cache;
--  		spread_sort_rec<RandomAccessIter, div_type, data_type, right_shift, compare>(first, last, bin_cache, 0, bin_sizes, shift, comp);
--  	}
--
--  	template <class RandomAccessIter, class div_type, class data_type, class right_shift>
--  	inline void 
--  	spread_sort(RandomAccessIter first, RandomAccessIter last, div_type, data_type, right_shift shift)
--  	{
--  		std::vector<size_t> bin_sizes;
--  		std::vector<RandomAccessIter> bin_cache;
--  		spread_sort_rec<RandomAccessIter, div_type, data_type, right_shift>(first, last, bin_cache, 0, bin_sizes, shift);
--  	}
--  }
--
--  //Top-level sorting call for integers
--  template <class RandomAccessIter>
--  inline void integer_sort(RandomAccessIter first, RandomAccessIter last) 
--  {
--  	//Don't sort if it's too small to optimize
--  	if(last - first < detail::MIN_SORT_SIZE)
--  		std::sort(first, last);
--  	else
--  		detail::spread_sort(first, last, *first >> 0, *first);
--  }
--
--  //integer_sort with functors
--  template <class RandomAccessIter, class right_shift, class compare>
--  inline void integer_sort(RandomAccessIter first, RandomAccessIter last,
--  						right_shift shift, compare comp) {
--  	if(last - first < detail::MIN_SORT_SIZE)
--  		std::sort(first, last, comp);
--  	else
--  		detail::spread_sort(first, last, shift(*first, 0), *first, shift, comp);
--  }
--
--  //integer_sort with right_shift functor
--  template <class RandomAccessIter, class right_shift>
--  inline void integer_sort(RandomAccessIter first, RandomAccessIter last,
--  						right_shift shift) {
--  	if(last - first < detail::MIN_SORT_SIZE)
--  		std::sort(first, last);
--  	else
--  		detail::spread_sort(first, last, shift(*first, 0), *first, shift);
--  }
--
--  //------------------------------------------------------ float_sort source --------------------------------------
--  //Casts a RandomAccessIter to the specified data type
--  template<class cast_type, class RandomAccessIter>
--  inline cast_type
--  cast_float_iter(const RandomAccessIter & floatiter)
--  {
--  	cast_type result;
--  	std::memcpy(&result, &(*floatiter), sizeof(cast_type));
--  	return result;
--  }
--
--  //Casts a data element to the specified datinner_float_a type
--  template<class data_type, class cast_type>
--  inline cast_type
--  mem_cast(const data_type & data)
--  {
--  	cast_type result;
--  	std::memcpy(&result, &data, sizeof(cast_type));
--  	return result;
--  }
--
--  namespace detail {
--  	template <class RandomAccessIter, class div_type, class right_shift>
--  	inline void 
--  	find_extremes(RandomAccessIter current, RandomAccessIter last, div_type & max, div_type & min, right_shift shift)
--  	{
--  		min = max = shift(*current, 0);
--  		while(++current < last) {
--  			div_type value = shift(*current, 0);
--  			if(max < value)
--  				max = value;
--  			else if(value < min)
--  				min = value;
--  		}
--  	}
--
--  	//Specialized swap loops for floating-point casting
--  	template <class RandomAccessIter, class div_type, class data_type>
--  	inline void inner_float_swap_loop(RandomAccessIter * bins, const RandomAccessIter & nextbinstart, unsigned ii
--  		, const unsigned log_divisor, const div_type div_min) 
--  	{
--  		RandomAccessIter * local_bin = bins + ii;
--  		for(RandomAccessIter current = *local_bin; current < nextbinstart; ++current) {
--  			for(RandomAccessIter * target_bin = (bins + ((cast_float_iter<div_type, RandomAccessIter>(current) >> log_divisor) - div_min));  target_bin != local_bin; 
--  				target_bin = bins + ((cast_float_iter<div_type, RandomAccessIter>(current) >> log_divisor) - div_min)) {
--  				data_type tmp;
--  				RandomAccessIter b = (*target_bin)++;
--  				RandomAccessIter * b_bin = bins + ((cast_float_iter<div_type, RandomAccessIter>(b) >> log_divisor) - div_min);
--  				//Three-way swap; if the item to be swapped doesn't belong in the current bin, swap it to where it belongs
--  				if (b_bin != local_bin) {
--  					RandomAccessIter c = (*b_bin)++;
--  					tmp = *c;
--  					*c = *b;
--  				} 
--  				else
--  					tmp = *b;
--  				*b = *current;
--  				*current = tmp;
--  			}
--  		}
--  		*local_bin = nextbinstart;
--  	}
--
--  	template <class RandomAccessIter, class div_type, class data_type>
--  	inline void float_swap_loop(RandomAccessIter * bins, RandomAccessIter & nextbinstart, unsigned ii
--  		, const std::vector<size_t> &bin_sizes, const unsigned log_divisor, const div_type div_min) 
--  	{
--  		nextbinstart += bin_sizes[ii];
--  		inner_float_swap_loop<RandomAccessIter, div_type, data_type>(bins, nextbinstart, ii, log_divisor, div_min);
--  	}
--
--  	template <class RandomAccessIter, class cast_type>
--  	inline void 
--  	find_extremes(RandomAccessIter current, RandomAccessIter last, cast_type & max, cast_type & min)
--  	{
--  		min = max = cast_float_iter<cast_type, RandomAccessIter>(current);
--  		while(++current < last) {
--  			cast_type value = cast_float_iter<cast_type, RandomAccessIter>(current);
--  			if(max < value)
--  				max = value;
--  			else if(value < min)
--  				min = value;
--  		}
--  	}
--
--  	//Special-case sorting of positive floats with casting instead of a right_shift
--  	template <class RandomAccessIter, class div_type, class data_type>
--  	inline void 
--  	positive_float_sort_rec(RandomAccessIter first, RandomAccessIter last, std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
--  					, std::vector<size_t> &bin_sizes)
--  	{
--  		div_type max, min;
--  		find_extremes(first, last, max, min);
--  		if(max == min)
--  			return;
--  		unsigned log_divisor = get_log_divisor(last - first, rough_log_2_size((size_t)(max) - min));
--  		div_type div_min = min >> log_divisor;
--  		div_type div_max = max >> log_divisor;
--  		unsigned bin_count = div_max - div_min + 1;
--  		unsigned cache_end;
--  		RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, bin_count);
--  			
--  		//Calculating the size of each bin
--  		for (RandomAccessIter current = first; current != last;)
--  			bin_sizes[(cast_float_iter<div_type, RandomAccessIter>(current++) >> log_divisor) - div_min]++;
--  		bins[0] = first;
--  		for(unsigned u = 0; u < bin_count - 1; u++)
--  			bins[u + 1] = bins[u] + bin_sizes[u];
--  		
--  		//Swap into place
--  		RandomAccessIter nextbinstart = first;
--  		for(unsigned u = 0; u < bin_count - 1; ++u)
--  			float_swap_loop<RandomAccessIter, div_type, data_type>(bins, nextbinstart, u, bin_sizes, log_divisor, div_min);
--  		bins[bin_count - 1] = last;
--  		
--  		//Return if we've completed bucketsorting
--  		if(!log_divisor)
--  			return;
--  		
--  		//Recursing
--  		size_t max_count = get_max_count(log_divisor, last - first);
--  		RandomAccessIter lastPos = first;
--  		for(unsigned u = cache_offset; u < cache_end; lastPos = bin_cache[u], ++u) {
--  			size_t count = bin_cache[u] - lastPos;
--  			if(count < 2)
--  				continue;
--  			if(count < max_count)
--  				std::sort(lastPos, bin_cache[u]);
--  			else
--  				positive_float_sort_rec<RandomAccessIter, div_type, data_type>(lastPos, bin_cache[u], bin_cache, cache_end, bin_sizes);
--  		}
--  	}
--
--  	//Sorting negative_ float_s
--  	//Note that bins are iterated in reverse order because max_neg_float = min_neg_int
--  	template <class RandomAccessIter, class div_type, class data_type>
--  	inline void 
--  	negative_float_sort_rec(RandomAccessIter first, RandomAccessIter last, std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
--  					, std::vector<size_t> &bin_sizes)
--  	{
--  		div_type max, min;
--  		find_extremes(first, last, max, min);
--  		if(max == min)
--  			return;
--  		unsigned log_divisor = get_log_divisor(last - first, rough_log_2_size((size_t)(max) - min));
--  		div_type div_min = min >> log_divisor;
--  		div_type div_max = max >> log_divisor;
--  		unsigned bin_count = div_max - div_min + 1;
--  		unsigned cache_end;
--  		RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, bin_count);
--  			
--  		//Calculating the size of each bin
--  		for (RandomAccessIter current = first; current != last;)
--  			bin_sizes[(cast_float_iter<div_type, RandomAccessIter>(current++) >> log_divisor) - div_min]++;
--  		bins[bin_count - 1] = first;
--  		for(int ii = bin_count - 2; ii >= 0; --ii)
--  			bins[ii] = bins[ii + 1] + bin_sizes[ii + 1];
--  		
--  		//Swap into place
--  		RandomAccessIter nextbinstart = first;
--  		//The last bin will always have the correct elements in it
--  		for(int ii = bin_count - 1; ii > 0; --ii)
--  			float_swap_loop<RandomAccessIter, div_type, data_type>(bins, nextbinstart, ii, bin_sizes, log_divisor, div_min);
--  		//Since we don't process the last bin, we need to update its end position
--  		bin_cache[cache_offset] = last;
--  		
--  		//Return if we've completed bucketsorting
--  		if(!log_divisor)
--  			return;
--  		
--  		//Recursing
--  		size_t max_count = get_max_count(log_divisor, last - first);
--  		RandomAccessIter lastPos = first;
--  		for(int ii = cache_end - 1; ii >= (int)cache_offset; lastPos = bin_cache[ii], --ii) {
--  			size_t count = bin_cache[ii] - lastPos;
--  			if(count < 2)
--  				continue;
--  			if(count < max_count)
--  				std::sort(lastPos, bin_cache[ii]);
--  			else
--  				negative_float_sort_rec<RandomAccessIter, div_type, data_type>(lastPos, bin_cache[ii], bin_cache, cache_end, bin_sizes);
--  		}
--  	}
--
--  	//Sorting negative_ float_s
--  	//Note that bins are iterated in reverse order because max_neg_float = min_neg_int
--  	template <class RandomAccessIter, class div_type, class data_type, class right_shift>
--  	inline void 
--  	negative_float_sort_rec(RandomAccessIter first, RandomAccessIter last, std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
--  					, std::vector<size_t> &bin_sizes, right_shift shift)
--  	{
--  		div_type max, min;
--  		find_extremes(first, last, max, min, shift);
--  		if(max == min)
--  			return;
--  		unsigned log_divisor = get_log_divisor(last - first, rough_log_2_size((size_t)(max) - min));
--  		div_type div_min = min >> log_divisor;
--  		div_type div_max = max >> log_divisor;
--  		unsigned bin_count = div_max - div_min + 1;
--  		unsigned cache_end;
--  		RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, bin_count);
--  			
--  		//Calculating the size of each bin
--  		for (RandomAccessIter current = first; current != last;)
--  			bin_sizes[shift(*(current++), log_divisor) - div_min]++;
--  		bins[bin_count - 1] = first;
--  		for(int ii = bin_count - 2; ii >= 0; --ii)
--  			bins[ii] = bins[ii + 1] + bin_sizes[ii + 1];
--  		
--  		//Swap into place
--  		RandomAccessIter nextbinstart = first;
--  		//The last bin will always have the correct elements in it
--  		for(int ii = bin_count - 1; ii > 0; --ii)
--  			swap_loop<RandomAccessIter, div_type, data_type, right_shift>(bins, nextbinstart, ii, shift, bin_sizes, log_divisor, div_min);
--  		//Since we don't process the last bin, we need to update its end position
--  		bin_cache[cache_offset] = last;
--  		
--  		//Return if we've completed bucketsorting
--  		if(!log_divisor)
--  			return;
--  		
--  		//Recursing
--  		size_t max_count = get_max_count(log_divisor, last - first);
--  		RandomAccessIter lastPos = first;
--  		for(int ii = cache_end - 1; ii >= (int)cache_offset; lastPos = bin_cache[ii], --ii) {
--  			size_t count = bin_cache[ii] - lastPos;
--  			if(count < 2)
--  				continue;
--  			if(count < max_count)
--  				std::sort(lastPos, bin_cache[ii]);
--  			else
--  				negative_float_sort_rec<RandomAccessIter, div_type, data_type, right_shift>(lastPos, bin_cache[ii], bin_cache, cache_end, bin_sizes, shift);
--  		}
--  	}
--
--  	template <class RandomAccessIter, class div_type, class data_type, class right_shift, class compare>
--  	inline void 
--  	negative_float_sort_rec(RandomAccessIter first, RandomAccessIter last, std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
--  					, std::vector<size_t> &bin_sizes, right_shift shift, compare comp)
--  	{
--  		div_type max, min;
--  		find_extremes(first, last, max, min, shift);
--  		if(max == min)
--  			return;
--  		unsigned log_divisor = get_log_divisor(last - first, rough_log_2_size((size_t)(max) - min));
--  		div_type div_min = min >> log_divisor;
--  		div_type div_max = max >> log_divisor;
--  		unsigned bin_count = div_max - div_min + 1;
--  		unsigned cache_end;
--  		RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, bin_count);
--  			
--  		//Calculating the size of each bin
--  		for (RandomAccessIter current = first; current != last;)
--  			bin_sizes[shift(*(current++), log_divisor) - div_min]++;
--  		bins[bin_count - 1] = first;
--  		for(int ii = bin_count - 2; ii >= 0; --ii)
--  			bins[ii] = bins[ii + 1] + bin_sizes[ii + 1];
--  		
--  		//Swap into place
--  		RandomAccessIter nextbinstart = first;
--  		//The last bin will always have the correct elements in it
--  		for(int ii = bin_count - 1; ii > 0; --ii)
--  			swap_loop<RandomAccessIter, div_type, data_type, right_shift>(bins, nextbinstart, ii, shift, bin_sizes, log_divisor, div_min);
--  		//Since we don't process the last bin, we need to update its end position
--  		bin_cache[cache_offset] = last;
--  		
--  		//Return if we've completed bucketsorting
--  		if(!log_divisor)
--  			return;
--  		
--  		//Recursing
--  		size_t max_count = get_max_count(log_divisor, last - first);
--  		RandomAccessIter lastPos = first;
--  		for(int ii = cache_end - 1; ii >= (int)cache_offset; lastPos = bin_cache[ii], --ii) {
--  			size_t count = bin_cache[ii] - lastPos;
--  			if(count < 2)
--  				continue;
--  			if(count < max_count)
--  				std::sort(lastPos, bin_cache[ii], comp);
--  			else
--  				negative_float_sort_rec<RandomAccessIter, div_type, data_type, right_shift, compare>(lastPos, bin_cache[ii], bin_cache, cache_end, bin_sizes, shift, comp);
--  		}
--  	}
--
--  	//Casting special-case for floating-point sorting
--  	template <class RandomAccessIter, class div_type, class data_type>
--  	inline void 
--  	float_sort_rec(RandomAccessIter first, RandomAccessIter last, std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
--  					, std::vector<size_t> &bin_sizes)
--  	{
--  		div_type max, min;
--  		find_extremes(first, last, max, min);
--  		if(max == min)
--  			return;
--  		unsigned log_divisor = get_log_divisor(last - first, rough_log_2_size((size_t)(max) - min));
--  		div_type div_min = min >> log_divisor;
--  		div_type div_max = max >> log_divisor;
--  		unsigned bin_count = div_max - div_min + 1;
--  		unsigned cache_end;
--  		RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, bin_count);
--  			
--  		//Calculating the size of each bin
--  		for (RandomAccessIter current = first; current != last;)
--  			bin_sizes[(cast_float_iter<div_type, RandomAccessIter>(current++) >> log_divisor) - div_min]++;
--  		//The index of the first positive bin
--  		div_type first_positive = (div_min < 0) ? -div_min : 0;
--  		//Resetting if all bins are negative
--  		if(cache_offset + first_positive > cache_end)
--  			first_positive = cache_end - cache_offset;
--  		//Reversing the order of the negative bins
--  		//Note that because of the negative/positive ordering direction flip
--  		//We can not depend upon bin order and positions matching up
--  		//so bin_sizes must be reused to contain the end of the bin
--  		if(first_positive > 0) {
--  			bins[first_positive - 1] = first;
--  			for(int ii = first_positive - 2; ii >= 0; --ii) {
--  				bins[ii] = first + bin_sizes[ii + 1];
--  				bin_sizes[ii] += bin_sizes[ii + 1];
--  			}
--  			//Handling positives following negatives
--  			if((unsigned)first_positive < bin_count) {
--  				bins[first_positive] = first + bin_sizes[0];
--  				bin_sizes[first_positive] += bin_sizes[0];
--  			}
--  		}
--  		else
--  			bins[0] = first;
--  		for(unsigned u = first_positive; u < bin_count - 1; u++) {
--  			bins[u + 1] = first + bin_sizes[u];
--  			bin_sizes[u + 1] += bin_sizes[u];
--  		}
--  		
--  		//Swap into place
--  		RandomAccessIter nextbinstart = first;
--  		for(unsigned u = 0; u < bin_count; ++u) {
--  			nextbinstart = first + bin_sizes[u];
--  			inner_float_swap_loop<RandomAccessIter, div_type, data_type>(bins, nextbinstart, u, log_divisor, div_min);
--  		}
--  		
--  		if(!log_divisor)
--  			return;
--  		
--  		//Handling negative values first
--  		size_t max_count = get_max_count(log_divisor, last - first);
--  		RandomAccessIter lastPos = first;
--  		for(int ii = cache_offset + first_positive - 1; ii >= (int)cache_offset ; lastPos = bin_cache[ii--]) {
--  			size_t count = bin_cache[ii] - lastPos;
--  			if(count < 2)
--  				continue;
--  			if(count < max_count)
--  				std::sort(lastPos, bin_cache[ii]);
--  			//sort negative values using reversed-bin spread_sort
--  			else
--  				negative_float_sort_rec<RandomAccessIter, div_type, data_type>(lastPos, bin_cache[ii], bin_cache, cache_end, bin_sizes);
--  		}
--  		
--  		for(unsigned u = cache_offset + first_positive; u < cache_end; lastPos = bin_cache[u], ++u) {
--  			size_t count = bin_cache[u] - lastPos;
--  			if(count < 2)
--  				continue;
--  			if(count < max_count)
--  				std::sort(lastPos, bin_cache[u]);
--  			//sort positive values using normal spread_sort
--  			else
--  				positive_float_sort_rec<RandomAccessIter, div_type, data_type>(lastPos, bin_cache[u], bin_cache, cache_end, bin_sizes);
--  		}
--  	}
--
--  	//Functor implementation for recursive sorting
--  	template <class RandomAccessIter, class div_type, class data_type, class right_shift>
--  	inline void 
--  	float_sort_rec(RandomAccessIter first, RandomAccessIter last, std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
--  					, std::vector<size_t> &bin_sizes, right_shift shift)
--  	{
--  		div_type max, min;
--  		find_extremes(first, last, max, min, shift);
--  		if(max == min)
--  			return;
--  		unsigned log_divisor = get_log_divisor(last - first, rough_log_2_size((size_t)(max) - min));
--  		div_type div_min = min >> log_divisor;
--  		div_type div_max = max >> log_divisor;
--  		unsigned bin_count = div_max - div_min + 1;
--  		unsigned cache_end;
--  		RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, bin_count);
--  			
--  		//Calculating the size of each bin
--  		for (RandomAccessIter current = first; current != last;)
--  			bin_sizes[shift(*(current++), log_divisor) - div_min]++;
--  		//The index of the first positive bin
--  		div_type first_positive = (div_min < 0) ? -div_min : 0;
--  		//Resetting if all bins are negative
--  		if(cache_offset + first_positive > cache_end)
--  			first_positive = cache_end - cache_offset;
--  		//Reversing the order of the negative bins
--  		//Note that because of the negative/positive ordering direction flip
--  		//We can not depend upon bin order and positions matching up
--  		//so bin_sizes must be reused to contain the end of the bin
--  		if(first_positive > 0) {
--  			bins[first_positive - 1] = first;
--  			for(int ii = first_positive - 2; ii >= 0; --ii) {
--  				bins[ii] = first + bin_sizes[ii + 1];
--  				bin_sizes[ii] += bin_sizes[ii + 1];
--  			}
--  			//Handling positives following negatives
--  			if((unsigned)first_positive < bin_count) {
--  				bins[first_positive] = first + bin_sizes[0];
--  				bin_sizes[first_positive] += bin_sizes[0];
--  			}
--  		}
--  		else
--  			bins[0] = first;
--  		for(unsigned u = first_positive; u < bin_count - 1; u++) {
--  			bins[u + 1] = first + bin_sizes[u];
--  			bin_sizes[u + 1] += bin_sizes[u];
--  		}
--  		
--  		//Swap into place
--  		RandomAccessIter nextbinstart = first;
--  		for(unsigned u = 0; u < bin_count; ++u) {
--  			nextbinstart = first + bin_sizes[u];
--  			inner_swap_loop<RandomAccessIter, div_type, data_type, right_shift>(bins, nextbinstart, u, shift, log_divisor, div_min);
--  		}
--  		
--  		//Return if we've completed bucketsorting
--  		if(!log_divisor)
--  			return;
--  		
--  		//Handling negative values first
--  		size_t max_count = get_max_count(log_divisor, last - first);
--  		RandomAccessIter lastPos = first;
--  		for(int ii = cache_offset + first_positive - 1; ii >= (int)cache_offset ; lastPos = bin_cache[ii--]) {
--  			size_t count = bin_cache[ii] - lastPos;
--  			if(count < 2)
--  				continue;
--  			if(count < max_count)
--  				std::sort(lastPos, bin_cache[ii]);
--  			//sort negative values using reversed-bin spread_sort
--  			else
--  				negative_float_sort_rec<RandomAccessIter, div_type, data_type, right_shift>(lastPos, bin_cache[ii], bin_cache, cache_end, bin_sizes, shift);
--  		}
--  		
--  		for(unsigned u = cache_offset + first_positive; u < cache_end; lastPos = bin_cache[u], ++u) {
--  			size_t count = bin_cache[u] - lastPos;
--  			if(count < 2)
--  				continue;
--  			if(count < max_count)
--  				std::sort(lastPos, bin_cache[u]);
--  			//sort positive values using normal spread_sort
--  			else
--  				spread_sort_rec<RandomAccessIter, div_type, data_type, right_shift>(lastPos, bin_cache[u], bin_cache, cache_end, bin_sizes, shift);
--  		}
--  	}
--
--  	template <class RandomAccessIter, class div_type, class data_type, class right_shift, class compare>
--  	inline void 
--  	float_sort_rec(RandomAccessIter first, RandomAccessIter last, std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
--  					, std::vector<size_t> &bin_sizes, right_shift shift, compare comp)
--  	{
--  		div_type max, min;
--  		find_extremes(first, last, max, min, shift);
--  		if(max == min)
--  			return;
--  		unsigned log_divisor = get_log_divisor(last - first, rough_log_2_size((size_t)(max) - min));
--  		div_type div_min = min >> log_divisor;
--  		div_type div_max = max >> log_divisor;
--  		unsigned bin_count = div_max - div_min + 1;
--  		unsigned cache_end;
--  		RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, bin_count);
--  			
--  		//Calculating the size of each bin
--  		for (RandomAccessIter current = first; current != last;)
--  			bin_sizes[shift(*(current++), log_divisor) - div_min]++;
--  		//The index of the first positive bin
--  		div_type first_positive = (div_min < 0) ? -div_min : 0;
--  		//Resetting if all bins are negative
--  		if(cache_offset + first_positive > cache_end)
--  			first_positive = cache_end - cache_offset;
--  		//Reversing the order of the negative bins
--  		//Note that because of the negative/positive ordering direction flip
--  		//We can not depend upon bin order and positions matching up
--  		//so bin_sizes must be reused to contain the end of the bin
--  		if(first_positive > 0) {
--  			bins[first_positive - 1] = first;
--  			for(int ii = first_positive - 2; ii >= 0; --ii) {
--  				bins[ii] = first + bin_sizes[ii + 1];
--  				bin_sizes[ii] += bin_sizes[ii + 1];
--  			}
--  			//Handling positives following negatives
--  			if((unsigned)first_positive < bin_count) {
--  				bins[first_positive] = first + bin_sizes[0];
--  				bin_sizes[first_positive] += bin_sizes[0];
--  			}
--  		}
--  		else
--  			bins[0] = first;
--  		for(unsigned u = first_positive; u < bin_count - 1; u++) {
--  			bins[u + 1] = first + bin_sizes[u];
--  			bin_sizes[u + 1] += bin_sizes[u];
--  		}
--  		
--  		//Swap into place
--  		RandomAccessIter nextbinstart = first;
--  		for(unsigned u = 0; u < bin_count; ++u) {
--  			nextbinstart = first + bin_sizes[u];
--  			inner_swap_loop<RandomAccessIter, div_type, data_type, right_shift>(bins, nextbinstart, u, shift, log_divisor, div_min);
--  		}
--  		
--  		//Return if we've completed bucketsorting
--  		if(!log_divisor)
--  			return;
--  		
--  		//Handling negative values first
--  		size_t max_count = get_max_count(log_divisor, last - first);
--  		RandomAccessIter lastPos = first;
--  		for(int ii = cache_offset + first_positive - 1; ii >= (int)cache_offset ; lastPos = bin_cache[ii--]) {
--  			size_t count = bin_cache[ii] - lastPos;
--  			if(count < 2)
--  				continue;
--  			if(count < max_count)
--  				std::sort(lastPos, bin_cache[ii]);
--  			//sort negative values using reversed-bin spread_sort
--  			else
--  				negative_float_sort_rec<Rand