alternative version to use the boost parameter API

This commit is contained in:
Sébastien Loriot 2022-06-04 13:52:13 +02:00
parent 18039c7a71
commit 111d33bfd2
4 changed files with 83 additions and 59 deletions

View File

@ -78,15 +78,6 @@ BOOST_PARAMETER_NAME( domain )
BOOST_PARAMETER_NAME( criteria )
BOOST_PARAMETER_NAME( cdt )
BOOST_PARAMETER_NAME( (seeds_begin, tag) seeds_begin_)
BOOST_PARAMETER_NAME( (seeds_end, tag) seeds_end_)
BOOST_PARAMETER_NAME( (mark, tag) mark_)
BOOST_PARAMETER_NAME( (time_limit, tag) time_limit_ )
BOOST_PARAMETER_NAME( (convergence, tag) convergence_)
BOOST_PARAMETER_NAME( (max_iteration_number, tag) max_iteration_number_ )
BOOST_PARAMETER_NAME( (freeze_bound, tag) freeze_bound_)
BOOST_PARAMETER_NAME( (sliver_bound, tag) sliver_bound_)
BOOST_PARAMETER_NAME( (sliver_criterion, tag) sliver_criterion_)
BOOST_PARAMETER_NAME( (perturbation_vector, tag) perturbation_vector_)

View File

@ -22,20 +22,11 @@
#include <CGAL/Mesh_2/Mesh_sizing_field.h>
#include <CGAL/Mesh_optimization_return_code.h>
#include <CGAL/iterator.h>
#include <CGAL/boost/parameter.h>
#include <boost/parameter/preprocessor.hpp>
#include <CGAL/Named_function_parameters.h>
#include <fstream>
#ifndef DOXYGEN_RUNNING
// see <CGAL/config.h>
CGAL_PRAGMA_DIAG_PUSH
// see <CGAL/boost/parameter.h>
CGAL_IGNORE_BOOST_PARAMETER_NAME_WARNINGS
#endif
namespace CGAL
{
@ -98,7 +89,7 @@ namespace CGAL
* \cgalParamDefault{0}
* \cgalParamNEnd
*
* \cgalParamNBegin{freeze_bound}
* \cgalParamNBegin{vertex_freeze_bound}
* \cgalParamDescription{designed to reduce running time of each optimization iteration.
* Any vertex that has a displacement less than a given fraction of the length
* of its shortest incident edge, is frozen (i.e.\ is not relocated).
@ -132,6 +123,7 @@ lloyd_optimize_mesh_2(CDT& cdt, const CGAL_NP_CLASS& np = parameters::default_va
using parameters::choose_parameter;
using parameters::get_parameter;
using parameters::get_parameter_reference;
using parameters::is_default_parameter;
int max_iterations = choose_parameter(get_parameter(np, internal_np::number_of_iterations), 0);
const double convergence_ratio = choose_parameter(get_parameter(np, internal_np::convergence_ratio), 0.001);
@ -148,47 +140,40 @@ lloyd_optimize_mesh_2(CDT& cdt, const CGAL_NP_CLASS& np = parameters::default_va
// }
const bool mark = choose_parameter(get_parameter(np, internal_np::seeds_are_in_domain), false);
return lloyd_optimize_mesh_2_impl(cdt,
max_iterations,
convergence_ratio,
freeze_bound,
time_limit,
seeds.begin(),
seeds.end(),
mark);
if (is_default_parameter<CGAL_NP_CLASS,internal_np::i_seed_begin_iterator_t>::value ||
is_default_parameter<CGAL_NP_CLASS,internal_np::i_seed_end_iterator_t>::value)
{
return lloyd_optimize_mesh_2_impl(cdt,
max_iterations,
convergence_ratio,
freeze_bound,
time_limit,
seeds.begin(),
seeds.end(),
mark);
}
else
{
return lloyd_optimize_mesh_2_impl(cdt,
max_iterations,
convergence_ratio,
freeze_bound,
time_limit,
choose_parameter(get_parameter(np, internal_np::i_seed_begin_iterator), CGAL::Emptyset_iterator()),
choose_parameter(get_parameter(np, internal_np::i_seed_end_iterator), CGAL::Emptyset_iterator()),
mark);
}
}
#ifndef DOXYGEN_RUNNING
#ifndef CGAL_NO_DEPRECATED_CODE
#if defined(BOOST_MSVC)
# pragma warning(push)
# pragma warning(disable:4003) // not enough actual parameters for macro
#endif
// TODO: check how to use CGAL_DEPRECATED here
BOOST_PARAMETER_FUNCTION(
(Mesh_optimization_return_code),
lloyd_optimize_mesh_2,
parameters::tag,
(required (in_out(cdt),*))
(optional
(max_iteration_number_, *, 0 )
(convergence_, *, 0.001 )
(time_limit_, *, 0. )
(freeze_bound_, *, 0.001 )
(seeds_begin_, *, CGAL::Emptyset_iterator())//see comments below
(seeds_end_, *, CGAL::Emptyset_iterator())//see comments below
(mark_, *, false) //if "false", seeds indicate "outside" regions
)
)
template<typename CDT, typename ... NP_PACK>
CGAL_DEPRECATED
Mesh_optimization_return_code
lloyd_optimize_mesh_2(CDT& cdt, const NP_PACK& ... nps)
{
return lloyd_optimize_mesh_2_impl(cdt,
max_iteration_number_,
convergence_,
freeze_bound_,
time_limit_,
seeds_begin_,
seeds_end_,
mark_);
return lloyd_optimize_mesh_2(cdt, internal_np::combine_named_parameters(nps ...));
}
#if defined(BOOST_MSVC)
@ -266,9 +251,6 @@ lloyd_optimize_mesh_2(CDT& cdt, const CGAL_NP_CLASS& np = parameters::default_va
return rc;
}
CGAL_PRAGMA_DIAG_POP
#include <CGAL/enable_warnings.h>
#else
namespace CGAL {

View File

@ -258,6 +258,20 @@ struct Named_function_parameters
}
#include <CGAL/STL_Extension/internal/parameters_interface.h>
#undef CGAL_add_named_parameter
template <typename OT, typename OTag>
Named_function_parameters<OT, OTag, self>
combine(const Named_function_parameters<OT,OTag>& np) const
{
return Named_function_parameters<OT, OTag, self>(np.v,*this);
}
template <typename OT, typename OTag, typename ... NPS>
auto
combine(const Named_function_parameters<OT,OTag>& np, const NPS& ... nps) const
{
return Named_function_parameters<OT, OTag, self>(np.v,*this).combine(nps...);
}
};
namespace parameters {
@ -295,9 +309,33 @@ inline no_parameters(Named_function_parameters<T,Tag,Base>)
typedef Named_function_parameters<K, internal_np::X> Params;\
return Params(p); \
}
#include <CGAL/STL_Extension/internal/parameters_interface.h>
#undef CGAL_add_named_parameter
#ifndef CGAL_NO_DEPRECATED_CODE
template <class Tag>
struct Boost_parameter_compatibility_wrapper
{
template <typename K>
Named_function_parameters<K, Tag>
operator=(const K& p) const
{
typedef Named_function_parameters<K, Tag> Params;
return Params(p);
}
};
// TODO: need to make sure this works when using several compilation units
const Boost_parameter_compatibility_wrapper<internal_np::number_of_iterations_t> max_iteration_number;
const Boost_parameter_compatibility_wrapper<internal_np::convergence_ratio_t> convergence;
const Boost_parameter_compatibility_wrapper<internal_np::vertex_freeze_bound_t> freeze_bound;
const Boost_parameter_compatibility_wrapper<internal_np::maximum_running_time_t> time_limit;
const Boost_parameter_compatibility_wrapper<internal_np::i_seed_begin_iterator_t> seeds_begin;
const Boost_parameter_compatibility_wrapper<internal_np::i_seed_end_iterator_t> seeds_end;
const Boost_parameter_compatibility_wrapper<internal_np::seeds_are_in_domain_t> mark_;
#endif
// function to extract a parameter
template <typename T, typename Tag, typename Base, typename Query_tag>
typename internal_np::Get_param<internal_np::Named_params_impl<T, Tag, Base>, Query_tag>::type
@ -373,6 +411,17 @@ struct is_default_parameter
} // end of parameters namespace
namespace internal_np {
template <typename Tag, typename K, typename ... NPS>
auto
combine_named_parameters(const Named_function_parameters<K, Tag>& np, const NPS& ... nps)
{
return np.combine(nps ...);
}
} // end of internal_np namespace
#ifndef CGAL_NO_DEPRECATED_CODE
namespace Polygon_mesh_processing {

View File

@ -245,4 +245,6 @@ CGAL_add_named_parameter(domain_is_initialized_t, domain_is_initialized, domain_
CGAL_add_named_parameter(seeds_are_in_domain_t, seeds_are_in_domain, seeds_are_in_domain)
CGAL_add_named_parameter(criteria_t, criteria, criteria)
CGAL_add_named_parameter(convergence_ratio_t, convergence_ratio, convergence_ratio)
// CGAL_add_named_parameter(freeze_bound_t, freeze_bound, freeze_bound)
CGAL_add_named_parameter(vertex_freeze_bound_t, vertex_freeze_bound, vertex_freeze_bound)
CGAL_add_named_parameter(i_seed_begin_iterator_t, i_seed_begin_iterator, i_seed_begin_iterator)
CGAL_add_named_parameter(i_seed_end_iterator_t, i_seed_end_iterator, i_seed_end_iterator)