1#ifndef LSST_GAUSS2D_FIT_UTIL_H
2#define LSST_GAUSS2D_FIT_UTIL_H
12namespace lsst::gauss2d::fit {
22 const double diff_abs;
25 std::string str()
const {
28 ss <<
"isclose=" << isclose <<
" from diff=" << diff_abs <<
" <= margin=" << margin;
49 const T diff_abs = std::abs(a - b);
50 const T margin = atol + rtol * std::abs(b);
55template <
template <
typename...>
class Map,
class Key,
class Value>
56std::set<Key> map_keys(
const Map<Key, Value>& map) {
58 for (
const auto& it : map) {
59 result.insert(it.first);
64template <
template <
typename...>
class Map,
class Key,
class Value>
65std::set<std::reference_wrapper<const Key>> map_keys_ref_const(
66 const Map<std::reference_wrapper<const Key>, Value, std::less<const Key>>& map) {
67 std::set<std::reference_wrapper<const Key>> result;
68 for (
const auto& it : map) result.insert(it.first.get());
72template <
template <
typename...>
class Map,
class Key,
class Value>
73std::set<std::shared_ptr<const Value>> map_values_shared_ptr_const(
74 const Map<Key, std::shared_ptr<const Value>>& map) {
75 std::set<std::shared_ptr<const Value>> result;
76 for (
const auto& it : map) result.insert(it.second);
80template <
template <
typename...>
class Map,
class Key,
class Value>
81std::set<std::reference_wrapper<const Value>> map_values_ref_const(
82 const Map<Key, std::reference_wrapper<const Value>>& map) {
83 std::set<std::reference_wrapper<const Value>> result;
84 for (
const auto& it : map) result.insert(it.second);
92std::vector<T> nonconsecutive_unique(
const std::vector<T>& vec) {
94 std::vector<T> rval{};
95 rval.reserve(vec.size());
96 for (
const auto& elem : vec) {
97 auto result = set.insert(elem);
98 if (result.second) rval.push_back(elem);
117template <
template <
typename...>
class Container,
class Value>
118Container<Value> head_iter(
const Container<Value>& container,
size_t n) {
119 return Container<Value>(container.begin(), container.begin() + n);
122template <
template <
typename...>
class Container,
class Value>
123Container<Value> tail_iter(
const Container<Value>& container,
size_t n) {
124 return Container<Value>(container.end() - n, container.end());