diff --git a/include/ircd/vector_view.h b/include/ircd/vector_view.h index e6dfafaea..fabe4694c 100644 --- a/include/ircd/vector_view.h +++ b/include/ircd/vector_view.h @@ -15,9 +15,9 @@ namespace ircd { template struct vector_view; - template bool empty(const vector_view &); - template size_t size(const vector_view &); - template T *data(const vector_view &); + template bool empty(const vector_view &) noexcept; + template size_t size(const vector_view &) noexcept; + template T *data(const vector_view &) noexcept; } /// Template to represent a contiguous vector or array in a generic way. @@ -35,19 +35,19 @@ struct ircd::vector_view value_type *_stop { nullptr }; public: - value_type *data() const { return _data; } - size_t size() const { return std::distance(_data, _stop); } - bool empty() const { return !size(); } + value_type *data() const noexcept { return _data; } + size_t size() const noexcept { return std::distance(_data, _stop); } + bool empty() const noexcept { return !size(); } - const_iterator begin() const { return data(); } - const_iterator end() const { return _stop; } - const_iterator cbegin() { return data(); } - const_iterator cend() { return _stop; } - iterator begin() { return data(); } - iterator end() { return _stop; } + const_iterator begin() const noexcept { return data(); } + const_iterator end() const noexcept { return _stop; } + const_iterator cbegin() noexcept { return data(); } + const_iterator cend() noexcept { return _stop; } + iterator begin() noexcept { return data(); } + iterator end() noexcept { return _stop; } // Bounds check in debug only. - value_type &operator[](const size_t &pos) const + value_type &operator[](const size_t &pos) const noexcept { assert(pos < size()); return *(data() + pos); @@ -76,71 +76,84 @@ struct ircd::vector_view } vector_view(value_type *const &start, value_type *const &stop) + noexcept :_data{start} ,_stop{stop} {} vector_view(value_type *const &start, const size_t &size) + noexcept :vector_view(start, start + size) {} vector_view(const std::initializer_list &list) + noexcept :vector_view(std::begin(list), std::end(list)) {} template vector_view(const std::vector &v) + noexcept :vector_view(v.data(), v.size()) {} template vector_view(std::vector &v) + noexcept :vector_view(v.data(), v.size()) {} template vector_view(value_type (&buffer)[SIZE]) + noexcept :vector_view(buffer, SIZE) {} template vector_view(const std::array &array) + noexcept :vector_view(const_cast(array.data()), array.size()) {} template vector_view(std::array &array) + noexcept :vector_view(array.data(), array.size()) {} // Required for reasonable implicit const conversion of value_type. vector_view(const vector_view::type> &v) + noexcept :vector_view(v.data(), v.size()) {} - vector_view() = default; + vector_view() noexcept = default; + vector_view &operator=(const vector_view &) noexcept = default; }; template -T * +inline T * ircd::data(const vector_view &v) +noexcept { return v.data(); } template -size_t +inline size_t ircd::size(const vector_view &v) +noexcept { return v.size(); } template -bool +inline bool ircd::empty(const vector_view &v) +noexcept { return v.empty(); }