                              int partition_offsets[],
                              gdf_hash_func hash)
 {
+  // Use int until gdf API is updated to use something other than int
+  // for ordinal variables
+  using size_type = int;
 
   // Ensure all the inputs are non-zero and not null
   if((0 == num_input_cols) 

}


template <typename size_type>
void partition_gdf_table(gdf_table<size_type> const & input_table,
                         gdf_table<size_type> & partitioned_output,
                         const size_type num_partitions)
{

}

      return GDF_COLUMN_SIZE_MISMATCH;
  }

  // Wrap input and output columns in gdf_table
  std::unique_ptr< const gdf_table<size_type> > input_table{new gdf_table<size_type>(num_input_cols, input)};
  std::unique_ptr< gdf_table<size_type> > output_table{new gdf_table<size_type>(num_input_cols, partitioned_output)};

  // Create vector of pointers to columns that will be hashed
  std::vector<gdf_column *> gdf_columns_to_hash(num_cols_to_hash);
  for(size_type i = 0; i < num_cols_to_hash; ++i)
  {
    gdf_columns_to_hash[i] = input[columns_to_hash[i]];
  }
  // Create a separate table of the columns to be hashed
  std::unique_ptr< const gdf_table<size_type> > table_to_hash {new gdf_table<size_type>(num_cols_to_hash, 
                                                                                        gdf_columns_to_hash.data())};
  switch(hash)
  {
    case GDF_HASH_MURMUR3:
      {
        hash_partition_gdf_table<MurmurHash3_32>(*input_table, 
                                                 *table_to_hash,
                                                 num_partitions,
                                                 partition_offsets,
                                                 *output_table);
        break;
      }
    default:
