63   T operator()(
const T& _t)
 const { 
return _t; }
 
   68 template <
typename RangeT, 
typename HandleT, 
typename Functor>
 
   69 struct FilteredSmartRangeT;
 
   72 template <
typename RangeT, 
typename HandleT>
 
   75   using Handle = HandleT;
 
   87   template <
typename Functor>
 
   88   auto sum(Functor&& f) -> 
typename std::decay<decltype (f(std::declval<HandleT>()))>::type
 
   90     auto range = 
static_cast<const RangeT*
>(
this);
 
   91     auto begin = range->begin();
 
   92     auto end   = range->end();
 
   94     typename std::decay<decltype (f(*begin))>::type result = f(*begin);
 
   97     for (; it != end; ++it)
 
  108   template <
typename Functor>
 
  109   auto avg(Functor&& f) -> 
typename std::decay<decltype (f(std::declval<HandleT>()))>::type
 
  111     auto range = 
static_cast<const RangeT*
>(
this);
 
  112     auto begin = range->begin();
 
  113     auto end   = range->end();
 
  114     assert(begin != end);
 
  115     typename std::decay<decltype (f(*begin))>::type result = f(*begin);
 
  119     for (; it != end; ++it)
 
  124     return (1.0 / n_elements) * result;
 
  134   template <
typename Functor, 
typename WeightFunctor>
 
  135   auto avg(Functor&& f, WeightFunctor&& w) -> 
typename std::decay<decltype ((1.0/(w(std::declval<HandleT>())+w(std::declval<HandleT>())))*f(std::declval<HandleT>()))>::type
 
  137     auto range = 
static_cast<const RangeT*
>(
this);
 
  138     auto begin = range->begin();
 
  139     auto end   = range->end();
 
  140     assert(begin != end);
 
  141     typename std::decay<decltype (w(*begin))>::type weight = w(*begin);
 
  142     typename std::decay<decltype (w(*begin)*f(*begin))>::type result = weight * f(*begin);
 
  143     typename std::decay<decltype (w(*begin)+w(*begin))>::type weight_sum = weight;
 
  146     for (; it != end; ++it)
 
  149       result += weight*f(*it);
 
  150       weight_sum += weight;
 
  152     return (1.0 / weight_sum) * result;
 
  162   template <
typename Functor>
 
  165     auto range = 
static_cast<const RangeT*
>(
this);
 
  166     for (
auto e : *range)
 
  179   template <
typename Functor>
 
  182     auto range = 
static_cast<const RangeT*
>(
this);
 
  183     for (
auto e : *range)
 
  198   template <
int n, 
typename Functor = Identity>
 
  199   auto to_array(Functor&& f = {}) -> std::array<
typename std::decay<decltype (f(std::declval<HandleT>()))>::type, n>
 
  201     auto range = 
static_cast<const RangeT*
>(
this);
 
  202     std::array<typename std::decay<decltype (f(std::declval<HandleT>()))>::type, n> res;
 
  203     auto it = range->begin();
 
  204     auto end = range->end();
 
  206     while (i < n && it != end)
 
  207       res[i++] = f(*(it++));
 
  218   template <
typename Functor = Identity>
 
  219   auto to_vector(Functor&& f = {}) -> std::vector<
typename std::decay<decltype (f(std::declval<HandleT>()))>::type>
 
  221     auto range = 
static_cast<const RangeT*
>(
this);
 
  222     std::vector<typename std::decay<decltype (f(std::declval<HandleT>()))>::type> res;
 
  223     for (
const auto& e : *range)
 
  235   template <
typename Functor = Identity>
 
  236   auto to_set(Functor&& f = {}) -> std::set<
typename std::decay<decltype (f(std::declval<HandleT>()))>::type>
 
  238     auto range = 
static_cast<const RangeT*
>(
this);
 
  239     std::set<typename std::decay<decltype (f(std::declval<HandleT>()))>::type> res;
 
  240     for (
const auto& e : *range)
 
  253   template <
typename Functor>
 
  254   auto first(Functor&& f = {}) -> HandleT
 
  256     auto range = 
static_cast<const RangeT*
>(
this);
 
  257     for (
const auto& e : *range)
 
  269   template <
typename Functor>
 
  270   auto min(Functor&& f) -> 
typename std::decay<decltype (f(std::declval<HandleT>()))>::type
 
  274     auto range = 
static_cast<const RangeT*
>(
this);
 
  275     auto it    = range->begin();
 
  276     auto end   = range->end();
 
  279     typename std::decay<decltype (f(std::declval<HandleT>()))>::type res = f(*it);
 
  282     for (; it != end; ++it)
 
  283       res = 
min(res, f(*it));
 
  294   template <
typename Functor>
 
  297     auto range = 
static_cast<const RangeT*
>(
this);
 
  298     auto it    = range->begin();
 
  300     auto end   = range->end();
 
  303     typename std::decay<decltype (f(std::declval<HandleT>()))>::type curr_min = f(*it);
 
  306     for (; it != end; ++it)
 
  325   template <
typename Functor>
 
  326   auto max(Functor&& f) -> 
typename std::decay<decltype (f(std::declval<HandleT>()))>::type
 
  330     auto range = 
static_cast<const RangeT*
>(
this);
 
  331     auto it    = range->begin();
 
  332     auto end   = range->end();
 
  335     typename std::decay<decltype (f(std::declval<HandleT>()))>::type res = f(*it);
 
  338     for (; it != end; ++it)
 
  339       res = 
max(res, f(*it));
 
  351   template <
typename Functor>
 
  354     auto range = 
static_cast<const RangeT*
>(
this);
 
  355     auto it    = range->begin();
 
  357     auto end   = range->end();
 
  360     typename std::decay<decltype (f(std::declval<HandleT>()))>::type curr_max = f(*it);
 
  363     for (; it != end; ++it)
 
  383   template <
typename Functor>
 
  384   auto minmax(Functor&& f) -> std::pair<typename std::decay<decltype (f(std::declval<HandleT>()))>::type,
 
  385                                         typename std::decay<decltype (f(std::declval<HandleT>()))>::type>
 
  387     return std::make_pair(this->
min(f), this->
max(f));
 
  397   template <
typename Functor>
 
  401     auto range = 
static_cast<const RangeT*
>(
this);
 
  402     for (
const auto& e : *range)
 
  415   template <
typename Functor>
 
  418     auto range = 
static_cast<const RangeT*
>(
this);
 
  419     for (
const auto& e : *range)
 
  430   template <
typename Functor>
 
  433     auto range = 
static_cast<const RangeT*
>(
this);
 
  440 template <
typename RangeT, 
typename HandleT, 
typename Functor>
 
  444   using BaseIterator = decltype((std::declval<typename RangeT::Range>().begin()));
 
  449     FilteredIterator(Functor f, BaseIterator it, BaseIterator end): BaseIterator(it), f_(f), end_(end)
 
  451       if (!BaseIterator::operator==(end_) && !f_(*(*
this))) 
 
  459       BaseIterator::operator=(other);
 
  466       if (BaseIterator::operator==(end_)) 
 
  471         BaseIterator::operator++();
 
  472       while (BaseIterator::operator!=(end_) && !f_(*(*
this)));
 
  481   FilteredSmartRangeT(Functor&& f, BaseIterator begin, BaseIterator end) : f_(std::forward<Functor>(f)), begin_(std::move(begin)), end_(std::move(end)){}
 
  482   FilteredIterator begin()
 const { 
return FilteredIterator(f_, begin_, end_); }
 
  483   FilteredIterator end()
   const { 
return FilteredIterator(f_, end_, end_); }
 
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition: MeshItems.hh:59
 
Class which applies a filter when iterating over elements.
Definition: SmartRange.hh:442
 
Base class for all smart range types.
Definition: SmartRange.hh:74
 
auto for_each(Functor &&f) -> void
Apply a functor to each element.
Definition: SmartRange.hh:416
 
auto to_set(Functor &&f={}) -> std::set< typename std::decay< decltype(f(std::declval< HandleT >()))>::type >
Convert range to set.
Definition: SmartRange.hh:236
 
auto sum(Functor &&f) -> typename std::decay< decltype(f(std::declval< HandleT >()))>::type
Computes the sum of elements.
Definition: SmartRange.hh:88
 
auto to_array(Functor &&f={}) -> std::array< typename std::decay< decltype(f(std::declval< HandleT >()))>::type, n >
Convert range to array.
Definition: SmartRange.hh:199
 
auto argmax(Functor &&f) -> HandleT
Compute maximal element.
Definition: SmartRange.hh:352
 
auto avg(Functor &&f) -> typename std::decay< decltype(f(std::declval< HandleT >()))>::type
Computes the average of elements.
Definition: SmartRange.hh:109
 
auto min(Functor &&f) -> typename std::decay< decltype(f(std::declval< HandleT >()))>::type
Compute minimum.
Definition: SmartRange.hh:270
 
auto minmax(Functor &&f) -> std::pair< typename std::decay< decltype(f(std::declval< HandleT >()))>::type, typename std::decay< decltype(f(std::declval< HandleT >()))>::type >
Computes minimum and maximum.
Definition: SmartRange.hh:384
 
auto any_of(Functor &&f) -> bool
Check if any element fulfils condition.
Definition: SmartRange.hh:163
 
auto first(Functor &&f={}) -> HandleT
Get the first element that fulfills a condition.
Definition: SmartRange.hh:254
 
auto all_of(Functor &&f) -> bool
Check if all elements fulfil condition.
Definition: SmartRange.hh:180
 
auto filtered(Functor &&f) -> FilteredSmartRangeT< SmartRange, Handle, Functor >
Only iterate over a subset of elements.
Definition: SmartRange.hh:431
 
auto to_vector(Functor &&f={}) -> std::vector< typename std::decay< decltype(f(std::declval< HandleT >()))>::type >
Convert range to vector.
Definition: SmartRange.hh:219
 
auto avg(Functor &&f, WeightFunctor &&w) -> typename std::decay< decltype((1.0/(w(std::declval< HandleT >())+w(std::declval< HandleT >()))) *f(std::declval< HandleT >()))>::type
Computes the weighted average of elements.
Definition: SmartRange.hh:135
 
auto argmin(Functor &&f) -> HandleT
Compute minimal element.
Definition: SmartRange.hh:295
 
auto max(Functor &&f) -> typename std::decay< decltype(f(std::declval< HandleT >()))>::type
Compute maximum.
Definition: SmartRange.hh:326
 
auto count_if(Functor &&f) -> int
Compute number of elements that satisfy a given predicate.
Definition: SmartRange.hh:398
 
Definition: SmartRange.hh:447