#include #include #include #include namespace inp = CGAL::internal_np; namespace params = CGAL::parameters; template struct A { A(int v):v(v){} int v; }; struct B { B(){} B(const B&) = delete; }; template void check_same_type(T) { static const bool b = std::is_same< A, T >::value; static_assert(b); assert(b); } template void test_values_and_types(const NamedParameters& np) { using params::get_parameter; // test values assert(get_parameter(np, inp::vertex_index).v == 0); assert(get_parameter(np, inp::visitor).v == 1); // test types check_same_type<0>(get_parameter(np, inp::vertex_index)); check_same_type<1>(get_parameter(np, inp::visitor)); } template void test_no_copyable(const NamedParameters& np) { typedef typename inp::Get_param::type NP_type; static_assert(std::is_same >::value); const A<4>& a = params::choose_parameter(params::get_parameter_reference(np, inp::edge_index), A<4>(4)); assert(a.v==4); } template void test_references(const NamedParameters& np) { typedef A<2> Default_type; Default_type default_value(2); // std::reference_wrapper typedef typename inp::Lookup_named_param_def::reference Visitor_reference_type; static_assert(std::is_same::value); Visitor_reference_type vis_ref = params::choose_parameter(params::get_parameter_reference(np, inp::visitor), default_value); CGAL_USE(vis_ref); // std::reference_wrapper of const typedef typename inp::Lookup_named_param_def::reference FIM_reference_type; static_assert(std::is_same::value); FIM_reference_type fim_ref = params::choose_parameter(params::get_parameter_reference(np, inp::face_index), default_value); CGAL_USE(fim_ref); // non-copyable typedef typename inp::Lookup_named_param_def::reference VPM_reference_type; static_assert(std::is_same::value); VPM_reference_type vpm_ref = params::choose_parameter(params::get_parameter_reference(np, inp::vertex_point), default_value); CGAL_USE(vpm_ref); // passed by copy typedef typename inp::Lookup_named_param_def::reference VIM_reference_type; static_assert(std::is_same, VIM_reference_type>::value); VIM_reference_type vim_ref = params::choose_parameter(params::get_parameter_reference(np, inp::vertex_index), default_value); CGAL_USE(vim_ref); // default typedef typename inp::Lookup_named_param_def::reference EIM_reference_type; static_assert(std::is_same::value); EIM_reference_type eim_ref = params::choose_parameter(params::get_parameter_reference(np, inp::edge_index), default_value); assert(&eim_ref==&default_value); } int main() { test_values_and_types(params::vertex_index_map(A<0>(0)).visitor(A<1>(1))); B b; test_no_copyable(params::visitor(b)); test_references(params::visitor(std::ref(b)) .vertex_point_map(b) .vertex_index_map(A<0>(0)) .face_index_map(std::reference_wrapper(b)) ); auto d = CGAL::parameters::default_values(); static_assert(std::is_same::value); #ifndef CGAL_NO_DEPRECATED_CODE auto d1 = CGAL::parameters::all_default(); static_assert(std::is_same::value); auto d2 = CGAL::Polygon_mesh_processing::parameters::all_default(); static_assert(std::is_same::value); #endif return EXIT_SUCCESS; }