 // to nest multiple types inside of the KeyValueTypes struct above
 // KeyValueTypes<type1, type2> implies key_type = type1, value_type = type2
 // This list is the types across which Google Test will run our tests
-typedef ::testing::Types< KeyValueTypes<int,int>
-                         // KeyValueTypes<int,float>,
-                         // KeyValueTypes<int,double>,
-                         // KeyValueTypes<int,long long int>,
-                         // KeyValueTypes<int,unsigned long long int>,
-                         // KeyValueTypes<unsigned long long int, int>,
-                         // KeyValueTypes<unsigned long long int, float>,
-                         // KeyValueTypes<unsigned long long int, double>,
-                         // KeyValueTypes<unsigned long long int, long long int>,
-                         // KeyValueTypes<unsigned long long int, unsigned long long int>
+typedef ::testing::Types< KeyValueTypes<int,int,max_op<int>>,
+                          KeyValueTypes<int,float,max_op<int>>,
+                          KeyValueTypes<int,double,max_op<int>>,
+                          KeyValueTypes<int,long long int,max_op<int>>,
+                          KeyValueTypes<int,unsigned long long int,max_op<int>>,
+                          KeyValueTypes<unsigned long long int, int,max_op<int>>,
+                          KeyValueTypes<unsigned long long int, float,max_op<int>>,
+                          KeyValueTypes<unsigned long long int, double,max_op<int>>,
+                          KeyValueTypes<unsigned long long int, long long int,max_op<int>>,
+                          KeyValueTypes<unsigned long long int, unsigned long long int,max_op<int>>,
+                          KeyValueTypes<int,int,min_op<int>>,
+                          KeyValueTypes<int,float,min_op<int>>,
+                          KeyValueTypes<int,double,min_op<int>>,
+                          KeyValueTypes<int,long long int,min_op<int>>,
+                          KeyValueTypes<int,unsigned long long int,min_op<int>>,
+                          KeyValueTypes<unsigned long long int, int,min_op<int>>,
+                          KeyValueTypes<unsigned long long int, float,min_op<int>>,
+                          KeyValueTypes<unsigned long long int, double,min_op<int>>,
+                          KeyValueTypes<unsigned long long int, long long int,min_op<int>>,
+                          KeyValueTypes<unsigned long long int, unsigned long long int,min_op<int>>
                           > Implementations;
 
 TYPED_TEST_CASE(MapTest, Implementations);

  EXPECT_EQ(begin->second, this->unused_value);
}

TYPED_TEST(MapTest, Insert)
{
  using key_type = typename TypeParam::key_type;



// This is necessary to do a parametrized typed-test over multiple template arguments
template <typename Key, typename Value, typename Aggregation_Operator>
struct KeyValueTypes
{
  using key_type = Key;
  using value_type = Value;
  using op_type = Aggregation_Operator;
};

// Have to use a functor instead of a device lambda because
