1 // Copyright 2019 Hans Dembinski
3 // Distributed under the Boost Software License, Version 1.0.
4 // (See accompanying file LICENSE_1_0.txt
5 // or copy at http://www.boost.org/LICENSE_1_0.txt)
7 #ifndef BOOST_HISTOGRAM_DETAIL_OPTIONAL_INDEX_HPP
8 #define BOOST_HISTOGRAM_DETAIL_OPTIONAL_INDEX_HPP
10 #include <boost/assert.hpp>
17 constexpr auto invalid_index = ~static_cast<std::size_t>(0);
19 // integer with a persistent invalid state, similar to NaN
20 struct optional_index {
23 optional_index& operator=(std::size_t x) noexcept {
28 optional_index& operator+=(std::intptr_t x) noexcept {
29 BOOST_ASSERT(x >= 0 || static_cast<std::size_t>(-x) <= value);
30 if (value != invalid_index) { value += x; }
34 optional_index& operator+=(const optional_index& x) noexcept {
35 if (value != invalid_index) return operator+=(x.value);
36 value = invalid_index;
40 operator std::size_t() const noexcept { return value; }
42 friend bool operator<=(std::size_t x, optional_index idx) noexcept {
43 return x <= idx.value;
47 constexpr inline bool is_valid(const std::size_t) noexcept { return true; }
49 inline bool is_valid(const optional_index x) noexcept { return x.value != invalid_index; }
52 } // namespace histogram