mirror of
https://github.com/PurpleI2P/Boost-for-Android-Prebuilt
synced 2025-01-10 14:57:52 +00:00
49 lines
1.5 KiB
C++
49 lines
1.5 KiB
C++
// Copyright 2015-2018 Hans Dembinski
|
|
//
|
|
// Distributed under the Boost Software License, Version 1.0.
|
|
// (See accompanying file LICENSE_1_0.txt
|
|
// or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
#ifndef BOOST_HISTOGRAM_DETAIL_AT_HPP
|
|
#define BOOST_HISTOGRAM_DETAIL_AT_HPP
|
|
|
|
#include <boost/histogram/axis/option.hpp>
|
|
#include <boost/histogram/axis/traits.hpp>
|
|
#include <boost/histogram/detail/axes.hpp>
|
|
#include <boost/histogram/detail/linearize.hpp>
|
|
#include <boost/histogram/fwd.hpp>
|
|
#include <boost/mp11/algorithm.hpp>
|
|
#include <tuple>
|
|
|
|
namespace boost {
|
|
namespace histogram {
|
|
namespace detail {
|
|
|
|
template <class A, class... Us>
|
|
optional_index at(const A& axes, const std::tuple<Us...>& args) noexcept {
|
|
optional_index idx{0}; // offset not used by linearize_index
|
|
mp11::mp_for_each<mp11::mp_iota_c<sizeof...(Us)>>(
|
|
[&, stride = static_cast<std::size_t>(1)](auto i) mutable {
|
|
stride *= linearize_index(idx, stride, axis_get<i>(axes),
|
|
static_cast<axis::index_type>(std::get<i>(args)));
|
|
});
|
|
return idx;
|
|
}
|
|
|
|
template <class A, class U>
|
|
optional_index at(const A& axes, const U& args) noexcept {
|
|
optional_index idx{0};
|
|
using std::begin;
|
|
for_each_axis(axes, [&, it = begin(args),
|
|
stride = static_cast<std::size_t>(1)](const auto& a) mutable {
|
|
stride *= linearize_index(idx, stride, a, static_cast<axis::index_type>(*it++));
|
|
});
|
|
return idx;
|
|
}
|
|
|
|
} // namespace detail
|
|
} // namespace histogram
|
|
} // namespace boost
|
|
|
|
#endif
|