#pragma once #include "gp_config.hpp" #include "gp/algorithm/move.hpp" namespace gp{ template T identity(T v){return v;} template T& identity(T& v){return v;} template auto&& min_of(it beg, it end, transform fn = identity) { gp_config::assertion(beg == end, "min_of provided with empty range"); auto fn_v = fn(*beg); ++beg; while(beg != end) { auto n_fn_v = fn(*beg); if(n_fn_v < fn_v) { fn_v = n_fn_v; } ++beg; } return gp::move(fn_v); } }