   using col2_type = T2;
 };
 
+// Wrapper class for a gdf_column
+template <typename col_type>
+struct gdf_column_wrapper : gdf_column
+{
+  thrust::device_vector<col_type> device_vector;
+
+  gdf_column_wrapper(size_t column_size, size_t column_range=RAND_MAX)
+  {
+    // Generate random vector on host and copy it to device
+    std::vector<col_type> host_vector;
+    std::generate(host_vector.begin(), host_vector.end(), [column_range](){return std::rand() % column_range;});
+    device_vector(host_vector);
+
+    // Deduce the type and set the gdf_dtype accordingly
+    gdf_dtype gdf_col_type;
+    if(std::is_same<col_type,int8_t>::value) gdf_col_type = GDF_INT8;
+    else if(std::is_same<col_type,uint8_t>::value) gdf_col_type = GDF_INT8;
+    else if(std::is_same<col_type,int16_t>::value) gdf_col_type = GDF_INT16;
+    else if(std::is_same<col_type,uint16_t>::value) gdf_col_type = GDF_INT16;
+    else if(std::is_same<col_type,int32_t>::value) gdf_col_type = GDF_INT32;
+    else if(std::is_same<col_type,uint32_t>::value) gdf_col_type = GDF_INT32;
+    else if(std::is_same<col_type,int64_t>::value) gdf_col_type = GDF_INT64;
+    else if(std::is_same<col_type,uint64_t>::value) gdf_col_type = GDF_INT64;
+    else if(std::is_same<col_type,float>::value) gdf_col_type = GDF_FLOAT32;
+    else if(std::is_same<col_type,double>::value) gdf_col_type = GDF_FLOAT64;
+
+    // Fill the base gdf_column structure
+    this->data = device_vector.data().get();
+    this->valid = nullptr;
+    this->size = device_vector.size();
+    this->dtype = gdf_col_type;
+    gdf_dtype_extra_info extra_info;
+    extra_info.time_unit = TIME_UNIT_NONE;
+    this->dtype_info = extra_info;
+  }
+
+  ~gdf_column_wrapper()
+  {
+
+  }
+};
+
 // A new instance of this class will be created for each *TEST(JoinTest, ...)
 // Put all repeated setup and validation stuff here
 template <class T>
 struct JoinTest : public testing::Test
 {
-
 protected:
 
   // Extract the types for the input columns 

  using key_type = col0_type;
  using value_type = size_t;

  std::multimap<key_type, value_type> the_map;

  JoinTest()
  {

  }

};

#include <iostream>
#include <vector>
#include <map>
#include <type_traits>

#include <thrust/device_vector.h>
#include <thrust/sort.h>
