// to be replaced by boost::span
#include <array>
-#include <boost/assert.hpp>
-#include <boost/histogram/detail/non_member_container_access.hpp>
+#include <boost/histogram/detail/nonmember_container_access.hpp>
+#include <cassert>
#include <initializer_list>
#include <iterator>
#include <type_traits>
constexpr std::size_t size() const noexcept { return N; }
protected:
- constexpr span_base(T* b, std::size_t s) noexcept : begin_(b) { BOOST_ASSERT(N == s); }
+ constexpr span_base(T* b, std::size_t s) noexcept : begin_(b) {
+ (void)s;
+ assert(N == s);
+ }
constexpr void set(T* b, std::size_t s) noexcept {
+ (void)s;
begin_ = b;
- BOOST_ASSERT(N == s);
+ assert(N == s);
}
private:
template <class T>
class span_base<T, dynamic_extent> {
public:
+ constexpr span_base() noexcept : begin_(nullptr), size_(0) {}
+
constexpr T* data() noexcept { return begin_; }
constexpr const T* data() const noexcept { return begin_; }
constexpr std::size_t size() const noexcept { return size_; }
protected:
constexpr span_base(T* b, std::size_t s) noexcept : begin_(b), size_(s) {}
-
constexpr void set(T* b, std::size_t s) noexcept {
begin_ = b;
size_ = s;
static constexpr std::size_t extent = Extent;
- template <std::size_t _ = extent,
- class = std::enable_if_t<(_ == 0 || _ == dynamic_extent)> >
- constexpr span() noexcept : base(nullptr, 0) {}
+ using base::base;
constexpr span(pointer first, pointer last)
: span(first, static_cast<std::size_t>(last - first)) {
- BOOST_ASSERT(extent == dynamic_extent ||
- static_cast<difference_type>(extent) == (last - first));
+ assert(extent == dynamic_extent ||
+ static_cast<difference_type>(extent) == (last - first));
}
constexpr span(pointer ptr, index_type count) : base(ptr, count) {}
: span(dtl::data(arr), N) {}
template <class Container, class = std::enable_if_t<std::is_convertible<
- decltype(dtl::size(std::declval<Container>()),
- dtl::data(std::declval<Container>())),
+ decltype(dtl::size(std::declval<const Container&>()),
+ dtl::data(std::declval<const Container&>())),
pointer>::value> >
constexpr span(const Container& cont) : span(dtl::data(cont), dtl::size(cont)) {}
template <class Container, class = std::enable_if_t<std::is_convertible<
- decltype(dtl::size(std::declval<Container>()),
- dtl::data(std::declval<Container>())),
+ decltype(dtl::size(std::declval<Container&>()),
+ dtl::data(std::declval<Container&>())),
pointer>::value> >
constexpr span(Container& cont) : span(dtl::data(cont), dtl::size(cont)) {}
const_reverse_iterator rend() const { return reverse_iterator(begin()); }
const_reverse_iterator crend() { return reverse_iterator(begin()); }
- constexpr reference front() { *base::data(); }
- constexpr reference back() { *(base::data() + base::size() - 1); }
+ constexpr reference front() { return *base::data(); }
+ constexpr reference back() { return *(base::data() + base::size() - 1); }
constexpr reference operator[](index_type idx) const { return base::data()[idx]; }
template <std::size_t Count>
constexpr span<element_type, Count> first() const {
- BOOST_ASSERT(Count <= base::size());
+ assert(Count <= base::size());
return span<element_type, Count>(base::data(), Count);
}
constexpr span<element_type, dynamic_extent> first(std::size_t count) const {
- BOOST_ASSERT(count <= base::size());
+ assert(count <= base::size());
return span<element_type, dynamic_extent>(base::data(), count);
}
template <std::size_t Count>
constexpr span<element_type, Count> last() const {
- BOOST_ASSERT(Count <= base::size());
+ assert(Count <= base::size());
return span<element_type, Count>(base::data() + base::size() - Count, Count);
}
constexpr span<element_type, dynamic_extent> last(std::size_t count) const {
- BOOST_ASSERT(count <= base::size());
+ assert(count <= base::size());
return span<element_type, dynamic_extent>(base::data() + base::size() - count, count);
}
? Count
: (extent != dynamic_extent ? extent - Offset : dynamic_extent))>
subspan() const {
- BOOST_ASSERT(Offset <= base::size());
+ assert(Offset <= base::size());
constexpr std::size_t E =
(Count != dynamic_extent
? Count
: (extent != dynamic_extent ? extent - Offset : dynamic_extent));
- BOOST_ASSERT(E == dynamic_extent || E <= base::size());
+ assert(E == dynamic_extent || E <= base::size());
return span<element_type, E>(base::data() + Offset,
Count == dynamic_extent ? base::size() - Offset : Count);
}
constexpr span<element_type, dynamic_extent> subspan(
std::size_t offset, std::size_t count = dynamic_extent) const {
- BOOST_ASSERT(offset <= base::size());
+ assert(offset <= base::size());
const std::size_t s = count == dynamic_extent ? base::size() - offset : count;
- BOOST_ASSERT(s <= base::size());
+ assert(s <= base::size());
return span<element_type, dynamic_extent>(base::data() + offset, s);
}
};
#endif
-#include <boost/histogram/detail/non_member_container_access.hpp>
+#include <boost/histogram/detail/nonmember_container_access.hpp>
#include <utility>
namespace boost {