      *   contains the input data to be sorted).
      * - The contents of both buffers within each pair may be altered by the sorting
      *   operation.
+     * - In-place operations are not supported. There must be no overlap between
+     *   any of the provided ranges:
+     *   - `[d_keys.Current(),     d_keys.Current()     + num_items)`
+     *   - `[d_keys.Alternate(),   d_keys.Alternate()   + num_items)`
+     *   - `[d_values.Current(),   d_values.Current()   + num_items)`
+     *   - `[d_values.Alternate(), d_values.Alternate() + num_items)`
      * - Upon completion, the sorting operation will update the "current" indicator
      *   within each DoubleBuffer wrapper to reference which of the two buffers
      *   now contains the sorted output sequence (a function of the number of key bits

        // Signed integer type for global offsets
        typedef int OffsetT;

        return DispatchRadixSort<false, KeyT, ValueT, OffsetT>::Dispatch(
            d_temp_storage,
            temp_storage_bytes,

        // Signed integer type for global offsets
        typedef int OffsetT;

        // We cast away const-ness, but will *not* write to these arrays.
        // `DispatchRadixSort::Dispatch` will allocate temporary storage and
        // create a new double-buffer internally when the `is_overwrite_ok` flag
        // is not set.
        constexpr bool is_overwrite_okay = false;
        DoubleBuffer<KeyT>       d_keys(const_cast<KeyT*>(d_keys_in), d_keys_out);
        DoubleBuffer<ValueT>     d_values(const_cast<ValueT*>(d_values_in), d_values_out);

