 
 // Creates a gdf_column from a std::vector
 template <typename col_type>
-gdf_column create_gdf_column(std::vector<col_type> const & host_vector)
+std::unique_ptr<gdf_column> create_gdf_column(std::vector<col_type> const & host_vector)
 {
   // Copy host vector to device
   thrust::device_vector<col_type> device_vector(host_vector);

  //gdf_error gdf_multi_left_join_generic(int num_cols, gdf_column **leftcol, gdf_column **rightcol, gdf_join_result_type **out_result)
};

template<join_kind join_type, typename tuple_type>
struct TestParameters
{
  const static join_kind join_method{join_type};
  using multi_column_t = tuple_type;
};


    // Multimap used to compute the reference solution
    std::multimap<key_type, value_type> the_map;

    // Build hash table that maps the first right columns' values to their row index in the column
    std::vector<key_type> const & build_column = std::get<0>(right_columns);
    for(size_t right_index = 0; right_index < build_column.size(); ++right_index)
    {
      the_map.insert(std::make_pair(build_column[right_index], right_index));
